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 utime
dari 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:
- Apa cara paling adil untuk memonitor total waktu CPU - per pengguna? (+500 Bounty) di Ask Ubuntu
/proc/cputime
tidak 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./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.Jawaban:
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
lastcomm
untuk 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 banyak0.00
). Jalankansa
untuk menampilkan berbagai jumlah dan statistik. Secara khusus,sa -m
menampilkan total per pengguna. Statistik diakumulasikan olehsa
run 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/uptime
tampaknya 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
.sumber
sa
menunggu proses untuk berhenti sebelum melaporkan waktu cpu?