Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中的每线程CPU统计_C_Linux - Fatal编程技术网

Linux中的每线程CPU统计

Linux中的每线程CPU统计,c,linux,C,Linux,我想报告服务器进程中每个线程使用的CPU时间量(用C/C编写)++ 在Linux上)。我在Windows上找不到与GetThreadTimes()等效的,但这正是我要寻找的 有人能给我指出正确的方向吗?用RUSAGE\u线程获取RUSAGE(2)。从手册页: int getrusage(int who, struct rusage *usage); getrusage() returns resource usage measures for who, which can be one of

我想报告服务器进程中每个线程使用的CPU时间量(用C/C编写)++ 在Linux上)。我在Windows上找不到与GetThreadTimes()等效的,但这正是我要寻找的

有人能给我指出正确的方向吗?

用RUSAGE\u线程获取RUSAGE(2)。从手册页:

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.

每个进程内核统计信息的标准接口是
/proc
文件系统。如果执行“
manproc
”,您可以看到存储了哪些信息,但是对于每个线程的资源消耗,您需要
/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
clock_gettime(2)和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;

这个问题的子集?这是什么版本的Linux?我在Ubuntu 8.04上做了一个“man rusage”(安装了所有的开发文档),它没有返回任何东西。如果它是普遍可用的,那么它可能是一个比我发布的更好的解决方案。确保你a)安装了“manpages dev”和“manpages posix dev”包,b)说“man getrusage”奇怪,我在Debian测试中有它。它来自manpages开发包版本3.22-1。非常奇怪:我以为我安装了manpages开发包,因为我可以执行“man pthread_create”,但显然不行。这显然比我的答案要好,所以+1。好吧,听起来不错,除了我的getrusage手册页没有声明任何关于RUSAGE_线程的知识。我看到这只出现在内核2.6.26及更高版本中。我运行的是RedhatES5.2,它来自“uname-a”,声称是2.6.18。我想这意味着我现在运气不好。不幸的是,在重载情况下,此文件无法打开70%的时间。因此,强烈建议使用@tsg提供的答案中的getrusage()。