2012-01-11 115 views
5

我尝试使用C/C++编写程序,其行为与Linux中的top命令类似。 我已经做了一些研究,并且已经知道如何计算一个进程的CPU使用率。我们可以通过在当前时间和几秒后从/ proc/[PID]/stat计算stime + utime来获得CPU使用率。然后计算stime + utime差异并将结果与​​正常运行时间差异分开,然后获得CPU使用率百分比。单进程/多线程进程将非常简单。如何统计Linux中多进程应用程序的CPU使用情况

问题出现在httpd这样的情况下,它作为多进程工作。当web服务器忙时,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 

如果你看一下上面的例子中,表准时+ UTIME的增量将导致负值,因为过程的数量减少,并给几个毫秒之后的下限值。我只想知道,有没有其他方法可以计算这样的过程?谢谢。

+0

你怎么知道这套过程?通过它的流程组?通过程序的名称? – 2012-01-11 08:03:35

+0

首先,我得到主父进程。我知道,因为它有ppid 1,我们说它的pid 1227.然后,搜索整个/ proc /目录,其中有ppid 1227.如果/ proc/pid1/stat有ppid 1227,那么我将它的utime和stime添加到1227年的时候和stime。 – 2012-01-11 08:08:13

回答

1

我建议分开保存每个过程的数据。
当你有一个新的样本,每个过程可能会落在三个类别之一:
1.前后存在 - 从新减去旧。
2.现在存在,但不是之前 - 只需要新的值。
3.以前存在但不是现在 - 忽略它。在这里你错过了一些东西,因为它可能在你的采样周期的90%时间内使用过CPU,但是我希望你不需要完美的精度。

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

+0

是的,我认为这会解决问题,但是花费一些复杂的工作。我会尽量保持足够长的TOP 200 PID,并且保持减去它们直到得到0并将其替换为新手。然后减法将被添加到容器中,该容器将与新手混合。我想我应该尝试一个。谢谢。 – 2012-01-11 09:53:07

0

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

有ATLEAST两种方式:

1)使用wait4(2)wait3(2)函数来等待进程终止。这些功能将返回过程的时间和空间。

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

相关问题