5

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

问题在于像 httpd 这样的情况,它作为多进程工作。当网络服务器繁忙时,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 的增量将导致负值,因为进程数减少,并在几毫秒后给出较低的值。我只是想知道,有没有其他方法可以计算这样的过程行为?谢谢你。

4

2 回答 2

1

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

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

于 2012-01-11T09:04:22.523 回答
0

如果您需要准确的结果或者进程的生命周期很短,那么您必须在进程终止时读取进程的时间使用情况。

至少有两种方式:

1) 使用wait4(2)wait3(2)函数等待进程终止。这些函数将返回进程的 utime 和 stime。

2) 将终止的进程保持在僵尸状态,直到读取/prox/<pid>/stat.

于 2012-01-11T12:53:39.923 回答