LINUX.ORG.RU

/proc/stat как правильно посчитать загрузку по ядрам?

 , ,


0

1

С Наступающим Новым Годом, коллеги!

Поступила задача считать загрузку по ядрам. Вроде задача простая. Распарсить /proc/stat и посчитать… Парсинг и заполнение структур - вопрос решенный. Затык в формуле расчета. Рытье гугла не дало хорошего результата. Чуть ли не у каждого автора формула своя! И есть заметные отличия значений с top.

Общий алгоритм ясен: распарсить /proc/stat (выполнено). Заполнить структуру или массив интов (выполнено). Подождать некоторое время и повторить процедуру. Дальше работать с разностью значений (тут тоже понятно). Посчитать результат (ни фига не понятно по какой формуле).

https://azrr.info/page/view/19-poluchaem-svedeniya-o-sisteme-iz-proc-i-sys.html На мой взгляд, ближе всего к top, если таймаут одинаковый.

https://www.idnt.net/en-US/kb/941772 Результат хуже. Возможно я плохо перевел формулу из bash в с.

https://github.com/hightemp/docLinux/blob/master/articles/%D0%9A%D0%B0%D0%BA%20%D1%80%D0%B0%D1%81%D1%81%D1%87%D0%B8%D1%82%D1%8B%D0%B2%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D1%8F%20%D0%B8%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%A6%D0%9F%20Linux.md Вообще фигня.

Перед НГ голова переваривать рабочие вопросы совсем отказывается, абы загружена на 147%% приобретением подарков. Потому прошу помощи в, наверное, элементарном вопросе.

Если кто-то оторвется от подготовки к празднику и решит подсказать, что-то полезное, буду очень благодарен.

Для простоты взаимопонимания предложу свою структуру (с)

struct coreinfo{
    int cpu_num;
    int user;
    int nice;
    int system;
    int idle;
    int iowait;
    int irq;
    int softirq;
    int steal;
    int guest;
    int guest_nice;
};

UPD Есть ли способ откуда-то считать температуру процессора без lm-sensor?



Последнее исправление: HighMan (всего исправлений: 2)

А не проще было в исходниках top посмотреть?

Насколько я знаю, здесь действительно нет какого-то эталонного единственно правильного решения, и разные программы могут считать по-разному.

anonymous
()
Ответ на: комментарий от anonymous

А не проще было в исходниках top посмотреть?

Ответ, конечно, хорош!

Но вы себе представляете какой объем кода придется перелопатить что бы получить формулу?

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 1)

man procfs

я считаю загрузку (сумма всех состояний, за исключением idle и iowait) / (сумма всех состояний), не знаю как это соотносится с top, но эти относительные циферки вполне годятся для домашнего показометра

анон правильно говорит, что если хочешь, чтобы было как в топе, то смотри исходники. лопатить там ничего не надо, надо просто поискать, grep’ом, например, по /proc/stat или atoi, например, или просто по файликам глазками побегать. найти тебе?

anonymous
()
Ответ на: комментарий от HighMan

Но вы себе представляете какой объем кода придется перелопатить что бы получить формулу?

Я не сишник, но код на этом языке иногда лопатил, и вроде не так это сложно. Правда, код обычно был хорошего качества, но тут я бы такой и ожидал. Загляну вечером, самому интересно стало даже.

anonymous
()

https://github.com/shdown/luastatus/blob/master/plugins/cpu-usage-linux/cpu-usage-linux.lua

UPD Есть ли способ откуда-то считать температуру процессора без lm-sensor?

/sys/class/thermal/thermal_zone*/temp
/sys/class/hwmon/*/temp*_input

Там лежат градусы, умноженные на 1000. Не все из этих сенсоров одинаково полезны и не все относятся к CPU. Подробнее, опять же, тут: https://github.com/shdown/luastatus/blob/master/examples/i3/cpu-temperature.lua

shdown
()

Короче, вот, procps (top) считает вот так: https://gitlab.com/procps-ng/procps/-/blob/master/library/stat.c?ref_type=heads#L576

И похоже, что это неправильно. Там же, в каменте, они ссылаются на подсчёт cputime в ядре в cgroups, где, на самом деле, не учитываются guest и guestnice, так как потребление цпу в этих двух состояниях уже учтено в user и nice. htop считатет так же как cgroups.

Получается, что правильный вариант подсчёта загрузки CPU из /proc/stat будет таким:

i = idle + iowait
b = user + nice + system + irq + softirq + steal
t = i + b
pcpu = 100% * b / t
anonymous
()