Czy istnieje sposób obliczenia procentowego wykorzystania procesora przez jednoczesne odczytanie / proc / stat?

12

Wydaje mi się, że pytanie brzmi: czy mogę jakoś obliczyć procent wykorzystania procesora, czytając raz / proc / stat?

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

Zastanawiam się nad podsumowaniem kolumn z wyjątkiem IOWait (czytałem gdzieś, że jest liczony na biegu jałowym) i to dałoby mi 100%, a każda pojedyncza kolumna mogłaby zostać zamieniona na procent o (kolumna / 100_percent) * 100.

  • użytkownik: normalne procesy wykonywane w trybie użytkownika
  • nice: ładne procesy wykonywane w trybie użytkownika
  • system: procesy wykonywane w trybie jądra
  • jałowy: kręcące się kciuki
  • iowait: oczekiwanie na zakończenie operacji we / wy
  • irq: obsługa przerwań
  • softirq: serwisowanie softirqs
  • ukraść: mimowolne czekanie
  • gość: normalny gość
  • guest_nice: prowadzenie miło gości

Czy to jest realne podejście, czy jestem całkowicie poza torem?

Istvan
źródło

Odpowiedzi:

11

Jesteś na dobrej drodze, topużywa tego pliku do tego celu. Ale musisz przeczytać to więcej niż raz.

Wykorzystanie jest miarą zużycia w czasie. Możesz go raz przeczytać, podając czas działania hosta w sekundach, a następnie podzielić przez to, ale dałoby to wskaźnik użyteczności hosta od momentu uruchomienia komputera.

Jeśli chcesz uzyskać szybkość w ciągu 5 sekund, możesz odczytać plik raz, spać przez 5 sekund, przeczytać go ponownie, uzyskać różnicę obliczeń i podzielić przez 5.

Matthew Ife
źródło
6

Twoje podejście jest prawidłowe. Możesz użyć / proc / stat jako surowych danych i karmić nim na przykład rrdtool. Zrobiłem sobie coś takiego, więc wiem, że w 100% jest to możliwe. Następnie możesz ładnie zobrazować obciążenie całego systemu lub każdy rdzeń osobno.

Oto mój działający przykład: wprowadź opis zdjęcia tutaj

Reasumując -> Możesz to zrobić, nie jest to tylko podstawowa matematyka, a moje wykresy są tego żywym przykładem. Aby zebrać dane, robię migawkę / proc / stat do pliku tymczasowego zlokalizowanego na ramdysku, a następnie analizuję ten plik, aby zbierać dane co 1 minutę.

jak parsuję dane (fragment skryptu bash):

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.

po wczytaniu danych do bazy danych rrd można tworzyć wykresy, a niebo jest limitem :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

Bartłomiej Zarzecki
źródło
Jak parsujesz dane?
ewwhite
@ewwhite -> Zredagowałem swoją odpowiedź, aby pokazać, jak analizuję dane.
Bartłomiej Zarzecki
Piękne wykresy! Jeśli chodzi o brakującą adnotację w kolumnie: askubuntu.com/a/120961/451886 . Jeśli działa na maszynie wirtualnej, być może jest to licznik „kradzieży”.
rkagerer
+1 za rrdtool i ramdisk!
shadi
4

Jeśli chcesz oneliner, może to wyglądać tak:

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

Wynik: 97.17000000000000000000

Jak to działa:

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

produkuje ( 1055057784 - 1055058055 )/100następnie ten wiersz do bc. Będę miał coś takiego -7.84000000000000000000, a potem po prostu ją zawiń 100-$(value)i nakarm ponownie bc

Tam: sleep #- 1 sekundowe opóźnienie, jeśli zmienisz tę wartość, wynik pośredni należy podzielić na liczbę sekund. $5- Piąte pole, zgodnie z man proci http://www.linuxhowtos.org/System/procstat.htm

Daj mi znać, jeśli to nie zadziała.

Putnik
źródło
0

Lub jeśli jesteś zadowolony z zaledwie dwóch cyfr po tym, jak awk może zrobić to wszystko o wiele łatwiej i bardziej czytelnie:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
slaxor
źródło