Aynı anda / proc / stat okuyarak CPU kullanım yüzdesini hesaplamanın bir yolu var mı?


12

Sanırım soru, bir şekilde / proc / stat değerini bir kez okuyarak CPU kullanım yüzdesini bir şekilde hesaplayabilir miyim?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

IOWait (boşta sayılır bir yerde okuyordum) ve bana% 100 verecek ve her tek sütun (sütun / 100_percent) * 100 ile yüzde olarak dönüştürülebilir dışında sütunları özetlemek düşünüyorum.

  • kullanıcı: kullanıcı modunda yürütülen normal işlemler
  • nice: kullanıcı modunda yürütülen güzel işlemler
  • system: çekirdek modunda yürütülen işlemler
  • boşta: twiddling thumbs
  • iowait: G / Ç'nin tamamlanmasını bekliyor
  • irq: servis kesintileri
  • softirq: servis softirq'leri
  • çalmak: istemsiz beklemek
  • misafir: normal bir misafir işletiyor
  • guest_nice: güzel bir misafir işletmek

Bu uygulanabilir bir yaklaşım mı yoksa tamamen pist dışında mıyım?

Yanıtlar:


11

Doğru yoldasınız, topbu dosyayı bu amaçla kullanır. Ama bir kereden fazla okumalısın.

Kullanım, zaman içindeki kullanımın bir ölçüsüdür. Ana makinenin saniye cinsinden çalışma süresini bilerek bir kez okuyabilir, daha sonra buna bölebilirsiniz, ancak makine başlatıldığından beri size bir ana bilgisayar yardımcı programı oranı verir.

5 saniyenin üzerinde bir oran istiyorsanız, dosyayı bir kez okur, 5 saniye uyur, tekrar okur, hesaplamaların farkını alır ve 5'e bölerdiniz.


6

Yaklaşımınız doğru. / Proc / stat öğesini ham veri olarak kullanabilir ve örneğin rrdtool ile besleyebilirsiniz. Kendime böyle bir şey yaptım, bu yüzden% 100 mümkün olduğunu biliyorum. Daha sonra tüm sistem yükünü veya her çekirdeği ayrı ayrı grafiklendirebilirsiniz.

İşte benim kendi çalışan bir örnek: resim açıklamasını buraya girin

Güven verici -> Yapabilirsin, sadece temel matematik değil, grafiklerim de bunun canlı bir örneğidir. Veri toplamak için ramdisk üzerinde bulunan geçici bir dosyaya / proc / stat anlık görüntüsünü alıyorum ve sonra her 1 dakikada bir veri toplamak için bu dosyayı ayrıştırıyorum.

nasıl veri (bash komut dosyası parçası) ayrıştırmak:

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

rrd veritabanına veri aldıktan sonra Grafik ve gökyüzü sınırıdır :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


Verileri nasıl ayrıştırırsınız?
ewwhite

@ewwhite -> Verileri nasıl ayrıştırdığımı göstermek için cevabımı düzenledim.
Bartłomiej Zarzecki

Güzel grafikler! Eksik sütun ek açıklamanızla ilgili: askubuntu.com/a/120961/451886 . Bir VM'de çalışıyorsa, belki de "çalma" sayacıdır.
rkagerer

Rrdtool ve ramdisk için +1!
shadi

4

Oneliner istiyorsanız şu şekilde görünebilir:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

Sonuç: 97.17000000000000000000

Nasıl çalışır:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

daha ( 1055057784 - 1055058055 )/100sonra bu satır beslemesini bc'ye üretir . Gibi bir şey olacak -7.84000000000000000000, sadece sarın 100-$(value)ve tekrar bc'ye besleyin

Orada: sleep #- 1 saniye gecikme, bu değeri değiştirirseniz, ara sonuç saniye sayısına bölünmelidir. $5- 5 tarla, uygun man procve http://www.linuxhowtos.org/System/procstat.htm

Bunun sizin için işe yaramıyorsa lütfen bize bildirin.


0

Veya awk noktasından sonra sadece iki basamaktan memnunsanız, bunu çok daha basit ve daha okunabilir yapabilir:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
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.