2012-01-11 117 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

相關問題