Cara mendapatkan penggunaan CPU secara keseluruhan (mis. 57%) di Linux [ditutup]

194

Saya bertanya-tanya bagaimana Anda bisa mendapatkan penggunaan sistem CPU dan menyajikannya dalam persen menggunakan bash, misalnya.

Output sampel:

57%

Jika ada lebih dari satu inti, alangkah baiknya jika persentase rata-rata dapat dihitung.

pengguna1199739
sumber
1
@julesanchez nilai perlu disalurkan di tempat lain, maka itu harus berupa int
user1199739
melakukan top> myfile.txt Dan menerapkan filter Anda di pasca perawatan, tidak apa-apa?
JuSchz
11
Perintah yang tidak memerlukan sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon
7
Pembukaan kembali Saya tidak mengerti mengapa ini dianggap di luar topik, dapatkah orang yang menutupnya peduli untuk menjelaskan?
Jonathan H
3
Pemahaman saya tentang /proc/statsangat terbatas, tapi ini satu-kapal bekerja cukup baik bagi saya: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Dengan% .2f Anda dapat mengontrol jumlah desimal yang ingin Anda hasilkan, dan dengan sleep 1Anda dapat mengatur waktu rata-rata yang Anda inginkan, yaitu, jika ia melakukan apa yang menurut saya dilakukan. Anda dapat meletakkannya dalam bash while, untuk mengujinya secara realtime.
Yeti

Jawaban:

174

Melihat cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

Sunting silakan baca komentar sebelum menyalin-menempel ini atau menggunakan ini untuk pekerjaan serius. Ini tidak diuji atau digunakan, ini adalah ide untuk orang yang tidak ingin menginstal utilitas atau untuk sesuatu yang berfungsi dalam distribusi apa pun. Beberapa orang berpikir Anda dapat "apt-get install" apa saja.

CATATAN: ini bukan penggunaan CPU saat ini , tetapi penggunaan CPU secara keseluruhan di semua core sejak boot sistem. Ini bisa sangat berbeda dari penggunaan CPU saat ini. Untuk mendapatkan nilai saat ini, top (atau alat serupa) harus digunakan.

Penggunaan CPU saat ini dapat berpotensi dihitung dengan:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)
vimdude
sumber
12
Tetapi Anda harus menginstal mpstat seperti yang Anda rekomendasikan di atas. Banyak orang tidak memiliki fleksibilitas itu. cat / proc / stat maka pipa jauh lebih mudah daripada mpstat yang Anda rekomendasikan.
vimdude
12
+1 Tidak mengerti mengapa parsing utilitas lain lebih baik daripada parsing/proc/stat
Reinstate Monica Please
9
sistem + pengguna + idle = 100%. Jadi mungkin sesuatu seperti: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude
106
Saya pikir solusi ini tidak menunjukkan beban CPU saat ini tetapi beban CPU rata-rata sejak CPU dimulai.
Etienne
11
@ jlliagre, ya itu benar. Untuk menghitung penggunaan CPU saat ini bukan rata-rata, Anda harus mengambil nilai $ 1 kemudian menunda kemudian mengambil nilai $ 1 dan melihat perbedaannya. Itulah penggunaan cpu saat ini.
vimdude
102

Anda dapat mencoba:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'
netcoder
sumber
11
Setiap kali saya menjalankan perintah ini, saya mendapatkan output yang sama persis ( 32.7%).
alanaktion
13
Hasil yang lebih akurat diberikan ketika saya menggunakan top -bn2, tetapi itu membutuhkan waktu lama. Dari apa yang saya baca, ini tampaknya menjadi satu-satunya cara untuk mendapatkan hasil yang akurat.
alanaktion
6
top -bn1tampaknya sangat tidak akurat pada sistem FC20 saya. top -bn2tampaknya bekerja dengan baik.
Martin Tournoij
23
Perintah dalam jawaban ini tampaknya ditulis untuk sistem tempat top -vpengembalian procps-ng(misalnya, Fedora). Ada juga procps, ditemukan pada, misalnya, Ubuntu dan CentOS, di mana perintah tidak bekerja (selalu menunjukkan 100%, karena penguraian gagal karena garis dengan angka CPU diformat berbeda). Berikut adalah versi yang bekerja dengan kedua implementasi:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0
2
Catatan: di OSX, gunakan berikut: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0
38

Coba mpstatdari sysstatpaket

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Kemudian beberapa cutatau grepuntuk menguraikan informasi yang Anda butuhkan:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a
Peter Svensson
sumber
1
Saya tidak percaya ini menunjukkan total CPU
user1199739
Saya akan mengatakannya 100-% menganggur, itulah total penggunaan CPU (dalam%)
Peter Svensson
Itu persentase "tidak" digunakan. Jawaban ini bagus, sampai grep | ekor | bagian awk ...
jordanm
Saya akan mengubah awkbagian menjadi awk -F " " '{print (100 - $12)"%"}':, yang memberikan output diformat seperti yang dia inginkan, tetapi jika tidak, ini terlihat baik bagi saya.
Dan Fego
1
@jordanm Semua kebenaran; Saya lebih memilih itu karena berhasil. Saya akan melakukan ini secara pribadi:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego
22

Mungkin juga memunculkan respons yang sebenarnya dengan solusi saya, yang terinspirasi oleh Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Ini akan digunakan awkuntuk mencetak 100 minus bidang ke-12 (idle), dengan tanda persentase setelahnya. awkhanya akan melakukan ini untuk garis di mana bidang ke-12 hanya memiliki angka dan titik ( $12 ~ /[0-9]+/).

Anda juga dapat rata-rata lima sampel, satu detik terpisah:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Uji seperti ini:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'
Dan Fego
sumber
14
Lebih baik menjalankan "mpstat 2 1 | ..." sehingga ini menunjukkan statistik selama 1 detik terakhir. Jika tidak, secara default, mpstat menunjukkan statistik sejak awal dan itu tidak berubah banyak seiring berjalannya waktu
Sarang
1
"mpstat | awk '$ 12 ~ /[0-9.[+/ {print 100 - $ 11"% "}'" ini berfungsi untuk saya.
AloneInTheDark
@Sarang Terima kasih banyak !! Akhirnya saya bisa mendapatkan hasil yang conkyditampilkan juga. Sayangnya, baris ini SANGAT lambat, hampir membutuhkan satu detik untuk dieksekusi.
syntaxerror
6
@syntaxerror Dibutuhkan tepat 2 detik karena jika Anda melihat perintah membantu Anda melihat bahwa argumen pertama adalah bahwa itu interval tetapi hanya dieksekusi sekali karena argumen kedua sehingga menunggu 2 detik penuh sampai mengembalikan hasilnya.
Johan Bjäreholt
Pertanyaan ditutup, jadi tambahkan jawaban saya (serupa) kepada Anda :-) Semoga Anda tidak keberatan. Seperti Anda, saya terinspirasi oleh jawaban Peter Liljenberg.
PJ Brunet
16

DIedit: Saya perhatikan bahwa di pengguna lain, balasan% idle adalah isian 12 bukan isian 11. Awk telah diperbarui agar akun% isian isian menjadi variabel.

Ini akan memberi Anda output yang diinginkan:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Jika Anda ingin pembulatan bilangan bulat sederhana, Anda dapat menggunakan printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'
jordanm
sumber
2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'bekerja bagus untukku, terima kasih. catat mpstat 1 1 untuk memastikan bahwa penggunaan cpu disampel lebih dari sedetik
chrishiestand
1
Jika Anda memiliki jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet