我尝试使用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
如果您查看上面的示例,Stime + Utime的增量将导致负值,因为进程数减少,并在几毫秒后给出较低的值。我只是想知道,有没有其他方法来计算这样的过程表现如此?谢谢。
答案 0 :(得分:1)
我建议分别保存每个流程的数据
当您有新样本时,每个过程可能属于以下三个类别之一:
1.之前和之后都存在 - 从新的减去旧的
2.现在存在,但不存在 - 只需采用新值
3.之前存在,但现在不存在 - 忽略它。你在这里遗漏了一些东西,因为它可能在90%的采样期间使用了CPU,但我希望你不需要完美的准确性。
它使您在样本之间保留更多数据,并且需要使用更复杂的数据结构,但它应该给出合理的结果。
答案 1 :(得分:0)
如果您需要准确的结果或者流程的生命周期很短,那么您必须在流程终止时读取流程的时间使用情况。
至少有两种方式:
1)使用wait4(2)
或wait3(2)
函数等待进程终止。这些功能将回归utime和过程的极端。
2)在僵尸状态下保持已终止的进程,直到读取/prox/<pid>/stat
。