Почему загрузка процессора не меняется более чем на несколько сотых?

Я запускаю эту команду

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

Все же это только выводит что-то вроде 0.99xxxx%

Если я сделаю обновление apt-get или любой другой процесс, я бы предположил, что он превысит 1%. Даже бегущее напряжение -c 1 ничего не меняет.

Есть ли способ точно зарегистрировать загрузку процессора? Сервер имеет 1 vCPU.

Нужно иметь этот журнал каждые 5 секунд.

while sleep 5; do "code" >> logfile; done

3 ответа

Почему загрузка процессора не меняется более чем на несколько сотых?

Так как /proc/stat возвращает агрегированную статистику загрузки процессора с момента последней загрузки системы, а не в режиме реального времени. Если вы запустите свой скрипт сразу после перезагрузки, заявленная нагрузка может значительно измениться, если сама загрузка ЦП изменится. Однако чем дольше выполняется скрипт, тем меньше изменения нагрузки будут влиять на отображаемое значение, и через некоторое время значение будет по существу оставаться постоянным.

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

while sleep 5; do grep -w cpu /proc/stat ; done | \
    awk '{
        print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
        o2=$2;o4=$4;o5=$5}'

В противном случае более простой, но менее точный способ может быть:

vmstat -n 5 | \
    awk '{used=$13+$14;total=used+$15
          if(total>0) print used*100/total "%"}'

Если вы хотите записать наибольший процент процессора (то есть процесс с наибольшим использованием процессора на момент запроса), вы можете использовать:

ps -e -o %cpu | tail -n +2 | sort -r | head -n 1 > cpu-usage.log

Объяснение команды:

  • ps -e -o %cpu дает вам информацию о процессе непосредственно в формате oput, который состоит только из процента использования процессора

  • tail -n +2 фильтрует предыдущий вывод, начиная со второй строки (игнорируя заголовок, напечатанный ps)

  • sort -r сортировать значения в обратном порядке (сначала по возрастанию)

  • head -n 1 фильтрует данные, возвращаемые sort так что вы отбрасываете все, кроме первой строки

Слегка модифицированный #3 для моих собственных нужд:

for x in $(seq 1 11);do sleep 5;grep -w cpu /proc/stat ; done | \
awk '{
    print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
    o2=$2;o4=$4;o5=$5}'

Где seq - количество взятых образцов, Sleep - это промежуток времени между выборками.

Другие вопросы по тегам