2009-09-23 85 views
6

我想要報告服務器進程中每個線程使用的CPU時間量(用Linux上的C/C++ 編寫)。我無法在Windows上找到相當於GetThreadTimes()的東西,但這就是我正在尋找的東西。Linux中的每個線程CPU統計信息

任何人都可以指向正確的方向嗎?

+0

此問題的子集? http://stackoverflow.com/questions/1431569/tracking-threads-memory-and-cpu-consumption – 2009-09-23 20:56:16

回答

6

getrusage(2)與RUSAGE_THREAD。從手冊頁:

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

這是從哪個版本的Linux?我在Ubuntu 8.04上安裝了一個「man rusage」(安裝了所有的開發文檔)並且沒有任何返回。如果它通常可用,那麼它可能是比我發佈的更好的解決方案。 – kdgregory 2009-09-23 21:12:19

+0

確保你a)安裝了包'manpages-dev'和'manpages-posix-dev'並且b)說'man getrusage' – 2009-09-23 21:17:38

+0

奇怪的是,我在Debian測試中使用它。它來自軟件包manpages-dev版本3.22-1。 – tsg 2009-09-23 21:18:04

3

的標準接口,每個進程的內核統計信息是/proc文件系統。如果您執行「man proc」,則可以看到存儲了哪些信息,但對於每個線程資源消耗,您需要/proc/PID/task/TID/stat,其中PID是進程ID,TID是線程ID。

這是我當前shell的一些示例輸出;您需要查看聯機幫助頁以解密它:

> 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)with CLOCK_THREAD_CPUTIME_ID。下面是一個以秒爲單位獲得每線程CPU時間的示例:

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