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

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

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

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

  • пользователь: обычные процессы, выполняемые в пользовательском режиме
  • nice: niced процессы, выполняемые в пользовательском режиме
  • система: процессы, выполняемые в режиме ядра
  • idle: twiddling thumbs
  • iowait: ожидание завершения ввода /вывода
  • irq: обслуживание прерываний
  • softirq: обслуживание softirqs
  • украсть: недобровольное ожидание
  • гость: запуск обычного гостя
  • guest_nice: запуск голого гостя

Является ли это жизнеспособным подходом или я полностью не в курсе?

12 голосов | спросил Istvan 4 Jam1000000amSat, 04 Jan 2014 04:52:33 +040014 2014, 04:52:33

4 ответа


11

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

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

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

ответил Matthew Ife 4 Jam1000000amSat, 04 Jan 2014 04:59:17 +040014 2014, 04:59:17
6

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

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

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

<p> как я разбираю данные (фрагмент сценария bash): </p>

<pre><code>---- +: = 0 = + ----</code></pre>

<p> после того, как вы получите данные в базу данных rrd. Граф и небо - это предел :) <a href = http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

ответил Bartłomiej Zarzecki 7 Jam1000000amTue, 07 Jan 2014 05:08:11 +040014 2014, 05:08:11
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, затем эта строка будет передаваться на bc. Будет иметь что-то вроде -7.84000000000000000000, затем просто оберните его до 100-$(value) и снова подать на bc

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

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

ответил Putnik 6 Jpm1000000pmMon, 06 Jan 2014 21:15:52 +040014 2014, 21:15:52
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 27 J000000Monday15 2015, 04:05:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132