我正在使用opencv应用程序,主要进程使用3个线程。 我想知道进程中每个线程消耗的CPU百分比?
答案 0 :(得分:2)
阅读time(7)然后clock_gettime(2),特别是CLOCK_THREAD_CPUTIME_ID
和CLOCK_REALTIME
。您可能想要计算这些时钟的变体(例如,从线程的开始)和它们的变化的比率。您可能希望将clock_gettime
(或其delta)的结果转换为double
(请参阅this),因为struct timespec
通常大于long long
或者您机器上的任何整体类型。另请参阅pthread_getcpuclockid(3)。
请注意,内核scheduler可以将一个线程从一个核心迁移到另一个核心。但请参阅sched_setaffinity(2)使用的pthread_setaffinity_np(3)。
另见proc(5)。您可能想要解析/proc/self/stat
和/proc/self/status
等...
同时查看times(2)& getrusage(2)& pthreads(7)
答案 1 :(得分:0)
对于在过程级别的快速且可能是肮脏(但有意义)的估计,我得到了用户+系统时间(来自getrusage())加上实际经过的实时时间,然后将后者除以前者。
可悲的是,我无法弄清楚如何在线程级别执行此操作,而这正是我遇到此问题的方式。
Linux上有getrusage(RUSAGE_THREAD,...)
和clock_gettime(CLOCK_THREAD_CPUTIME_ID,..)
,但是当我使用上面概述的这些函数的结果时,却得到了奇怪的结果。对于所有应该忙于做简单事情的线程(例如将每个线程1个文件的内容读入2个缓冲区然后进行比较),估计确实接近100%CPU。但是,这不依赖于我产生的线程数,因此我不可能在具有4个内核的机器上获得8 * 100%CPU。的确,top和shell的time命令表明我还远远没有达到CPU的全部负载,平均更多的是大约250%(对于4核计算机示例中的8个线程)。
如果我要猜测的话,逐个线程测量功能仅测量运行线程所花费的实际时间,不包括上下文切换之类的大部分开销(如果不是全部)。至少应将其应用于CLOCK_THREAD_CPUTIME_ID返回的结果(在getrusage的系统时间估计中包括线程开销似乎是合理的。)