Есть ли способ рассчитать процент использования ЦП, прочитав / proc / stat сразу?

12

Наверное, вопрос в том, могу ли я как-нибудь рассчитать процент использования ЦП, просто прочитав / proc / stat один раз?

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

Я думаю о суммировании столбцов, кроме IOWait (я где-то читал, что он считается в простое), и это дало бы мне 100%, и каждый отдельный столбец можно было бы превратить в процент на (column / 100_percent) * 100.

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

Это жизнеспособный подход или я совершенно не в курсе?

Иштван
источник

Ответы:

11

Вы на правильном пути, topиспользуйте этот файл для этой цели. Но вам нужно прочитать это не раз.

Использование является мерой использования с течением времени. Вы можете прочитать его один раз, если вы знаете время безотказной работы хоста в секундах, а затем разделите его на это, но это даст вам коэффициент полезного действия хоста с момента загрузки машины.

Если вам нужна скорость более 5 секунд, вы должны прочитать файл один раз, поспать 5 секунд, прочитать его снова, получить разницу в вычислениях и разделить на 5.

Мэтью Ифе
источник
6

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

Вот мой рабочий пример: введите описание изображения здесь

Переосмысление -> Вы можете сделать это, это не сложно, просто базовая математика, и мои графики являются живым примером этого. Для сбора данных я делаю снимок / proc / stat во временный файл, расположенный на виртуальном диске, а затем анализирую этот файл для сбора данных каждую 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 -> Я отредактировал свой ответ, чтобы показать, как я анализирую данные.
Бартломей Заржецкий
Красивые графики! Что касается аннотации к отсутствующему столбцу: askubuntu.com/a/120961/451886 . Если он работает в виртуальной машине, возможно, это счетчик «украсть».
rkagerer
+1 за rrdtool и рамдиск!
Шади
4

Если вам нужен oneliner, он может выглядеть так:

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затем этот перевод строки до н.э. Будет что-то вроде -7.84000000000000000000, затем просто оберните его 100-$(value)и снова подайте на bc

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

Пожалуйста, дайте мне знать, если это не работает для вас.

Putnik
источник
0

Или, если вы довольны двумя цифрами после точки, awk может сделать все намного проще и удобочитаемее:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
slaxor
источник