Получение загрузки процессора в реальном времени

11

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

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

Выход:

14.5

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

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

Кетан Патель
источник
мониторинг в режиме
Qasim
Этот простой скрипт bash делает именно это: askubuntu.com/a/450136/243213
Крейг ван Тондер

Ответы:

20

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

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Без задержки в одну секунду vmstatможно печатать только средние значения с момента загрузки.)

Павел
источник
Не дает мне точный% (по сравнению с htop)
Лепе
1
Вы должны использовать vmstat 1 2это следующим образом: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] В противном случае ваш vmstatбудет давать значения с момента загрузки, что, вероятно, не то, что вы после.
Джо
Джо, спасибо, это работает. Пол, пожалуйста, отредактируйте ответ, чтобы каждый мог видеть правильную командную строку
Павлос Теодору
Спасибо, что поймали это, Джо и Павлос! Я не заметил эту часть справочной страницы.
Поль
9

Это известная проблема с top. Как объяснено здесь , первая итерация top -bвозвращает проценты с момента загрузки, поэтому нам нужно как минимум две итерации ( -n 2) для получения текущего процента. Чтобы ускорить процесс, вы можете установить значение delay между итерациями равным 0.01. topраспределяет загрузку процессора между пользователем, системными процессами и niceпроцессами, нам нужна сумма трех. Наконец, вы grepв строке, содержащей проценты ЦП, а затем используете gawkдля суммирования пользовательских, системных и хороших процессов:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode
terdon
источник
Любой другой метод, включая sar, mpstat ... и т. Д., Показывает 2/3%, тогда как эта команда всегда показывает 50%.
CMCDragonkai
@CMCDragonkai числа должны измениться (я только что проверил), вы уверены, что правильно скопировали / вставили? Также обратите внимание, что в системах с несколькими ЦП topбудет сообщаться процент использования в процентах от одного ЦП. Это означает, что вы часто будете получать гораздо более высокие проценты. Смотрите пункт 9 здесь .
тердон
Я думаю, что эта команда может быть несовместима с моей системой. Но очевидно, что все другие методы, которые я пробовал, дают мне процент 1/2/3%, что я вижу, если я запускаю htop, тогда как эта команда дает мне аномалию.
CMCDragonkai
@CMCDragonkai это из-за нескольких процессоров. Вы можете либо получить возвращаемое число и разделить его на количество ядер, либо использовать topв интерактивном режиме (просто запустить top), а затем нажать I(shift + i), чтобы увидеть разбивку по ядрам.
тердон
У меня только 1 процессор.
CMCDragonkai
7

Я пробовал несколько способов, но это кажется мне наиболее точным:

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)}'

Получил это отсюда

Лепе
источник
В моем Linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sat 19 мая 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) нет столбца $ 15 (строка процессора в файле / proc / stat) : процессор 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Кемин Чжоу
1
Лучший ответ! Благодарность! Мой вариант: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp
Отличие maXp в том, что его печать округляется с одним десятичным знаком:, %.1fчто, на мой взгляд, более читабельно и полезно для человека, если вы используете этот вывод в других скриптах.
Леп
0

Использование -n2. Это выведет две строки. При первой topпечати строка не соответствует состоянию на данный момент времени. Затем настройте ваш скрипт так, чтобы он игнорировал первую строку.

ИЛП
источник