Чи є спосіб розрахувати відсоткове використання процесора, читаючи / proc / stat одночасно?


12

Я думаю, питання полягає в тому, чи можу я якось обчислити відсоток використання процесора, просто прочитавши / proc / stat один раз?

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

Я замислююся про підсумовування стовпців, крім IOWait (я десь читав, що це рахується в режимі очікування), і це дасть мені 100%, і кожен окремий стовпець міг би бути перетворений на відсоток на (стовпчик / 100_процент) * 100.

  • користувач: нормальні процеси, що виконуються в режимі користувача
  • приємно: niced процеси, що виконуються в режимі користувача
  • система: процеси, що виконуються в режимі ядра
  • холостий: великі пальці
  • iowait: очікування завершення вводу / виводу
  • irq: обслуговування перериває
  • softirq: обслуговування softirqs
  • красти: мимоволі чекати
  • гість: працює звичайний гість
  • guest_nice: запуск набраного гостя

Це життєздатний підхід чи я зовсім позаду?

Відповіді:


11

Ви на правильному шляху, topвикористовує для цього цей файл. Але читати її потрібно не раз.

Утилізація - це міра використання з часом. Ви можете прочитати його один раз, якщо ви знаєте час роботи хоста в секундах, а потім розділити на це, але це дасть вам корисну швидкість хоста з моменту завантаження машини.

Якщо ви хочете, щоб швидкість перевищувала 5 секунд, ви прочитали файл один раз, спали протягом 5 секунд, прочитали його ще раз, отримали різницю обчислень і розділили на 5.


6

Ваш підхід правильний. Ви можете використовувати / proc / stat як вихідні дані та подавати, наприклад, rrdtool. Я зробив собі щось подібне, тому я знаю, що на 100% це можливо. Ви можете добре графічно завантажувати всю систему або кожне ядро ​​окремо.

Ось власний робочий приклад: введіть тут опис зображення

Переосмислення -> Ви можете це зробити, це не важко, просто основна математика, і мої графіки є живим прикладом цього. Для збору даних я роблю знімок / proc / stat у тимчасовий файл, розміщений на ramdisk, а потім аналізую цей файл, щоб збирати дані кожні 1 хвилини.

як я розбираю дані (фрагмент скрипту 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.

після отримання даних у базу даних rrd Ви можете графікувати, а небо - це межа :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


Як ви аналізуєте дані?
ewwhite

@ewwhite -> Я відредагував свою відповідь, щоб показати, як я розбираю дані.
Bartłomiej Zarzecki

Красиві графіки! Щодо вашої відсутньої анотації стовпців: askubuntu.com/a/120961/451886 . Якщо він працює в VM, можливо, це лічильник "крадіжки".
rkagerer

+1 для rrdtool та ramdisk!
Шаді

4

Якщо ви хочете, щоб він виглядав так:

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

Результат: 97.17000000000000000000

Як це працює:

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

виробляє ( 1055057784 - 1055058055 )/100потім цей рядок подавати до bc. Буде щось на кшталт -7.84000000000000000000, тоді просто загорніть його 100-$(value)і знову подайте на ПК

Там: sleep #- затримка на 1 секунду, якщо ви зміните це значення, проміжний результат слід розділити на кількість секунд. $5- 5-е поле, відповідно до man procта http://www.linuxhowtos.org/System/procstat.htm

Будь ласка, дайте мені знати, якщо це не працює для вас.


0

Або якщо ви задоволені лише двома цифрами після точки awk, ви можете зробити це набагато простіше і читабельніше:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.