如何在Redhat Linux中获取线程CPU利用率指标

8
我需要获取一个进程中所有线程的 CPU 使用率指标。
  • 操作系统 = 红帽 Linux
  • 编程语言 = 使用 POSIX 的 C++
  • 要求 = 需要无限制地每隔几秒钟取样,而不仅仅是一次快照。
  • 限制条件 = 不允许在线程中编写其他代码。

    我知道可以使用 "top" 命令,但还有其他方法吗?是否有 ps 的标志?

非常感谢您提供的所有帮助。

4个回答

8
您可以阅读/proc/[您的PID]/stat的内容,获取整个进程的信息,如果您有2.6内核,则还有/proc/[您的PID]/task/[线程ID]/stat,其中包含单个线程的信息。(参见这里)。
具体而言,您会发现这两个字段:
  • 在用户模式下调度此进程的jiffies数。
  • stime %lu
  • 在内核模式下调度此进程的jiffies数。
  • cutime %ld
问题在于给出值的单位。一个jiffy是1/HZ秒,其中HZ是内核时钟滴答率,确定此时钟速率是困难的。
如果您只需要这个特定系统的信息,您可以进行一些测试或查看您的内核头文件,并将此值硬编码到程序中。如果您想以更通用的方式确定它,您可以查看像top这样的工具如何做到这一点,方法是查看其源代码(请参见old_Hertz_hack()函数和相关注释)。

我找到了一种获取特定机器上Hz值的方法:cat /boot/config-uname -r | grep HZ - Anupam Saini
你可以使用这个工具来获取提到的HZ值:getconf CLK_TCK。我不确定如何在C程序中直接获取该值,而不调用外部工具。 - undefined

1
可能更简单的方法是使用 getrusage 和 Linux 特定扩展 RUSAGE_THREAD。一旦你有了这些时间,你只需要减去上次采样的时间,并除以自上次采样以来经过的实际时间。这样你就可以得到 CPU 使用率的百分比。
有关 Linux 特定文档,请参阅 rusage liunx man page

0

你可以使用 "top" 命令先找到进程 ID。

然后,你可以使用以下命令仅显示该进程的 CPU/内存使用情况。

top -p {pid}

之后,您可以按下“Shift”+“h”来显示线程


0

你可以使用在Linux中可用的GNU Gprof来完成这个任务。我相信他们声称支持线程,但这比在进程级别上进行分析更加复杂,因此你可能无法得到你想要的结果。

这里有一个howto适用于你的情况。


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