Mendapatkan penggunaan cpu secara realtime


11

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 penggunaan cpu secara real-time dalam output. Tolong bantu saya untuk meningkatkan perintah saya.



Skrip bash sederhana ini tidak hanya itu: askubuntu.com/a/450136/243213
Craig van Tonder

Jawaban:


20

Jika Anda mampu menunda satu detik, ini akan mencetak penggunaan CPU sebagai persentase sederhana:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Tanpa penundaan satu detik, vmstathanya dapat mencetak nilai rata-rata sejak booting.)


Tidak memberi saya% akurat (dibandingkan dengan htop)
lepe

1
Anda perlu menggunakan vmstat 1 2seperti ini: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] Jika tidak, Anda vmstatakan memberikan nilai sejak boot yang kemungkinan bukan apa yang Anda cari.
Joe

joe terima kasih itu berhasil. tolong Paul, edit jawaban sehingga semua orang dapat melihat baris perintah yang benar
Pavlos Theodorou

Terima kasih telah menangkap itu, Joe dan Pavlos! Saya tidak memperhatikan bagian halaman manual itu.
Paul

9

Ini adalah masalah yang diketahui top. Seperti yang dijelaskan di sini , iterasi pertama top -bmengembalikan persentase sejak boot, oleh karena itu kita memerlukan setidaknya dua iterasi ( -n 2) untuk mendapatkan persentase saat ini. Untuk mempercepat, Anda dapat mengatur delay di antara iterasi 0.01. topmembagi penggunaan CPU antara pengguna, proses sistem dan niceproses, kami ingin jumlah dari ketiganya. Akhirnya, Anda grepbaris yang berisi persentase CPU dan kemudian gunakan gawkuntuk menjumlahkan pengguna, sistem dan proses yang bagus:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

Setiap metode lain termasuk sar, mpstat ... dll menunjukkan 2/3% sedangkan perintah ini selalu menunjukkan 50%.
CMCDragonkai

@ CMCDragonkai angkanya harus berubah (saya baru memeriksanya) apakah Anda yakin menyalin / menempelnya dengan benar? Juga, perhatikan bahwa pada sistem dengan banyak CPU, topakan melaporkan penggunaan% sebagai persentase dari satu CPU. Ini berarti Anda akan sering mendapatkan persentase yang jauh lebih tinggi. Lihat poin 9 di sini .
terdon

Saya pikir perintah ini mungkin tidak kompatibel dengan sistem saya. Tetapi jelas bahwa semua metode lain yang saya coba memberi saya persentase 1/2/3% yang saya lihat jika saya menjalankan htop, sedangkan perintah ini memberi saya anomali.
CMCDragonkai

@ CMCDragonkai itu karena banyak CPU. Anda bisa mendapatkan nomor yang dikembalikan oleh ini dan membaginya dengan jumlah core atau Anda dapat menggunakan topdalam mode interaktif (jalankan saja top) dan, begitu ada, tekan I(shift + i) untuk melihat gangguan oleh core.
terdon

Saya hanya punya 1 CPU.
CMCDragonkai

7

Saya telah mencoba beberapa cara, tetapi menurut saya ini yang paling akurat:

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)}'

Dapat dari sini


linux saya (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sabtu 19 Mei 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) tidak memiliki kolom $ 15 (baris cpu dari file / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
Jawaban Terbaik! Terima kasih! Variasi saya: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

Perbedaan maXp adalah bahwa itu dicetak dibulatkan dengan desimal tunggal:, %.1fyang menurut saya lebih manusiawi dan bermanfaat jika Anda menggunakan output itu di skrip lain.
lepe

0

Gunakan -n2. Ini akan menghasilkan dua baris. Waktu pertama topmencetak garis tidak memenuhi syarat untuk keadaan pada saat itu. Kemudian sesuaikan skrip Anda untuk mengabaikan baris pertama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.