Вычисление загрузки процессора с помощью ps, awk и sysctl - PullRequest
0 голосов
/ 28 октября 2019

В моей конфигурации tmux мне нравится отображать некоторые основные статистические данные (загрузка ЦП, использование памяти и т. Д.) В строке состояния внизу. Чтобы вычислить загрузку процессора, я ранее делал следующее:

cpuusage=$(ps -Ao pcpu | awk '{sum = sum + $1}END{printf "%4.1f", sum}')

Это работало на моем старом ноутбуке с Ubuntu, где значение $cpuusage варьировалось от 0.0 до 100.0. Но, переходя на свой Mac, я начал получать значения загрузки процессора, такие как 113.7 или 239.8 - намного выше максимального значения 100.0, которое я ожидаю. Ответ был довольно быстро очевиден: он дает возможность использовать одно ядро, а эта машина имеет 12 ядер.

Чтобы исправить это, я хотел бы разделить на количество ядер. Чтобы получить количество ядер, я использовал sysctl -n hw.ncpu. На моем Mac это возвращает 12. Затем я попытался разделить так:

cpupercent=$(($cpuusage/$(sysctl -n hw.ncpu)))

До тех пор, пока cpuusage было целым числом, кратным 12, это работало (например, когда $cpuusage было точно 60, это возвращало 5)однако всякий раз, когда использование не делилось на 12, это просто возвращало пустую строку.

Я подозреваю, что проблема в том, что $cpuusage - это строка, а не целое число или число с плавающей запятой (и после некоторых фундаментальных исследований я 'мы определили, что Bash на самом деле не поддерживает операции с плавающей точкой), но я не уверен, как мне решить эту проблему.

Должен ли я ускорить второй awk процесс и передать как использование процессора, так иколичество процессоров, например?

cpupercent=$(awk '{printf "%4.1f", $1 / $2}' <<< $cpuusage $(sysctl -n hw.ncpu))

или есть способ передать количество процессоров непосредственно в первый awk процесс?

cpupercent=$(ps - Ao pcpu | <insert num CPU> | awk '{sum = sum + $1}END{printf "%4.1f", sum / $2}')

или есть какой-то другойинструмент, который я должен использовать для этой работы, например bc?

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вопрос поднимает две точки: (1) источник нагрузки (2) источник подсчета ЦП

(1) источник нагрузки

  • Использовать текущий расчет (сумма пс). Однако обратите внимание, что это (почти) всегда будет недооценивать текущую нагрузку, так как ps %cpu рассчитывается для каждой задачи на основе начальной точки задачи. - смотрите man ps '% cpu' для подробностей.
  • Считайте из / proc системную "официальную" среднюю нагрузку (cat / proc / loadavg)
  • Используйте утилиту, которая извлекает данные:uptime, top -n1 и т. д.

Я предлагаю использовать cat / proc / loadavg

(2) источник подсчета ЦП

Уже решен и обсужден вответ / комментарии.

(3) Деление

Для выполнения операций с плавающей запятой можно использовать либо «awk», либо «bc», либо bash (с использованием масштабирования). Предполагая нагрузку, ncpu вычисляет до:

  • bc: использование: pct=$(echo "scale=1; $load/$ncpu" | bc)
  • awk: использование pct=$(awk 'END { printf "%.1f\n", (0+0+iload)/ncpu}' iload=$load ncpu=$ncpu /dev/null )
  • Pure Bash: Не рекомендуется - неуклюжий: V=$((load*100/ncpu)) ; pct=${V:0:2}.${V: -2}

Из вышесказанного я предпочитаю bc - более простой, легкий для понимания и обслуживания.

0 голосов
/ 28 октября 2019

Вот простая комбинация iostat -c с awk для получения текущей загрузки ЦП.

iostat -c|awk 'awk '/[[:digit:]]$/{print 100-$NF}''

Выходное значение находится между 0-100

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

7.95

Пояснение

iostat -c предоставляет некоторые статистические данные о текущей загрузке ЦП:

Linux 3.10.0-123.el7.x86_64 (psdbperf)  10/28/2019      _x86_64_        (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.68    0.00    0.13    0.32    0.00   98.87

Сценарий awk:

/[[:digit:]]$/ { # if current line ends with a digit
   print (100-$NF) # print 100 - %idle
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...