Linux'ta genel CPU kullanımı (örn.% 57) nasıl elde edilir [kapalı]


197

Sistem CPU kullanımını nasıl elde edebileceğinizi ve örneğin bash kullanarak yüzde olarak sunabileceğinizi merak ediyorum.

Örnek çıktı:

57%

Birden fazla çekirdek olması durumunda, ortalama bir yüzdenin hesaplanabilmesi iyi olurdu.


1
@julesanchez değeri başka bir yere boru olması gerekir, bu nedenle bir int olmalıdır
user1199739

top yapıyor> myfile.txt Ve filtrenizi tedavi sonrası uygulayarak sorun değil mi?
JuSchz

11
Sysstat gerektirmeyen bir komut:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Yeniden açılma Bunun neden konu dışı olarak yönetildiğini anlamıyorum, onu kapatanlar detaylandırmayı düşünebilir mi?
Jonathan H

3
Benim anlayışım /proc/statçok sınırlıdır, ancak bu tek satırlık benim için iyi yeterince çalışır: 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)}'. % .2f ile çıktısını almak istediğiniz ondalık sayıları kontrol sleep 1edebilirsiniz ve ortalama değer almak istediğiniz süreyi ayarlayabilirsiniz; Gerçek zamanlı olarak test etmek için bash while döngüsüne koyabilirsiniz.
Yeti

Yanıtlar:


174

Şuna baksana cat /proc/stat

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

DÜZENLEME, bunu kopyalayıp yapıştırmadan veya ciddi bir iş için kullanmadan önce lütfen yorumları okuyun. Bu test edilmedi veya kullanılmadı, bir yardımcı program yüklemek istemeyen insanlar veya herhangi bir dağıtımda çalışan bir şey için bir fikir. Bazı insanlar her şeyi "apt-get install" yapabileceğinizi düşünüyor.

NOT: Bu geçerli CPU kullanımı değil, sistem açılışından bu yana tüm çekirdeklerdeki genel CPU kullanımıdır. Bu, mevcut CPU kullanımından çok farklı olabilir. Geçerli değeri elde etmek için üst (veya benzer bir araç) kullanılmalıdır.

Mevcut CPU kullanımı potansiyel olarak aşağıdakilerle hesaplanabilir:

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)

12
Ancak yukarıda önerdiğiniz gibi mpstat yüklemeniz gerekir. Birçok insanın bu esnekliği yoktur. cat / proc / stat sonra boru tavsiye ettiğiniz mpstat çok daha kolaydır.
vimdude

12
+1 Başka bir yardımcı programı ayrıştırmanın neden ayrıştırmaktan daha iyi olduğunu anlamıyorum/proc/stat
Monica'yı eski

9
sistem + kullanıcı + boşta =% 100. Yani belki şöyle bir şey: grep 'cpu' / proc / stat | awk '{cpu_usage = (2 $ + 4 $) * 100 / (2 $ + 4 $ + 5 $)} END {print cpu_usage "%"}'
vimdude

106
Bu çözümün mevcut CPU yükünü değil, CPU başladığından bu yana ortalama işlemci yükünü gösterdiğini düşünüyorum.
Etienne

11
@jlliagre, evet doğru. CURRENT cpu kullanımını ortalama olarak hesaplamak için, 1 $ değer almanız, sonra gecikmeniz ve 1 $ değer almanız ve farkı görmeniz gerekir. Şu anki işlemci kullanımı bu.
vimdude

102

Deneyebilirsin:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Bu komutu her çalıştırdığımda, aynı çıktıyı ( 32.7%) alıyorum .
alanaktion

13
Kullandığımda daha doğru bir sonuç verilir top -bn2, ancak uzun zaman alır. Okuduğum kadarıyla, doğru bir sonuç almanın tek yolu bu gibi görünüyor.
alanaktion

7
top -bn1FC20 sistemimde çok yanlış görünüyor. top -bn2iyi çalışıyor gibi görünüyor.
Martin Tournoij

24
Bu yanıttaki komut, top -vdöndürülen sistemler procps-ng(örneğin, Fedora) için yazılmış gibi görünmektedir . Ayrıca procps, örneğin, komutun çalışmadığı Ubuntu ve CentOS'ta da bulunur (CPU rakamlarının farklı biçimlendirildiği hat nedeniyle ayrıştırma başarısız olur). İşte her iki uygulamada da çalışan bir sürüm: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
Yan Not: OSX'te aşağıdakileri kullanın: 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

Deneyin mpstatgelen sysstatpaketin

> 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

Sonra bazı cutveya grepihtiyacınız olan bilgileri ayrıştırmak için:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Bu toplam CPU gösterir
inanmıyorum

Toplam CPU kullanımı% 100- boşta diyebilirim (% olarak)
Peter Svensson

Kullanılan yüzde değil. Bu cevap grep'e kadar iyiydi | kuyruk | awk bölüm ...
jordanm

Parçayı şu şekilde değiştirirdim awk: awk -F " " '{print (100 - $12)"%"}'çıktıyı istediği gibi biçimlendiriyor, ama aksi halde bu bana iyi geliyor.
Dan Fego

1
@jordanm Tüm gerçekler; Daha çok oy veriyordum çünkü işe yarıyor. Bunu şahsen yaparım:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Peter Liljenberg'in ilham aldığı çözümümle gerçek bir yanıt da verebilir:

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

Bu, awk100 eksi 12. alanı (boşta) yazdırmak için kullanılır ve sonrasında yüzde işareti olur. awkbunu yalnızca 12. alanın yalnızca sayıları ve noktaları olan bir satır için yapar ( $12 ~ /[0-9]+/).

Ayrıca bir saniye arayla ortalama beş numune de alabilirsiniz:

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

Bu şekilde test edin:

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

14
"Mpstat 2 1 | ..." yi çalıştırmak daha iyi olur, böylece son 1 saniyenin istatistiklerini gösterir. Aksi takdirde, varsayılan olarak, mpstat başlangıçtan beri istatistikleri gösterir ve bu zaman ilerledikçe çok fazla değişmez
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9. gelbe+/ {print 100 - 11 $"% "}'" bu iş benim için.
AloneInTheDark

@Sarang Çok teşekkür ederim !! Sonunda conkyda görüntülenen sonuçları elde edebilirim . Ne yazık ki, bu çizgi ÇOK yavaş, neredeyse yürütmek için bir saniye kadar sürer.
sentakser

6
@syntaxerror Komut yardımına bakarsanız, ilk argümanın aralık olduğunu ancak ikinci argüman nedeniyle yalnızca bir kez yürütüldüğünü görürsünüz, böylece sonucu döndürene kadar 2 tam saniye bekler.
Johan Bjäreholt

Soru kapalı, bu yüzden benim (benzer) cevabını sizinkine ekledim :-) Umarım sakıncası olmaz. Senin gibi Peter Liljenberg'in cevabından ilham aldım.
PJ Brunet

16

DÜZENLENDİ: Başka bir kullanıcının yanıtında% idle'ın alan 11 yerine alan 12 olduğunu fark ettim.

Bu size istenen çıktıyı almalıdır:

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

Basit bir tamsayı yuvarlaması istiyorsanız, printf komutunu kullanabilirsiniz:

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

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'benim için harika çalışıyor, teşekkürler. cpu kullanımının bir saniye içinde örneklendiğinden emin olmak için mpstat 1 1'e dikkat edin
chrishiestand

1
mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
Jq'niz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.