如何计算Linux中多进程应用程序的CPU使用率

Luc*_*adi 5 c c++ linux apache multiprocess

我尝试使用C/C++编写程序,在Linux中表现得像top命令.我做了一些研究,并且已经知道如何计算进程的CPU使用率.我们可以通过在当前时间和几秒钟后从/ proc/[PID]/stat计算stime + utime来获得CPU使用率.然后计算stime + utime差异并将结果与​​正常运行时间差异除,然后我们得到CPU使用率百分比.单进程/多线程进程将非常容易.

问题出在类似httpd的情况下,它作为多进程工作.当webserver忙时,httpd将fork子进程来提供一堆请求.然后我计算总进程的数量,比方说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
Run Code Online (Sandbox Code Playgroud)

如果您查看上面的示例,Stime + Utime的增量将导致负值,因为进程数减少,并在几毫秒后给出较低的值.我只是想知道,有没有其他方法来计算这样的过程表现如此?谢谢.

ugo*_*ren 1

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

它使您在样本之间保留更多数据,并且需要使用更复杂的数据结构,但它应该给出合理的结果。