2010-01-23 9 views
8

Na Linux-ie chciałbym wiedzieć, do czego służy API "C", aby uzyskać statystyki per-cpu.Jak mogę uzyskać statystyki per-cpu (system, jałowy, ładny, ...), tak jak robi to polecenie "top"?

Wiem i mogę przeczytać /proc/loadavg z poziomu mojej aplikacji, ale jest to ogólnosystemowe obciążenie, a nie informacje o jednostce centralnej. Chcę odróżnić poszczególne procesory lub rdzenie.

Jako przykład aplikacji, która to robi, kiedy biegnę top i naciśnij "1", widzę procesory/rdzenie jak to 4 lub 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 

Próbowałem strace top ale to doprowadziło do gniazda szczura.

+0

To interesujące pytanie powinno zostać przeniesione na [Unix i Linux.SE.] (Http://unix.stackexchange.com/?as=1) – Vorac

+0

@ Vorac uh, nie? Pyta o C API. Nie powłoki ani pliki urządzeń jądra (chociaż '/ proc' będzie prawdopodobnie i tak używane). – rubenvb

+0

@rubenvb, masz dobry punkt. Z drugiej strony. czytanie pliku w/proc dotyczy w równym stopniu użytkowników, administratorów i programistów. I pytanie jest specyficzne dla Linuksa. Ale tutaj jest też tag 'linux'. Z drugiej strony ta strona jest dość przeciążona i byłoby miło rozpowszechnić niektóre tematy do jej siostrzanych SE-es. Och, tak się pomyliłem. – Vorac

Odpowiedz

6

Plik chcesz to /proc/stat. (Możesz odwołać się do fs/proc/stat.c w źródle jądra Linuksa).

+0

Dokładnie tego, czego szukałem! Dziękuję Ci. –

2

To nie jest prawdziwa odpowiedź, ale chciałbym rzucić okiem na kod źródłowy góry.

+0

Kod źródłowy do góry można znaleźć tutaj: http://sourceforge.net/projects/unixtop/ – jschmier

0

Domyślam się, że plik timer.c jądra może mieć pewne znaczenie w tym scenariuszu do obliczania średnich obciążeń. Z calc_load funkcji plik timer.c()

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); 
    } 
} 
Powiązane problemy