Думаю, вопрос в том, могу ли я как-то рассчитать процент использования ЦП, просто прочитав / 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