Назад | Перейти на главную страницу

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

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

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

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

Это жизнеспособный подход или я полностью сбился с пути?

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

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

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

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

Вот мой собственный рабочий пример:

Принятие решения -> Вы можете это сделать, это не сложно, просто базовая математика, и мои графики являются живым примером этого. Для сбора данных я делаю снимок / proc / stat во временный файл, локализованный на ramdisk, а затем анализирую этот файл для сбора данных каждую минуту.

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

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

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

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

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

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat