Как я получаю статистику на CPU (система, неактивная, хорошая, …) как “главная” команда делает?

На 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 но ведомый к вложенному множеству крысы.

8
задан skaffman 23 January 2010 в 12:57
поделиться

3 ответа

Файл, который вам нужен, это /proc/stat. (Возможно, вы захотите обратиться к fs/proc/stat.c в исходном коде ядра Linux)

.
6
ответ дан 5 December 2019 в 20:16
поделиться

Это не реальный ответ, но я бы взглянул на исходный код Top.

2
ответ дан 5 December 2019 в 20:16
поделиться

Я думаю, что таймер.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);
    }
}
0
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: