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.Jawaban:
Sepertinya Anda perlu proses akuntansi.
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
Di Ubuntu, alat akuntansi proses ada dalam
acct
paketUntuk mendapatkan laporan per pengguna, jalankan
sumber
/proc/[pid]/stat
.sa
(.ps.gz) . Dan saya juga punya cara yang baik untuk "memperkirakan" proses-proses yang sudah berjalan lama itu, sebelum akhirnya mendapatkan nilai yang akurat untuk itu juga. Jadi, bagaimanapun juga, kita akan menggunakannya, dan saya dengan senang hati memberikan hadiah untuk jawaban Anda. Terima kasih banyak!Ini akan memberikan garis untuk setiap pengguna yang menunjukkan nama pengguna dan waktu cpu total mereka:
sumber
Salah satu jawaban yang lebih jelas adalah hanya memperluas apa yang sedang Anda lakukan sekarang.
Saya menemukan proses monitor ini untuk menggunakan bash scripting dan mysql untuk melacak waktu cpu pengguna, tetapi terbentang di kerangka waktu yang jauh lebih besar daripada yang Anda bicarakan.
Semoga ini bisa memberi Anda lebih banyak ide tentang arah yang ingin Anda tuju.
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
sumber
Ini juga akan menangani proses yang telah berjalan selama berhari-hari..tidak yakin bagaimana melakukan ekspansi selama beberapa minggu / bulan / tahun ..
sumber