在Linux中,如何计算进程中线程使用的CPU百分比?

在Linux中,如何计算进程中线程使用的CPU百分比?,c,linux,multithreading,process,C,Linux,Multithreading,Process,我正在使用一个opencv应用程序,主进程使用3个线程。 我想知道进程中每个线程消耗的CPU百分比 然后阅读,特别是使用CLOCK\u THREAD\u CPUTIME\u ID和CLOCK\u REALTIME。您可能需要计算这些时钟的变化(例如,从线程开始)及其变化率。您可能希望将clock_gettime(或其增量)的结果转换为double(请参阅),因为struct timespec通常大于机器上的long或任何整数类型。另见 请注意,内核可以将线程从一个内核迁移到另一个内核。请参见所使

我正在使用一个opencv应用程序,主进程使用3个线程。 我想知道进程中每个线程消耗的CPU百分比

然后阅读,特别是使用
CLOCK\u THREAD\u CPUTIME\u ID
CLOCK\u REALTIME
。您可能需要计算这些时钟的变化(例如,从线程开始)及其变化率。您可能希望将
clock_gettime
(或其增量)的结果转换为
double
(请参阅),因为
struct timespec
通常大于机器上的
long
或任何整数类型。另见

请注意,内核可以将线程从一个内核迁移到另一个内核。请参见所使用的

另见。您可能会试图解析
/proc/self/stat
/proc/self/status


还可以查看&&

以获得流程级别的快速且可能不准确(但有意义)的估计,我得到用户+系统时间(来自getrusage())加上实际经过的时间,然后将后者除以前者

可悲的是,我还没有弄清楚如何在线程级别执行此操作,这正是我遇到这个问题的原因。 Linux上有
getrusage(RUSAGE\u THREAD,…)
clock\u gettime(clock\u THREAD\u CPUTIME\u ID,…)
,但是当我使用上述这些函数的结果时,我得到了奇怪的结果。对于那些本应该忙于做简单事情的线程(比如将每个线程1个文件的内容读入2个缓冲区,然后进行比较),估计值接近100%的CPU。然而,这并不取决于我产生的线程数量,因此我可以在一台有4个内核的机器上获得8*100%的CPU,这是不可能的。事实上,top和shell的time命令显示,我远远没有达到CPU的全部负载,平均约为250%(对于4核机器上的8个线程而言)


如果我猜的话,我会说per和in-thread度量函数只度量运行线程所花费的实际时间,不包括大部分(如果不是全部的话)开销,比如上下文切换。这至少应该适用于CLOCK_THREAD_CPUTIME_ID返回的结果(包括getrusage系统时间估计中的线程开销似乎是合理的)。

这是一个好问题,我仍然找不到令人满意的答案,不建议从/proc。。。