Apakah jumlah semua PID "utime" total sistem utime?

9

Untuk mengukur total waktu CPU pengguna, saya menggunakan bidang "utime" dari /proc/[pid]/stat:

utime %lu   Amount of time that this process has been scheduled in user
            mode, measured in clock ticks (divide by
            sysconf(_SC_CLK_TCK).  This includes guest time, guest_time
            (time spent running a virtual CPU, see below), so that
            applications that are not aware of the guest time field do
            not lose that time from their calculations.

(dari man proc (5) )

Jadi, "utime pengguna" saya adalah jumlah utimedari semua PID yang dijalankan oleh pengguna ini.

Saya berharap ini akan memberi saya nilai akurat untuk jumlah detik CPU yang telah dihabiskan pengguna ini. Apakah saya di jalur yang benar?

Beberapa hal yang belum saya mengerti atau perhitungkan:

  • Setiap PID juga memiliki PID induk (atau nol). Tapi saya menghitung setiap PID, bukan hanya yang dengan ppid 0. Apakah ini benar?
  • Ada, selain utime, stime, cutime dan cstime. Apakah saya perlu khawatir tentang itu? Saya berasumsi bahwa utime adalah jumlah total cpu detik untuk PID, tidak termasuk induknya.

Jika saya menghitung total waktu cpu sistem menggunakan /proc/uptime, nilai ini cukup dekat dengan jumlah saya untuk semua pengguna, tetapi perbedaannya signifikan. Misalnya (dalam menit):

system cpu_time:         96.13
sum of users_cputime:   111.45

Koreksi:

Saya mendapatkan nilai-nilai yang "masuk akal" untuk semua hal. Saat ini saya menggunakan jumlah utime, stime, cutime dan cstime. Dan itu melaporkan nilai yang, meskipun saya tidak mengerti, berkorelasi sangat baik dengan pengukuran dari time.

Jika saya benar-benar di jalur yang salah, ada pertanyaan lain:

Stefano Palazzo
sumber
/proc/cputimetidak memiliki informasi tentang waktu yang dihabiskan oleh proses pelaksanaan CPU, jadi saya bingung apa perhitungan "cpu_time sistem" Anda. Jika Anda melakukan sesuatu dengan nomor kedua, itu adalah waktu yang dihabiskan oleh tugas idle ; Saya tidak tahu persis apa artinya itu dalam praktik.
Gilles 'SO- stop being evil'
1
"Waktu pengguna" Anda harus menambahkan nilai utime dari semua proses mati juga. Bagaimana Anda memperhitungkannya?
Gilles 'SO- stop being evil'
Mhh. Apa yang saya sebut "waktu sistem cpu" hanyalah nilai pertama dari / proc / uptime, "sistem detik". Saya akan berpikir ini terlalu tinggi, karena ia juga menghitung utas kernel, tetapi karena Anda dapat melihat jumlah semua nilai "utime" masih lebih tinggi daripada waktu sistem dari / proc / utime. Tautan Anda, sejauh yang saya tahu, menjelaskan alasannya. Meskipun harus jelas: Saya benar-benar tidak tertarik dengan angka itu. Saya tertarik pada "waktu cpu per pengguna".
Stefano Palazzo
Adapun komentar kedua: Untuk saat ini, saya berencana untuk mengukur ini secara berkala (katakan setiap detik), yang akan mengabaikan proses yang berumur pendek.
Stefano Palazzo
Jadi perhitungan waktu cpu sistem Anda adalah ($ 1- $ 2 / $ number_of_cups) dari mana nilai $ 1 dan $ 2 berasal /proc/uptime? Lalu saya kira I / O yang dikaitkan dengan tugas idle akan menjelaskan perbedaannya. Saya tidak tahu apa-apa tentang topik ini, jadi saya curiga saya kehilangan sesuatu yang utama: Saya tidak akan berharap begitu banyak terjadi dalam tugas idle, terutama mengingat bahwa jumlah pengguna cputime Anda kemungkinan besar kehilangan banyak kekurangan- proses hidup.
Gilles 'SO- stop being evil'

Jawaban:

3

Cara tradisional untuk mencatat dan melacak waktu CPU pengguna adalah proses akuntansi . Di Linux, instal utilitas akuntansi GNU , biasanya disediakan oleh paket yang disebut acct. Saya tidak yakin seberapa akuratnya dalam melacak waktu yang dihabiskan dalam proses yang sangat singkat, tetapi setidaknya akan mencantumkan semua proses yang pernah dieksekusi.

Jalankan lastcommuntuk mendapatkan daftar semua perintah yang dijalankan oleh pengguna mana pun dan waktu yang dihabiskan di masing-masing (dibulatkan menjadi ~ 10 ms untuk proses yang berumur pendek, berharap untuk melihat banyak 0.00). Jalankan sauntuk menampilkan berbagai jumlah dan statistik. Secara khusus, sa -mmenampilkan total per pengguna. Statistik diakumulasikan oleh sarun dari rotasi terakhir dari log akuntansi (biasanya terletak di /var/log/account/).

Perhatikan bahwa Anda tidak akan menangkap semua proses dengan mengambil sampel pada interval, tidak jauh. Anda akan kehilangan hampir semua proses berumur pendek dan beberapa detik terakhir dari proses panjang. Akuntansi proses tidak mencantumkan semua proses masa lalu.

Dalam /proc/$pid/stat, waktu pengguna adalah waktu yang dihabiskan untuk melakukan perhitungan, berbeda dengan waktu yang dihabiskan sistem untuk melakukan I / O. Yang mana untuk dihitung tergantung pada apa yang ingin Anda lakukan dengan informasi tersebut.

Menghitung semua PID benar. Saya tidak tahu apa yang harus dilakukan PID induk dengan ini.

Di sisi sistem, deskripsi Anda /proc/uptimetampaknya salah. Wikipedia memiliki hak ketika saya menulis. Bidang pertama adalah waktu sebenarnya yang berlalu sejak sistem di-boot, dikurangi waktu yang dihabiskan untuk sementara atau hibernasi. Kolom kedua adalah waktu terakumulasi yang dihabiskan dalam tugas siaga di semua CPU. Saya tidak yakin apa artinya itu; ini jelas bukan total waktu idle di mesin saya. Di kernel, nilai tersebut dijumlahkan dalamuptime_proc_show dari variabel diperbarui diaccount_idle_time .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bagaimana dengan proses yang berjalan sangat lama? Apakah samenunggu proses untuk berhenti sebelum melaporkan waktu cpu?
Stefano Palazzo
@StefanoPalazzo Ya, data akuntansi ditulis ketika suatu proses mati. Itu juga berarti Anda tidak mendapatkan data untuk proses yang berjalan setelah sistem crash, sejauh yang saya tahu.
Gilles 'SO- stop being evil'
Itu masalah - itu artinya saya tidak bisa menggunakannya, karena kami akan memiliki banyak proses yang berjalan lama.
Stefano Palazzo