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

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

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

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
4b9b3361

Ответ 1

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

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

Если вы хотите вычислить нагрузку с /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 "%"}'

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Немного изменен # 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 все еще является длительностью между образцами