Mendapatkan penggunaan cpu sama setiap kali.

13

Ketika saya menjalankan perintah berikut untuk mendapatkan penggunaan CPU, saya mendapatkan penggunaan pengguna CPU yang bagus.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Keluaran:

14.5

Di sini saya mendapatkan masalah adalah bahwa output tergantung pada perintah atas sehingga tidak langsung berubah sebagai perintah atas. Jadi saya tidak mendapatkan cpu yang benar secara instan. Ini memberikan output yang sama dan tidak berubah.

Saya ingin mendapatkan output realtime. Tolong bantu saya untuk meningkatkan perintah saya.

Ketan Patel
sumber
1
Dan pertanyaannya adalah?
Dennis Kaarsemaker
Coba jalankan perintah yang diawali dengan time. Di sistem saya hanya dibutuhkan 0,165s.
depquid
Tolong beri saya perintah yang diedit.
Ketan Patel
Coba:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid
tidak ada perbedaan dalam output, setelah diuji dalam sistem yang berbeda
Ketan Patel

Jawaban:

13

Anda benar, toptampaknya memberikan penggunaan CPU yang salah pada iterasi pertama. Anda dapat mengatasi masalah ini seperti ini:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Ini tentu saja akan memakan waktu dua kali lebih banyak, tetapi tetap akan berhasil.

Jika Anda tetap menginginkannya bekerja lebih cepat, Anda dapat menggunakan -dopsi, misalnya untuk periode pengukuran total 1 detik, gunakan setengahnya:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Ruslan
sumber
serverfault.com/a/436499/134517 juga akan memakan waktu lebih dari dua kali lipat waktu karena kira-kira satu detik, bukannya hampir tidak ada.
altendky
Selain komentar oleh altendky, lihat juga jawaban oleh terdon untuk penjelasan mengapa masalah ada di tempat pertama.
Ruslan
6

Secara teknis yang pertama toptidak selalu menghasilkan nilai yang sama; itu hanya menampilkan beban CPU rata-rata sejak boot terakhir. Karena topmenggunakan delta /proc/statstatistik untuk menghitung beban CPU, nilai pertama dihitung sambil membandingkan dengan nol, menghasilkan hasil yang salah (tapi WAD).

Jika Anda tidak ingin menggunakan top, Anda dapat langsung menguraikan /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Ini juga lebih cepat dan lebih akurat dengan cara ini.

Anda dapat mengujinya dengan stress:

stress -c 1 -q &

Dan lakukan

killall stress

setelah.


sumber
Bagus. Dan jika perintah Anda ditempatkan dalam file yang disebut 'cpu', maka watchdapat dijalankan di atasnya:watch -n1 "bash ./cpu"
Brent Faust
Script awk Anda untuk menguraikan /proc/statcukup keren tetapi tampaknya memiliki kelemahan yang sama dengan iterasi pertama atas: Ini menghasilkan rata-rata beban CPU sejak boot terakhir, bukan yang sekarang.
pieroxy
5

Hanya untuk memperluas jawaban @ Ruslan, topmembagi penggunaan CPU antara pengguna, proses sistem dan niceproses, kami ingin jumlah dari ketiganya. Jadi, kita bisa menjalankan topdalam bmode atch yang memungkinkan kita untuk mengurai outputnya. Namun, seperti yang dijelaskan di sini , iterasi pertama top -bmengembalikan persentase sejak booting, oleh karena itu kami membutuhkan setidaknya dua iterasi ( -n 2) untuk mendapatkan persentase saat ini. Untuk mempercepat, Anda dapat mengatur delay antara iterasi ke 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
terdon
sumber
4

Mungkin gunakan yang ini berdasarkan psoutput:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }
GHugo
sumber
0

Gunakan perintah arloji atau untuk loop in shell,

yaitu watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"

bunga aster
sumber
Hal yang sama Terjadi dengan arloji
Ketan Patel
0

Mengapa Anda peduli dengan penggunaan CPU? The beban rata-rata adalah indikator yang lebih baik banyak:

cat /proc/loadavg

Jika Anda benar-benar membutuhkan penggunaan CPU, parsing /proc/statmungkin adalah cara yang harus dilakukan.

Martin von Wittich
sumber
1
Rata-rata beban pada dasarnya adalah waktu yang tidak terpisahkan dari penggunaan CPU (dibagi dengan waktu). Mengapa Anda mengatakan karakteristik integral adalah indikator yang lebih baik [dari segalanya] daripada yang diferensial ketika mereka memiliki kasus penggunaan yang sama sekali berbeda? Juga, /proc/stattidak memberikan penggunaan CPU seperti itu, kita harus membacanya dua kali dengan beberapa waktu antara membaca dan melakukan beberapa perhitungan untuk mendapatkan penggunaan CPU. Inilah yang topdilakukannya.
Ruslan
Saya tidak bisa menghitung, jadi saya harus mengakui bahwa saya tidak benar-benar memahami perbedaan antara integral dan diferensial: / "Rata-rata beban pada dasarnya adalah waktu integral dari penggunaan CPU" - benarkah itu? AFAIK proses yang hang dalam keadaan D menyebabkan peningkatan beban, tetapi tidak ada penggunaan CPU. "Mengapa Anda mengatakan ..." - OP tidak mengatakan apa yang benar-benar ingin ia capai, jadi jujur ​​saja, saya hanya berasumsi ia ingin mengukur beban sistemnya dan berpikir bahwa penggunaan CPU akan menjadi indikator terbaik untuk ini. , jadi saya mengarahkannya untuk memuat rata-rata.
Martin von Wittich
Dari tautan Anda: "Sistem menghitung rata-rata beban sebagai rata-rata bergerak teredam / tertimbang secara eksponensial dari jumlah beban." dan "beban sistem adalah ukuran jumlah pekerjaan komputasi". Status D tidak mengambil pekerjaan komputasi apa pun. Apa yang dilakukan adalah proses yang menggunakan waktu CPU. Jadi beban rata-rata pada dasarnya adalah persentase waktu CPU tidak menganggur selama beberapa periode waktu (katakanlah, menit hingga puluhan menit). Dan penggunaan CPU adalah persentase waktu CPU tidak menganggur pada skala waktu milidetik - yaitu diperbarui setiap kali Anda membacanya dan mencerminkan keadaan saat ini .
Ruslan
-2

Menggunakan sarperintah

sar 1 10

Itu berarti: dapatkan hasil 10 kali dalam setiap detik

Philip Ngun
sumber