Apa cara paling adil untuk memonitor total waktu CPU - per pengguna?

25

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:

  1. Dapatkan setiap pengguna dan PID yang mereka jalankan ps aux
  2. Untuk setiap PID, dapatkan x, dari jumlah utime, cutime, stime dan cstime dari/proc/[pid]/stat
  3. 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 auxtidak 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.

Stefano Palazzo
sumber
1
500 reputasi: o peluang bagus untuk
pemula
Sedikit keluar dari liga saya, tetapi pertanyaan yang sangat menarik jadi saya menggali sedikit dan menemukan sesuatu yang saya harap setidaknya berguna untuk membantu Anda memecahkan ini: stackoverflow.com/a/1424556/905573
kingmilo
1
Anda tahu topbisa 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.
Rinzwind

Jawaban:

11

Sepertinya Anda perlu proses akuntansi.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

Di Ubuntu, alat akuntansi proses ada dalam acctpaket Pasang ACCT

Untuk mendapatkan laporan per pengguna, jalankan

sa -m
Alan Bell
sumber
Sayangnya, ini tidak akan berfungsi untuk saya karena "sa" tidak akan menghitung proses yang berjalan lama. Yang saya butuhkan (saya pikir) adalah cara untuk mendeteksi proses yang dimulai dan diakhiri, dan untuk mencatat waktu cpu mereka ketika mereka berhenti, serta saat mereka sedang berjalan.
Stefano Palazzo
@StefanoPalazzo Saya percaya ini adalah yang terbaik yang akan Anda dapatkan. Tambahkan dengan waktu untuk menjalankan proses dari /proc/[pid]/stat.
ændrük
Ternyata, hampir semua proses akan diperhitungkan dengan benar oleh 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!
Stefano Palazzo
3

Ini akan memberikan garis untuk setiap pengguna yang menunjukkan nama pengguna dan waktu cpu total mereka:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done
Marques Johansson
sumber
2

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

Linztm
sumber
0

Ini juga akan menangani proses yang telah berjalan selama berhari-hari..tidak yakin bagaimana melakukan ekspansi selama beberapa minggu / bulan / tahun ..

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
Patrik Arlos
sumber