我需要获取进程中所有线程的 CPU 利用率指标。
- 操作系统 = Redhat linux
- 编程语言 = 使用 POSIX 的 C++
- 要求 = 需要每隔几秒不明确地采样一次,而不仅仅是及时的一个快照。
约束 = 不允许在线程中编写额外的代码
我知道你可以使用“top”命令,但是还有什么其他的方法呢?“ps”有标志吗?
预先感谢您的所有帮助。
我需要获取进程中所有线程的 CPU 利用率指标。
约束 = 不允许在线程中编写额外的代码
我知道你可以使用“top”命令,但是还有什么其他的方法呢?“ps”有标志吗?
预先感谢您的所有帮助。
您可以阅读 的内容/proc/[your PID]/stat
以获取整个过程的信息,如果您有 2.6 内核,则还/proc/[your PID]/task/[thread ID]/stat
包含各个线程的信息。(见这里)
具体来说,您会发现这两个字段:
此进程已在用户模式下调度的 jiffies 数。
时间%lu
此进程已在内核模式下调度的 jiffies 数。
可爱的 %ld
这里有问题的部分是给出值的单位。一个 jiffy 是 1/HZ 秒,其中 HZ 是内核时钟滴答速率,确定这个时钟速率是困难的部分。
如果你只需要一个特定的系统,你可以做一些测试或查看你的内核头文件并将这个值硬编码到你的程序中。如果您想知道如何以更一般的方式确定它,您可以通过查看其源代码来了解像 top 这样的工具是如何做到的(请参阅old_Hertz_hack()
函数和相关注释)
可能一种更简单的方法是使用getrusage和 .linux 的特定扩展名RUSAGE_THREAD
。一旦有了这些时间,您就可以减去上次采样的时间,然后除以自上次采样以来经过的实际时间。也就是说,您以百分比形式获得 CPU 使用率。
有关 linux 特定文档,请参阅rusage liunx 手册页。
您可以使用 Linux 中可用的gnu gprof来执行此操作。我相信他们声称支持线程,但这比进程级别的分析更复杂,因此您可能无法获得您正在寻找的结果。
这是针对您的情况的方法。
您可以先使用“top”命令查找进程 ID。
之后,您可以使用以下命令仅显示进程的 CPU/Memory 使用情况
top -p {pid}
之后,您可以按“Shift”+“h”显示线程