Pertanyaan Apa arti 'nyata', 'pengguna' dan 'sys' dalam keluaran waktu (1)?


$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

Apa arti 'nyata', 'pengguna' dan 'sys' dalam output waktu?

Mana yang berarti ketika membandingkan aplikasi saya?


1341
2018-02-17 11:33


asal


Jawaban:


Real, User dan proses Sys statistik waktu

salah satu dari benda ini tidak seperti yang lain. Real mengacu pada waktu yang sebenarnya berlalu; Pengguna dan Sys merujuk ke waktu CPU yang digunakan hanya dengan proses.

  • Nyata adalah waktu jam dinding - waktu dari awal hingga akhir panggilan. Ini adalah semua waktu yang telah berlalu termasuk irisan waktu yang digunakan oleh proses lain dan waktu yang dihabiskan proses diblokir (misalnya jika menunggu I / O selesai).

  • Pengguna adalah jumlah waktu yang dihabiskan CPU dalam kode mode pengguna (di luar kernel) dalam proses. Ini hanya waktu CPU sebenarnya yang digunakan dalam menjalankan proses. Proses dan waktu lain yang dihabiskan proses yang diblokir tidak diperhitungkan dalam angka ini.

  • Sys adalah jumlah waktu CPU yang dihabiskan di kernel dalam proses. Ini berarti mengeksekusi waktu CPU yang dihabiskan dalam panggilan sistem di dalam kernel, dibandingkan dengan kode pustaka, yang masih berjalan di ruang pengguna. Seperti 'pengguna', ini hanya waktu CPU yang digunakan oleh proses. Lihat di bawah ini untuk penjelasan singkat tentang mode kernel (juga dikenal sebagai mode 'supervisor') dan mekanisme panggilan sistem.

User+Sys akan memberi tahu Anda berapa banyak waktu CPU sebenarnya yang digunakan proses Anda. Perhatikan bahwa ini di semua CPU, jadi jika proses memiliki beberapa utas (dan proses ini berjalan di komputer dengan lebih dari satu prosesor) itu berpotensi melebihi waktu jam dinding yang dilaporkan oleh Real (yang biasanya terjadi). Perhatikan bahwa dalam output, angka-angka ini termasuk User dan Sys waktu semua proses anak (dan keturunan mereka) juga ketika mereka bisa dikumpulkan, misalnya oleh wait(2) atau waitpid(2), meskipun sistem yang mendasari panggilan mengembalikan statistik untuk proses dan anak-anaknya secara terpisah.

Asal-usul statistik yang dilaporkan oleh time (1)

Statistik dilaporkan oleh time dikumpulkan dari berbagai panggilan sistem. 'Pengguna' dan 'Sys' berasal wait (2) atau times (2), tergantung pada sistem tertentu. 'Nyata' dihitung dari waktu mulai dan akhir yang dikumpulkan dari gettimeofday (2) panggilan. Tergantung pada versi sistem, berbagai statistik lain seperti jumlah sakelar konteks juga dapat dikumpulkan oleh time.

Pada mesin multi-prosesor, proses multi-threaded atau proses forkinging anak-anak dapat memiliki waktu yang telah berlalu lebih kecil dari total waktu CPU - sebagai benang yang berbeda atau proses dapat berjalan secara paralel. Juga, statistik waktu yang dilaporkan berasal dari asal-usul yang berbeda, sehingga waktu yang direkam untuk tugas-tugas yang sangat singkat dapat dikenai kesalahan pembulatan, seperti contoh yang diberikan oleh poster asli.

Primer singkat pada mode Kernel vs. User 

Pada Unix, atau sistem operasi memori yang dilindungi, 'Kernel' atau 'Pengawas' mode mengacu pada a mode istimewa bahwa CPU dapat beroperasi. Tindakan istimewa tertentu yang dapat mempengaruhi keamanan atau stabilitas hanya dapat dilakukan ketika CPU beroperasi dalam mode ini; tindakan ini tidak tersedia untuk kode aplikasi. Contoh tindakan semacam itu mungkin manipulasi MMU untuk mendapatkan akses ke ruang alamat dari proses lain. Biasanya, mode pengguna kode tidak dapat melakukan ini (dengan alasan yang bagus), meskipun itu dapat meminta Berbagi memori dari kernel, yang mana bisa dibaca atau ditulis oleh lebih dari satu proses. Dalam hal ini, memori bersama diminta secara eksplisit dari kernel melalui mekanisme aman dan kedua proses harus dilekatkan secara eksplisit untuk menggunakannya.

Mode privileged biasanya disebut sebagai 'kernel' mode karena kernel dijalankan oleh CPU yang berjalan dalam mode ini. Untuk beralih ke mode kernel, Anda harus mengeluarkan instruksi khusus (sering disebut a perangkap) yang mengubah CPU untuk berjalan dalam mode kernel dan menjalankan kode dari lokasi tertentu yang diadakan di meja lompatan.  Untuk alasan keamanan, Anda tidak dapat beralih ke mode kernel dan mengeksekusi kode arbitrer - perangkap dikelola melalui tabel alamat yang tidak dapat ditulis kecuali CPU berjalan dalam mode supervisor. Anda menjebak dengan nomor perangkap eksplisit dan alamat tersebut dicari di tabel lompat; kernel memiliki jumlah titik masuk terkontrol yang terbatas.

Panggilan 'sistem' dalam pustaka C (terutama yang dijelaskan di Bagian 2 halaman manual) memiliki komponen mode pengguna, yang sebenarnya Anda sebut dari program C Anda. Di belakang layar, mereka dapat mengeluarkan satu atau lebih sistem panggilan ke kernel untuk melakukan layanan tertentu seperti I / O, tetapi mereka masih memiliki kode yang berjalan dalam mode pengguna. Hal ini juga sangat mungkin untuk langsung mengeluarkan jebakan ke mode kernel dari kode ruang pengguna mana pun jika diinginkan, meskipun Anda mungkin perlu menulis potongan bahasa assembly untuk mengatur register dengan benar untuk panggilan tersebut. Halaman yang menjelaskan panggilan sistem yang disediakan oleh kernel Linux dan konvensi untuk pengaturan register dapat ditemukan sini.

Lebih lanjut tentang 'sys' 

Ada hal-hal yang tidak dapat dilakukan kode Anda dari mode pengguna - hal-hal seperti mengalokasikan memori atau mengakses perangkat keras (HDD, jaringan, dll.). Ini berada di bawah pengawasan kernel, dan itu sendiri dapat melakukannya. Beberapa operasi yang Anda lakukan (suka malloc ataufread/fwrite) akan memanggil fungsi-fungsi Kernel ini dan yang kemudian akan dihitung sebagai 'sys' time. Sayangnya itu tidak sesederhana "setiap panggilan ke malloc akan dihitung dalam 'sys' waktu". Panggilan ke malloc akan melakukan pemrosesan sendiri (masih dihitung dalam waktu 'pengguna') dan kemudian suatu tempat di sepanjang jalan itu dapat memanggil fungsi di kernel (dihitung dalam waktu 'sys'). Setelah kembali dari panggilan kernel, akan ada lebih banyak waktu di 'pengguna' dan kemudian malloc akan kembali ke kode Anda. Adapun ketika saklar terjadi, dan berapa banyak yang dihabiskan dalam mode kernel ... Anda tidak bisa mengatakannya. Itu tergantung pada implementasi perpustakaan. Juga, fungsi lain yang tampaknya tidak bersalah mungkin juga digunakan malloc dan sejenisnya di latar belakang, yang akan kembali memiliki waktu di 'sys' kemudian.


1608
2018-04-29 05:29



Untuk memperluas jawaban yang diterima, Saya hanya ingin memberikan alasan lain mengapa real ≠ user + sys.

Ingat itu real mewakili waktu yang sebenarnya berlalu, sementara user dan sys nilai mewakili waktu eksekusi CPU. Akibatnya, pada sistem multicore, user dan / atau sys waktu (dan juga jumlah mereka) dapat benar-benar melebihi waktu nyata. Misalnya, pada aplikasi Java yang saya jalankan untuk kelas, saya mendapatkan kumpulan nilai ini:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

213
2017-11-05 04:34



Real menunjukkan total waktu putar-balik untuk suatu proses; sementara Pengguna menunjukkan waktu eksekusi untuk instruksi yang ditentukan pengguna dan Sys adalah waktu untuk menjalankan panggilan sistem!

Waktu nyata termasuk waktu tunggu juga (waktu tunggu untuk I / O dll.)


14
2017-11-24 19:05



nyata: Waktu aktual yang dihabiskan dalam menjalankan proses dari awal hingga akhir, seolah-olah diukur oleh manusia dengan stopwatch

pengguna: Waktu kumulatif yang dihabiskan oleh semua CPU selama perhitungan

sys: Waktu kumulatif yang dihabiskan oleh semua CPU selama tugas yang berhubungan dengan sistem seperti alokasi memori.

Perhatikan bahwa terkadang pengguna + sys mungkin lebih besar dari nyata, seperti   beberapa prosesor dapat berfungsi secara paralel.


6