На Linux я хотел бы знать что "C" API звонить для получения статистики на CPU.
Я знаю об и мог читать /proc/loadavg
из моего приложения, но это - средние числа загрузки в масштабе всей системы, не информация на CPU. Я хочу сказать отдельные центральные процессоры или ядра независимо.
Как пример приложения, которое делает это, Когда я работаю top
и нажмите "1", я вижу 4 или 8 процессоров/ядер как это:
Cpu0 : 4.5%us, 0.0%sy, 0.0%ni, 95.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 42.2%us, 6.2%sy, 0.5%ni, 51.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 3.0%us, 1.5%sy, 0.0%ni, 94.5%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st
Cpu3 : 7.0%us, 4.7%sy, 0.0%ni, 88.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Я попытался strace top
но ведомый к вложенному множеству крысы.
Файл, который вам нужен, это /proc/stat
. (Возможно, вы захотите обратиться к fs/proc/stat.c
в исходном коде ядра Linux)
Это не реальный ответ, но я бы взглянул на исходный код Top.
Я думаю, что таймер.c файла ядра может иметь некоторое значение в этом сценарии для расчета средних значений нагрузки. Из файла timer.c функция calc_load()
unsigned long avenrun[3];
static inline void calc_load(unsigned long ticks)
{
unsigned long active_tasks; /* fixed-point */
static int count = LOAD_FREQ;
count -= ticks;
if (count < 0) {
count += LOAD_FREQ;
active_tasks = count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
}
}