Как получить общее использование процессора (например, 57%) в Linux [закрыто]

197

Мне интересно, как вы можете получить системное использование процессора и представить его в процентах, например, с помощью bash.

Пример вывода:

57%

Если имеется более одного ядра, было бы хорошо, если бы можно было рассчитать средний процент.

user1199739
источник
1
@julesanchez значение должно быть передано куда-то еще, следовательно, оно должно быть int
user1199739
делать top> myfile.txt И применить ваш фильтр в последующей обработке, не так ли?
JuSchz
11
Команда, которая не требует sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon
7
Повторное открытие Я не понимаю, почему это было сочтено не по теме, могут ли те, кто закрыл его, пожалуйста, уточнить?
Джонатан Х
3
Мое понимание /proc/statочень ограничено, но эта однострочная работа достаточно хороша для меня cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. С% .2f вы можете контролировать количество десятичных знаков, которые вы хотите вывести, а также sleep 1можете установить время, которое вы хотите усреднить, то есть, если оно делает то, что я думаю, оно делает. Вы можете поместить его в цикл bash while, чтобы проверить это в реальном времени.
Йети

Ответы:

174

Взгляни на cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

РЕДАКТИРОВАТЬ, пожалуйста, прочитайте комментарии, прежде чем копировать-вставить это или использовать это для любой серьезной работы. Это не проверялось и не использовалось, это идея для людей, которые не хотят устанавливать утилиту или для чего-то, что работает в любом дистрибутиве. Некоторые люди думают, что вы можете «apt-get install» все, что угодно.

ПРИМЕЧАНИЕ: это не текущее использование процессора, а общее использование процессора во всех ядрах с момента загрузки системы. Это может сильно отличаться от текущего использования процессора. Для получения текущего значения top (или аналогичного инструмента) необходимо использовать.

Текущее использование процессора потенциально может быть рассчитано с помощью:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)
vimdude
источник
12
Но вы должны установить mpstat, как вы рекомендовали выше. Многие люди не имеют такой гибкости. cat / proc / stat тогда pipe намного проще, чем mpstat, который вы рекомендуете.
vimdude
12
+1 Не понимаю, почему анализ другой утилиты лучше, чем анализ/proc/stat
восстановите Monica, пожалуйста,
9
система + пользователь + простоя = 100%. Так что может быть что-то вроде: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude
106
Я думаю, что это решение показывает не текущую загрузку процессора, а среднюю загрузку процессора с момента запуска процессора.
Этьен
11
@jlliagre, да, все верно. Чтобы рассчитать текущее использование процессора, а не среднее, вам нужно взять значение в 1 доллар, затем задержку, затем принять значение в 1 доллар и увидеть разницу. Это текущее использование процессора.
vimdude
102

Можешь попробовать:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'
netcoder
источник
11
Каждый раз, когда я запускаю эту команду, я получаю один и тот же вывод ( 32.7%).
alanaktion
13
Более точный результат дается, когда я использую top -bn2, но это занимает много времени. Из того, что я прочитал, кажется, что это единственный способ получить точный результат.
alanaktion
7
top -bn1кажется дико неточным в моей системе FC20. top -bn2Кажется, работает хорошо.
Мартин Турной
24
Команда в этом ответе написана для систем, где top -vвозвращается procps-ng(например, Fedora). Также есть procps, например, в Ubuntu и CentOS, где команда не работает (всегда указывает на 100%, потому что синтаксический анализ не выполняется из-за того, что цифры процессора по-разному форматируются). Вот версия, которая работает с обеими реализациями:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0
2
Примечание стороны: на OSX, используйте следующее: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0
38

Попробуй mpstatиз sysstatпакета

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Затем некоторые cutили grepдля анализа информации вам нужно:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a
Питер Свенссон
источник
1
Я не верю, что это показывает общий процессор
user1199739
Я бы сказал, что 100% простоя это общее использование процессора (в%)
Питер Свенссон
Это процент «не» используется. Этот ответ был хорош, вплоть до grep | хвост | awk part ...
Иордания
Я бы изменил awkчасть на:, awk -F " " '{print (100 - $12)"%"}'что дает форматирование вывода, как он хотел, но в остальном это выглядит хорошо для меня.
Дэн Фего
1
@jordanm Все истины; Я больше голосовал за это, потому что это работает. Я бы сделал это лично:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Дэн Фего
22

Может также дать реальный ответ моим решением, которое было вдохновлено Питером Лильенбергом:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Это будет использоваться awkдля распечатки 100 минус 12-е поле (незанятое) со знаком процента после него. awkбудет делать это только для строки, где 12-е поле имеет только цифры и точки ( $12 ~ /[0-9]+/).

Вы также можете усреднить пять образцов с интервалом в одну секунду:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Проверьте это так:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'
Дэн Фего
источник
14
Лучше запустить «mpstat 2 1 | ...», чтобы он отображал статистику за последнюю 1 секунду. В противном случае, по умолчанию, mpstat показывает статистику с начала, и это не сильно меняется со временем
Sarang
1
"mpstat | awk '$ 12 ~ /[0-9.]+/ {print 100 - $ 11"% "}'" эта работа для меня.
AloneInTheDark
@Sarang Спасибо большое !! Наконец я могу получить результаты, которые также conkyотображаются. К сожалению, эта строка ОЧЕНЬ медленная, выполнение ее занимает почти целую секунду.
синтаксическая ошибка
6
@syntaxerror Это занимает ровно 2 секунды, потому что если вы посмотрите на справку по команде, вы увидите, что первый аргумент - это интервал, но он выполняется только один раз из-за второго аргумента, поэтому он ждет 2 полных секунды, пока не вернет результат.
Йохан Bjäreholt
Вопрос закрыт, поэтому добавил мой (аналогичный) ответ к вашему :-) Надеюсь, вы не против. Как и вы, меня вдохновил ответ Питера Лильенберга.
PJ Brunet
16

РЕДАКТИРОВАНИЕ: Я заметил, что в ответе другого пользователя% idle было полем 12 вместо поля 11. В awk обновлен учет, что поле% idle является переменным.

Это должно дать вам желаемый результат:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

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

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'
jordanm
источник
2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'отлично работает для меня, спасибо. обратите внимание на mpstat 11, чтобы убедиться, что загрузка процессора выполняется за секунду
chrishiestand
1
Если у вас есть JQ:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
Nyet