top 和 ps 沒有顯示相同的 cpu 結果
這與這個問題有關。
當我執行時,
top
我得到以下結果:pid
3038
正在使用 18% cpu,但是在執行時結果是 5.5%。而且這個數字似乎並沒有隨著時間而改變(即稍後執行相同的命令時)……
該
ps
命令是否以某種方式平均 CPU 使用率?
man ps
在NOTES
部分。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 百分比) ”
簡短的回答:你不能。
為什麼會這樣?
這就像要求某人根據圖片計算汽車的速度。
while
top
是一個監控工具,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.
我在這個範例中使用
etime
overetimes
進行計算,只是為了更清楚一點。我還為“有趣”添加了 %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