[Решено] Показатель загрузки процессора по /proc/stat, mpstat и т.д.

Всем хорошего времени.
Прочитал статью на хабре по поводу load average и решил ради любопытства мониторить этот показатель и сопоставлять его с показателем общей загрузки в данный момент.
Как указано в названии, использую скрипт на основе данных из /proc/stat и утилку mpstat. Вот, что они отображают:

В данный момент идет загрузка от конвертера ffmpeg. По htop и loadaverage (который на панели 'LA:') видно, что загрузка идет серьезная. В то же время по показаниям mpstat и скрипту, у меня 91% времени процессора idle. Объясните, пожалуйста, этот момент.
Absalon
меня 91% времени процессора idle.

По моему современные процессоры имеют свои настройки управления питанием. Может планировщик удерживает одно ядро для выполнения чего-то?
Вроде бы современные процессоры не обращают внимание на инструкцию iddle. Но это мое мнение.
serg66
По моему современные процессоры имеют свои настройки управления питанием. Может планировщик удерживает одно ядро для выполнения чего-то?
Вроде бы современные процессоры не обращают внимание на инструкцию iddle. Но это мое мнение.
Ничего не могу сказать по этому поводу, не изучал вопрос с такой стороны.

К слову, в скрипте я видимо ошибся, не учтя динамику показателей, которую нужно было учесть.
Если сделать так:
#!/bin/env python3
import time
total1 = 0
total2 = 0
stat1 = open('/proc/stat', 'r')
lst1 = stat1.readlines()
idle1 = int(lst1[0].split(' ')[5])
for load1 in lst1[0].split(' ')[2:9]:
    total1 += int(load1)
stat1.close()
time.sleep(1)
stat2 = open('/proc/stat', 'r')
lst2 = stat2.readlines()
idle2 = int(lst2[0].split(' ')[5])
for load2 in lst2[0].split(' ')[2:9]:
    total2 += int(load2)
stat2.close()
diff_total = total2 - total1
diff_idle = idle2 - idle1
usage = 100 * (diff_total - diff_idle) / diff_total
print(round(usage, 2), '%')
То расчет идет +- правильный, по крайней мере сравнивая с показаниями htop.
Я тоже, было, писал по прочитаному, но не показывало оно как надо, пока не подсмотрел тут:
https://github.com/i3/i3status/blob/master/src/print_cpu_usage.c

tmp=`grep 'cpu ' /proc/stat | tr -s \ `
curr_user=`cut -d \  -f 2 <<< $tmp`
curr_nice=`cut -d \  -f 3 <<< $tmp`
curr_system=`cut -d \  -f 4 <<< $tmp`
curr_idle=`cut -d \  -f 5 <<< $tmp`
curr_total=$((curr_user+curr_nice+curr_system+curr_idle))
diff_idle=$((curr_idle-prev_idle))
diff_total=$((curr_total-prev_total))
diff_usage=$(((1000*(diff_total-diff_idle)/diff_total+5)/10))
prev_total=$curr_total
prev_idle=$curr_idle
Aivar
Я тоже, было, писал по прочитаному, но не показывало оно как надо, пока не подсмотрел тут:
https://github.com/i3/i3status/blob/master/src/print_cpu_usage.c
Не знаю С, если это он, но чисто арифметически вроде те же вычисления. Значит я не правильно интерпретировал показания /proc/stat. Нужно смотреть не на статику, а сравнивать значения до и после. Когда работал на виндовс никогда не задумывался, что в принципе означает показатель загрузки кроме эфемерных процентов. Оказывается, это отношение процессорного времени в момент времени N по отношению к моменту времени N-x.
Именно, на что и намекают curr и prev в именах переменных.
Я привел часть скрипта. У меня цикл повторяется каждую секунду, но в данном случае это неважно.
 
Зарегистрироваться или войдите чтобы оставить сообщение.