2009-09-23 14 views
6

Chcę zgłosić ilość czasu procesora używanego przez jeden wątek w procesie serwera (napisana w języku C/C++ w systemie Linux). Nie mogę znaleźć odpowiednika funkcji GetThreadTimes() w systemie Windows, ale tego właśnie szukam.Statystyki procesora dla wątków w systemie Linux

Czy ktoś może wskazać mi właściwy kierunek?

+0

podzbiór tego pytania? http://stackoverflow.com/questions/1431569/tracking-threads-memory-and-cpu-umonsption –

Odpowiedz

6

getrusage (2) z RUSAGE_THREAD. Od strony man:

int getrusage(int who, struct rusage *usage); 

getrusage() returns resource usage measures for who, which can be one of the following: 

[...] 

     RUSAGE_THREAD (since Linux 2.6.26) 
      Return resource usage statistics for the calling thread. 
+0

Z jakiej wersji Linuksa pochodzą? Zrobiłem "męski rusage" na Ubuntu 8.04 (z zainstalowanymi wszystkimi dokumentami do programowania) i nic nie zwróciło. Jeśli jest powszechnie dostępna, to prawdopodobnie jest lepszym rozwiązaniem niż ten, który opublikowałem. – kdgregory

+0

Upewnij się, że a) masz zainstalowane pakiety "manpages-dev" i "manpages-posix-dev" oraz b) powiedz "man getrusage" –

+0

Dziwne, mam to na testach Debiana. Jest to z pakietu manpages-dev wersja 3.22-1. – tsg

3

Standardowy interfejs statystyk jądra per-procesu jest /proc plików. Jeśli wykonasz "man proc", zobaczysz, jakie informacje są przechowywane, ale dla zużycia zasobów dla poszczególnych wątków potrzebujesz /proc/PID/task/TID/stat, gdzie PID to identyfikator procesu, a TID to identyfikator wątku.

Oto kilka przykładowych wyników dla mojej obecnej powłoki; trzeba spojrzeć na manpage aby je rozszyfrować:

> more /proc/25491/task/25491/stat 
25491 (bash) R 25490 25491 25491 34820 25515 4194304 955 5748 0 0 0 0 19 4 20 0 
1 0 67845700 4792320 505 4294967295 134512640 135194160 3216008544 3216007164 30 
86844944 0 65536 3686404 1266761467 0 0 0 17 0 0 0 0 0 0 
0

clock_gettime (2) z CLOCK_THREAD_CPUTIME_ID. Oto przykład, aby uzyskać czas procesora na wątek w sekundach:

struct timespec ts; 
if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0) { 
    return (double)ts.tv_sec + (double)ts.tv_nsec/1000000000; 
} 
return 0; 
Powiązane problemy