如何在Linux中计算多进程应用程序的CPU使用情况

5
我试图用C/C++编写一个程序,使其像Linux中的top命令一样运行。 我已经进行了一些研究,已经知道如何计算进程的CPU使用率。我们可以通过计算/proc/[PID]/stat中的stime + utime在当前时间和几秒钟后来获取CPU使用情况。然后计算stime + utime差异并将结果除以uptime差异,然后我们就得到了CPU使用百分比。对于单个进程/多线程进程,这将非常容易。 问题出现在像httpd这样的多进程情况下。当Web服务器繁忙时,httpd会派生子进程来服务大量请求。然后我计算总进程数,假设为500。我想计算这些进程的CPU使用率,但是将它们汇总起来,所以我只看到1个httpd CPU使用率。但是,如果我按照上面提到的算法进行计算,当进程数量在几秒钟后减少到<500时,我会得到负值,因为计算将如下(例如,我随意选择了一个数字,只是为了给您简要描述):
Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874

如果您看上面的例子,Stime + Utime的差将产生负值,因为进程数量在减少,并且在几毫秒后给出较低的值。我只想知道是否有其他计算方式来处理这种进程行为?谢谢。


你如何确定进程集?通过它的进程组吗?通过程序名称吗? - Basile Starynkevitch
首先,我获取主父进程。我知道它的ppid为1,假设它的pid为1227。然后,在整个/proc/目录中搜索,该目录的ppid为1227。如果/proc/pid1/stat具有ppid 1227,则将其utime和stime添加到1227 utime和stime中。 - Luck Haryadi
2个回答

1

我建议将每个进程的数据分开保存。
当你有一个新样本时,每个进程可能属于以下三种情况之一:
1. 之前和之后都存在 - 从新值中减去旧值。
2. 现在存在,但以前不存在 - 只需使用新值。
3. 以前存在,但现在不存在 - 忽略它。这里可能会有遗漏,因为它可能在你的采样期间使用了90%的CPU,但我希望你不需要完美的准确性。

这样做可以让你在样本之间保留更多的数据,并且需要使用更复杂的数据结构,但应该可以得到合理的结果。


是的,我认为这将解决问题,但需要一些复杂的工作。我会尽量保留存在足够长时间的前200个PID,并不断减去它们,直到有一个得到0并用新来者替换它。然后将减法结果添加到一个容器中,与新来者混合。我想我应该尝试这个方法。谢谢。 - Luck Haryadi

0
如果您需要准确的结果或进程寿命很短,则必须在进程终止时阅读进程的时间使用情况。
至少有两种方法:
1)使用wait4(2)wait3(2)函数等待进程终止。这些函数将返回进程的utime和stime。
2)将终止的进程保持为僵尸状态,直到读取/prox/<pid>/stat

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