Pada sistem multi-pengguna, saya ingin mengukur penggunaan CPU setiap pengguna dalam detik waktu cpu. Untuk keperluan pengukuran ini, saya berasumsi bahwa jika PID milik pengguna, pengguna ini yang menyebabkan waktu CPU - yaitu saya mengabaikan daemon dan kernel.
Saat ini saya melakukan ini, setiap lima detik:
- Dapatkan setiap pengguna dan PID yang mereka jalankan
ps aux
- Untuk setiap PID, dapatkan
x
, dari jumlah utime, cutime, stime dan cstime dari/proc/[pid]/stat
- menghitung
t = x / interval
(interval tidak selalu tepat 5 detik ketika ada beban tinggi)
Jika saya menjalankan ini, saya mendapatkan nilai yang tampak masuk akal. Sebagai contoh: Seorang pengguna pada sistem ini berputar dalam python ( while True: pass
), dan sistem menunjukkan putaran sekitar 750 milidetik waktu CPU per detik. Ketika sistem digantung sebentar, dilaporkan 1600ms untuk 1-detik inverval. Yang kelihatannya benar, tapi saya mengerti bahwa nilai-nilai ini bisa menipu, terutama mengingat saya tidak benar - benar memahaminya.
Jadi pertanyaan saya adalah ini:
Apa cara yang adil dan benar untuk mengukur beban CPU berdasarkan per pengguna?
Metode ini harus agak akurat. Mungkin ada ratusan pengguna pada sistem ini, jadi mengekstraksi persentase dari ps aux
tidak akan cukup akurat, terutama untuk utas berumur pendek yang ingin ditelurkan banyak perangkat lunak.
Meskipun ini mungkin rumit, saya benar-benar tahu itu mungkin. Ini adalah titik awal saya:
Kernel melacak waktu pembuatan proses serta waktu CPU yang dikonsumsi selama masa pakainya. Setiap clock tick, kernel memperbarui jumlah waktu dalam jiffies yang telah dihabiskan proses saat ini dalam sistem dan dalam mode pengguna. - (dari Proyek Dokumentasi Linux )
Nilai yang saya kejar adalah jumlah detik (atau jiffies) yang dihabiskan pengguna untuk CPU, bukan persentase dari beban sistem atau penggunaan cpu.
Sangat penting bahwa kita mengukur waktu CPU saat proses masih berjalan. Beberapa proses hanya akan berlangsung selama setengah detik, beberapa akan berlangsung selama berbulan-bulan - dan kita perlu menangkap keduanya, sehingga kita dapat menghitung waktu CPU pengguna dengan granularity yang baik.
top
bisa melakukan mode batch? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
harus menunjukkan beban untuk {user} pada saat itu.