CPU kullanımını her seferinde aynı hale getirmek.


13

Ben cpu kullanımı almak için aşağıdaki komutu yürüttüğümde, ben güzel + kullanıcı cpu kullanımı olsun.

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

Çıktı:

14.5

Burada sorun alıyorum çıktı üst komuta bağlıdır, bu yüzden anında üst komut olarak değişmez. Bu yüzden anında doğru cpu almıyorum. Aynı çıktıyı verir ve değişmez.

Çıktıda gerçek zamanlı işlemci almak istiyorum. Lütfen komutumu geliştirmeme yardım et.


1
Ve soru şu?
Dennis Kaarsemaker

İle eklenmiş komutu çalıştırmayı deneyin time. Sistemimde sadece 0.165 saniye sürüyor.
13'te Depquid

Lütfen bana düzenlenmiş komut verin.
Ketan Patel

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

farklı sistemlerde test edildikten sonra çıkışta fark yok
Ketan Patel

Yanıtlar:


13

Haklısın, topilk yinelemede yanlış CPU kullanımı veriyor gibi görünüyor. Bu soruna geçici bir çözüm bulabilirsiniz:

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

Bu elbette iki kat daha fazla zaman alacak, ama yine de işe yarayacak.

Hala daha hızlı çalışmasını istiyorsanız, -dseçeneği kullanabilirsiniz , örneğin 1 saniyelik toplam ölçüm süresi için yarısını kullanın:

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

serverfault.com/a/436499/134517 ayrıca neredeyse hiçbiri yerine yaklaşık bir saniye alacağından iki kat daha fazla zaman alacaktır.
altendky

Altendky'nin yorumuna ek olarak, sorunun neden ilk başta orada olduğunu açıklamak için terdon'un cevabına da bakınız .
Ruslan

6

Teknik olarak birincisi topher zaman aynı değeri vermez; sadece son önyüklemeden bu yana ortalama CPU yükünü verir. Çünkü topkullanımlar delta /proc/statyanlış (ancak Wad) sonucu elde edilir, sıfır ile karşılaştırılması CPU'nun yükünü hesaplamak için istatistikler, ilk değer hesaplanır.

Kullanmak istemiyorsanız top, doğrudan ayrıştırabilirsiniz /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) "%"}'

Ayrıca bu şekilde daha hızlı ve daha doğru.

Şunlarla test edebilirsiniz stress:

stress -c 1 -q &

Ve yap

killall stress

sonra.


Güzel. Komutunuz 'cpu' adlı bir dosyaya yerleştirilirse, watchüzerinde çalıştırılabilir:watch -n1 "bash ./cpu"
Brent Faust

Ayrıştırma /proc/statiçin awk betiğiniz oldukça havalı ama en üstteki ilk yinelemeyle aynı dezavantaja sahip gibi görünüyor: Son önyüklemeden bu yana ortalama CPU yükünü verir, geçerli olanı değil.
pieroxy

5

Sadece Ruslan'ın cevabını genişletmek, topkullanıcı, sistem süreçleri ve nicesüreçler arasında CPU kullanımını bölerek , üçünün toplamını istiyoruz. Demek ki çalıştırabilirsiniz topiçinde bbize çıkışını ayrıştırmak olanak atch mod. Bununla birlikte, burada açıklandığı gibi , top -bönyüklemeden bu yana yüzdelerin 1. yinelemesi , bu nedenle -n 2geçerli yüzdeyi elde etmek için en az iki yinelemeye ( ) ihtiyacımız var . İşleri hızlandırmak için dyinelemeler arasındaki gecikmeyi şu şekilde ayarlayabilirsiniz 0.01:

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

4

Belki bunu psçıktıya göre kullanın :

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

0

Watch komutunu veya kabuktaki döngü için kullanın,

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


Aynı şey saatle olur
Ketan Patel

0

CPU kullanımını neden önemsiyorsunuz? Yük ortalama çok daha iyi bir göstergedir:

cat /proc/loadavg

CPU kullanımına gerçekten ihtiyacınız varsa, ayrıştırma /proc/statmuhtemelen yoludur.


1
Yük ortalaması temel olarak CPU kullanımının zaman integralidir (zamana bölünür). Neden ayrılmaz bir özelliğin, tamamen farklı kullanım durumları olduğunda, [her şeyin] farklı bir göstergesinden çok daha iyi bir gösterge olduğunu söylüyorsunuz? Ayrıca, /proc/statCPU kullanımı olduğu gibi verilmez, biri okumalar arasında bir süre iki kez okumak ve CPU kullanımı almak için bazı hesaplamalar yapmak zorundadır. Tam da topbu.
Ruslan

Matematik yapamam, bu yüzden itiraf etmeliyim ki integral ve diferansiyel arasındaki farkı gerçekten anlamıyorum: / "Yük ortalaması temelde CPU kullanımının zaman integralidir" - gerçekten mi? AF durumunda D durumunda asılı kalan bir işlem yük artışına neden olur, ancak CPU kullanımı yoktur. "Neden diyesiniz ki ..." - OP gerçekten başarmak istediği şeyi söylemiyor , dürüst olmak gerekirse, sadece sistem yükünü ölçmek istediğini ve CPU kullanımının bunun için en iyi gösterge olacağını düşündüğünü varsayıyorum. Bu yüzden onu ortalamayı yüklemeye yönlendirdim.
Martin von Wittich

Bağlantınızdan: "Sistemler, yük ortalamasını yük sayısının katlanarak sönük / ağırlıklı hareketli ortalaması olarak hesaplar." ve "sistem yükü hesaplama işi miktarının bir ölçüsüdür". D devleti herhangi bir hesaplama işi yapmıyor. Gereken şey CPU zamanını kullanan süreçlerdir. Dolayısıyla ortalama yük temelde CPU'nun bir süre boşta olmadığı sürenin yüzdesidir (mesela dakika ila on dakika). Ve CPU kullanımı, milisaniye zaman ölçeğinde CPU'nun boşta olmadığı sürenin yüzdesidir - yani her okuduğunuzda güncellenir ve geçerli durumu yansıtır .
Ruslan

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.