Как получить статистику по каждому процессору (system, idle, nice, ...), как это делает команда top? - PullRequest
8 голосов
/ 23 января 2010

В linux я хотел бы знать, какой API-интерфейс "C" вызывать для получения статистики для каждого процессора.

Я знаю и могу прочитать /proc/loadavg из моего приложения, но это общесистемные средние значения загрузки, а не информация для каждого процессора. Я хочу отличить отдельные процессоры или ядра.

В качестве примера приложения, которое делает это, когда я запускаю 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, но это привело к гнезду крысы.

Ответы [ 3 ]

6 голосов
/ 24 января 2010

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

2 голосов
/ 23 января 2010

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

0 голосов
/ 23 января 2010

Я предполагаю, что файл ядра timer.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);
    }
}
...