Как эффективно рассчитать загрузку процессора, используя 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
Другие вопросы по тегам