Cpu

top 和 ps 沒有顯示相同的 cpu 結果

  • December 16, 2012

這與這個問題有關。

當我執行時,top我得到以下結果:

在此處輸入圖像描述

pid3038正在使用 18% cpu,但是在執行時

在此處輸入圖像描述

結果是 5.5%。而且這個數字似乎並沒有隨著時間而改變(即稍後執行相同的命令時)……

ps命令是否以某種方式平均 CPU 使用率?

man psNOTES部分。

  CPU usage is currently expressed as the percentage of time spent running
  during the entire lifetime of a process.  This is not ideal, and it does not
  conform to the standards that ps otherwise conforms to.  CPU usage is
  unlikely to add up to exactly 100%.

而且,猜你知道,但你也可以這樣做:

top -p <PID>

編輯:關於您對其他答案的評論;

嗯,是的,我想知道如何從 ps 獲得(即時 CPU 百分比)

簡短的回答:你不能。

為什麼會這樣?

這就像要求某人根據圖片計算汽車的速度。

whiletop是一個監控工具,ps是一個快照工具。可以這樣想:在任何給定時刻,程序要麼使用 CPU,要麼不使用 CPU。因此,您在那個確切時刻有 0% 或 100% 的負載。

給予:如果ps應該給予即時 CPU 使用率,則為 0% 或 100%。

top另一方面,保持輪詢號碼並隨著時間的推移計算負載。

ps可以給出目前的使用情況——但這需要它多次讀取數據並在每次讀取之間休眠。它沒有。

計算 ps %cpu

ps通過以下方式計​​算 CPU 使用率:

uptime = 系統執行的總時間。
ps_time = 程序啟動時間,以啟動後的秒數為單位。
pu_time = 程序一直使用 CPU 的總時間。

;; 秒程序一直在執行:
秒 = 正常執行時間 - ps_time
;; 用法:
cpu_usage = pu_time * 1000 / 秒

列印:cpu_usage / 10“。” cpu_usage % 10



---

例子:

正常執行時間 = 344,545
ps_time = 322,462
pu_time = 3.383

秒 = 344,545 - 322,462 = 22,083
cpu_usage = 3,383 * 1,000 / 22,083 = 153

列印:153 / 10“。” 153 % 10 => 15.3

所以列印的數字是:程序在其生命週期內使用 CPU 的時間。如上例所示。它在其生命週期的 15.3% 中都是這樣做的。在 84.7% 的時間裡,它沒有在 CPU 上出現錯誤。

數據檢索

ps,以及top,使用儲存在/proc/- 或程序資訊偽文件系統下的文件中的數據。

您在根目錄中有一些文件,/proc/其中包含有關係統整體狀態的各種資訊。此外,每個流程都有自己的子文件夾/proc/<PID>/,其中儲存了流程特定的數據。因此,例如,您問題中的過程在/proc/3038/.

ps計算 CPU 使用率時,它使用兩個文件:

/proc/uptime 系統的正常執行時間(秒),以及空閒程序所花費的時間(秒)。
/proc/[PID]/stat 程序的狀態資訊。
  • uptime它使用第一個值(uptime)。
  • [PID]/stat它使用以下內容:
# 名稱 描述
在使用者程式碼中花費的 14 utime CPU 時間,以 jiffies 為單位
在核心程式碼中花費的 15 次 CPU 時間,以 jiffies 為單位
使用者程式碼中花費的 16 個 CPU 時間,包括來自孩子的時間
17 ctime CPU 花費在核心程式碼中的時間,包括來自孩子的時間
22 starttime 程序開始的時間,以 jiffies 為單位

jiffie是時鐘滴答聲*。*因此,除此之外,它還使用各種方法,即sysconf(_SC_CLK_TCK),來獲取系統的赫茲(每秒滴答數)——最終在用盡其他選項後使用 100 作為備份。

所以如果utime是 1234 而赫茲是 100 那麼:

seconds = utime / Hertz = 1234 / 100 = 12.34

實際計算如下:

total_time = utime + stime

IF include_dead_children
   total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

範例(自定義 Bash 腳本的輸出):

$ ./psw2 30894
System information
          uptime : 353,512 seconds
            idle : 0
Process information
             PID : 30894
        filename : plugin-containe
           utime : 421,951 jiffies 4,219 seconds
           stime : 63,334 jiffies 633 seconds
          cutime : 0 jiffies 0 seconds
          cstime : 1 jiffies 0 seconds
       starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

用 ps計算*“目前”負載*

這是一個(有點?)陰暗的努力,但沒關係。讓我們去吧。

可以使用ps由此提供的時間併計算 CPU 使用率。當考慮它時,它實際上可能相當有用,但有一些限制。

這對於計算較長時期內的 CPU 使用率可能很有用。也就是說,您想plugin-container在執行一些與 Firefox 相關的任務時監控 Firefox 中的平均 CPU 負載。

通過使用以下輸出:

$ ps -p -o cputime,etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

我在這個範例中使用etimeoveretimes進行計算,只是為了更清楚一點。我還為“有趣”添加了 %cpu。在 即一個 bash 腳本中,顯然會使用etimes- 或更好地從/proc/<PID>/etc中讀取。

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
6.2 00:14:45    03:56:07   14167

Calculate times:
           13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

           14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

在此期間,程序使用 CPU 的時間佔 38%。

看程式碼

如果你想知道它是怎麼ps做的,並且知道一點 C,做(看起來你執行 Gnome Debain deriavnt) - 在程式碼中關於註釋等的良好態度:

apt-get source procps
cd procps*/ps
vim HACKING

引用自:https://unix.stackexchange.com/questions/58539