Как эффективно рассчитать загрузку процессора, используя bash?
Я пытаюсь рассчитать общую загрузку процессора одного процессора, системы Ubuntu, используя bash. Мне нужен общий процент использования процессора для сценария мониторинга системы, который я делаю. Проблема в том, что когда я использую следующий код, процент использования ЦП всегда одинаков:
top -n 1 | grep "Cpu"
Альтернатива, которую я нашел, заключается в использовании следующего кода:
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
echo $CPU
Проблема с этим кодом в том, что я не знаю, полностью ли он точен. У меня есть несколько вопросов... Прежде всего, почему первый код не работает? Во-вторых, надежен ли второй код? Если нет, то какой код я могу использовать, чтобы получить достоверное представление об общей загрузке ЦП системы? Спасибо!
2 ответа
mpstat, доступный в пакете systat, довольно хорош
Вам нужно будет установить systat с помощью apt-get
Ваш код отбрасывает время ожидания ввода-вывода, которое может повлиять на загрузку процессора. Вы можете обратиться к следующей ссылке, чтобы увидеть, что соответствует каждой записи / proc / stat /:
http://man7.org/linux/man-pages/man5/proc.5.html
Общая загрузка ЦП может быть рассчитана по следующей формуле:
CPU_Util = (пользователь + система +nice+softirq+steal)/(пользователь +system+nice+softirq+steal+idle+iowait)
Простой сценарий bash, который рассчитывает загрузку ЦП более 50 мс:
#!/system/bin/sh
# Read /proc/stat file
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
cpu_active_prev=$((user+system+nice+softirq+steal))
cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
usleep 50000
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
cpu_active_cur=$((user+system+nice+softirq+steal))
cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
echo $cpu_util