Linux中每个线程的CPU统计信息

7

我希望能够报告Linux上用于服务器进程(使用C/C++编写)中每个线程所使用的CPU时间。我找不到Windows上GetThreadTimes()函数的等价物,但这正是我正在寻找的。

有没有人能指点一下我?


这是一个关于编程的问题吗?https://dev59.com/HUnSa4cB1Zd3GeqPNWBu - P Shved
3个回答

7

使用RUSAGE_THREAD的getrusage(2)。来自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.

这是哪个Linux版本?我在安装了所有开发文档的Ubuntu 8.04上执行了“man rusage”,但没有返回任何内容。如果它通常可用,那么它可能比我发布的解决方案更好。 - kdgregory
确保您 a) 已安装 'manpages-dev' 和 'manpages-posix-dev' 包,并且 b) 输入 'man getrusage' - Dirk Eddelbuettel
奇怪,我在Debian测试版上有它。它来自manpages-dev软件包版本3.22-1。 - tsg
非常奇怪:我以为我已经安装了manpages-dev,因为我可以使用“man pthread_create”,但显然不是这样。那绝对比我的答案更好,所以+1。 - kdgregory
好的,那听起来没问题,除了我的getrusage手册没有提到RUSAGE_THREAD的任何信息。我看这只在2.6.26及以上的内核中才有。我正在运行RedHat ES 5.2,从“uname -a”命令的输出来看,它声称是2.6.18版本的。我想这意味着目前我没戏了。 - Pete Smoot
与GetThreadTimes不同,getrusage似乎不支持对非当前线程的调用... - namey

6

与每个进程内核统计信息的标准接口是/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

不幸的是,在重负载下,这个文件在大约70%的情况下无法打开。因此,强烈建议使用 @tsg 的答案中提到的 getrusage() 函数。 - No-Bugs Hare

2

使用CLOCK_THREAD_CPUTIME_ID的clock_gettime(2)函数。下面是一个获取每个线程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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接