Получение использования процессора то же самое каждый раз.

13

Когда я выполняю следующую команду, чтобы получить использование процессора, я получаю хорошее + пользовательское использование процессора.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Выход:

14.5

Здесь я получаю проблему, заключающуюся в том, что вывод зависит от команды top, поэтому она не изменяется мгновенно как команда top. Поэтому я не получаю правильный процессор мгновенно. Это дает тот же вывод и не меняется.

Я хочу получить процессор в реальном времени на выходе. Пожалуйста, помогите мне улучшить мою команду.

Кетан Патель
источник
1
А вопрос такой?
Деннис Каарсемакер
Попробуйте запустить команду с префиксом time. В моей системе это занимает всего 0,165 с.
depquid
Пожалуйста, дайте мне отредактированную команду.
Кетан Патель
Попробуйте:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid
нет разницы в выходе, после тестирования в разных системах
Ketan Patel

Ответы:

13

Вы правы, topпохоже, дает неправильное использование процессора на первой итерации. Вы можете обойти эту проблему следующим образом:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Это, конечно, займет вдвое больше времени, но все равно будет работать.

Если вы все еще хотите, чтобы он работал быстрее, вы можете использовать -dопцию, например, для 1-секундного общего периода измерения используйте половину из этого:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Руслан
источник
serverfault.com/a/436499/134517 также это займет гораздо больше, чем вдвое, так как это займет примерно одну секунду вместо почти ни одного.
altendky
В дополнение к комментарию altendky, см. Также ответ terdon для объяснения, почему проблема существует в первую очередь.
Руслан
6

Технически первое topне всегда выдает одно и то же значение; он просто выводит среднюю загрузку процессора с момента последней загрузки. Поскольку для вычисления нагрузки на процессор topиспользуется дельта /proc/statстатистики, первое значение вычисляется при сравнении с нулем, что дает неверный (но WAD) результат.

Если вы не хотите использовать top, вы можете непосредственно разобрать /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Это также быстрее и точнее.

Вы можете проверить это с stress:

stress -c 1 -q &

И делать

killall stress

после.


источник
Ницца. И если ваша команда помещена в файл с именем «cpu», то на нем watchможно выполнить:watch -n1 "bash ./cpu"
Брент Фауст
Ваш скрипт awk для разбора /proc/statдовольно крутой, но, похоже, он имеет тот же недостаток, что и первая итерация top: он выводит среднюю загрузку процессора с момента последней загрузки, а не текущую.
Pieroxy
5

Просто чтобы расширить ответ @ Руслана, topраспределяющего использование процессора между пользователем, системными процессами и niceпроцессами, мы хотим получить сумму из трех. Итак, мы можем работать topв bрежиме atch, который позволяет нам анализировать его вывод. Однако, как объяснено здесь , 1-я итерация top -bвозвращает проценты с момента загрузки, поэтому нам нужно как минимум две итерации ( -n 2) для получения текущего процента. Чтобы ускорить процесс, вы можете установить время dмежду итерациями 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
Тердон
источник
4

Может быть, использовать это на основе psрезультатов:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }
GHugo
источник
0

Используйте команду watch или для цикла в оболочке,

т.е. watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"

маргаритка
источник
То же самое происходит с часами
Кетан Патель
0

Почему вы заботитесь об использовании процессора? Средняя нагрузка является гораздо лучшим показателем:

cat /proc/loadavg

Если вам действительно требуется загрузка ЦП, /proc/statвозможно, вам нужен синтаксический анализ .

Мартин фон Виттих
источник
1
Средняя нагрузка - это, как правило, интеграл времени использования ЦП (деленный на время). Почему вы говорите, что интегральная характеристика является гораздо лучшим индикатором [всего], чем дифференциальная, если у них совершенно разные варианты использования? Кроме того, /proc/statон не дает использования процессора как есть, нужно прочитать его дважды с некоторым временем между чтениями и сделать некоторые вычисления, чтобы получить использование процессора. Это только то, что topделает.
Руслан
Я не умею математику, поэтому должен признать, что на самом деле я не понимаю разницу между интегралом и дифференциалом: / «Среднее значение нагрузки - это, в основном, интеграл времени от загрузки процессора» - так ли это? AFAIK процесс, который зависает в состоянии D, вызывает увеличение нагрузки, но не использует процессор. «Почему вы говорите ...» - ОП не говорит, чего он действительно хочет достичь, поэтому, честно говоря, я просто предполагаю, что он хочет измерить нагрузку на свою систему и подумал, что использование процессора будет лучшим индикатором для этого. вот я и направил его на среднюю нагрузку.
Мартин фон Виттих
По вашей ссылке: «Системы рассчитывают среднее значение нагрузки как экспоненциально демпфированное / взвешенное скользящее среднее числа нагрузки». и «нагрузка на систему - это мера объема вычислительной работы». Состояние D не требует какой-либо вычислительной работы. То, что нужно, это процессы, которые используют процессорное время. Таким образом, средняя нагрузка - это, в основном, процент времени, в течение которого процессор не работал в течение некоторого периода времени (скажем, от минут до десятков минут). А загрузка ЦП - это процент времени, в течение которого ЦП не простаивает в масштабе миллисекунд - т.е. обновляется каждый раз, когда вы его читаете, и отражает текущее состояние.
Руслан
-2

Используя sarкоманду

sar 1 10

Это означает: получить результат 10 раз в секунду

Филип Нгун
источник