對於四核 CPU 上的 Firefox 程序,如何使 Ubuntu Linux 16.10 系統監視器 % CPU 使用率與 ps 或 top 一致?
我想讓 Ubuntu Linux 16.10 系統監視器 % CPU 使用率測量值基本上與
ps
“pcpu”一致,即在具有四核的 Lenovo Thinkstation 桌面上執行的單個 Firefox 瀏覽器程序的 CPU 使用率百分比。Ubuntu Linux 16.10 系統監視器首選項目前設置為:
Update interval in seconds: 3.00 Enable smooth refresh: Yes Alert before ending or killing processes Yes Divide CPU usage by CPU count : Yes
Firefox 程序的 ps 輸出為:
$ ps -eo pid,rss,c,pcpu,cputime,cmd | grep firefox 2848 726024 3 3.5 00:50:23 /usr/lib/firefox/firefox -new-window
閱讀Linux : See CPU usage by a process for last second後,我學會瞭如何查看最後一秒的 cpu 使用情況。Firefox 程序的頂部輸出是:
$ top -b -d 1 | grep -in "firefox" 8: 2848 ratio 20 0 1980240 641516 115240 S 18.8 15.9 73:10.86 firefox
對於 Firefox 瀏覽器應用程序,我得到 3.5% 的 pcpu,
ps -eo pid,rss,c,pcpu,cputime,cmd
而對於同一個 Firefox 瀏覽器應用程序,GUI 應用程序 Ubuntu 系統監視器顯示 5% 的 CPU 使用率。另外,我從 top -b -d 1 | 得到 15.9% 的 CPU 使用率。grep -在“火狐”中。當我們的 CPU 使用的 4 個核心除以 4 時,我得到 top 輸出的 4.0%。我怎樣才能讓
ps
輸出或頂部輸出和系統監視器值一致?我是否應該啟用按 CPU 計數劃分 CPU 使用率複選框?
快速回答:不,這不可能。
這裡的問題首先是CPU“百分比”的概念。嚴格來說,這實際上並不意味著什麼。CPU 只有兩種狀態:要麼正在處理某事(100%),要麼正在等待。
因此,當某個程序報告的 CPU 使用百分比為 50% 時,這並不意味著僅使用了 50% 的 CPU。這意味著在特定時間段內,CPU 將 50% 的時間用於處理該程序。例如,如果刷新間隔設置為 1 秒,並且 CPU 在程序 N 上工作了半秒,那麼程序 N 的 CPU% 將顯示為 50%。
考慮到這一點,我們可以看看檢查 CPU% 的各種方法。對於
ps
,這被測量為(從man ps
):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%.
因此,報告的百分比
ps
實際上是整個過程生命週期的平均值。相比之下,top
報告:The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.
我假設
gnome-system-monitor
以類似的方式工作,它的 CPU % 也是自上次刷新以來 CPU 在給定程序上花費的時間百分比。我的 C++ 知識基本上不存在,但proctable.cpp
(部分gnome-system-monitor
原始碼)中的以下幾行表明它確實是自上次刷新以來的平均值:/* FIXME: total cpu time elapsed should be calculated on an individual basis here ** should probably have a total_time_last gint in the ProcInfo structure */ glibtop_get_cpu (&cpu); app->cpu_total_time = MAX(cpu.total - app->cpu_total_time_last, 1); app->cpu_total_time_last = cpu.total;
ps
所以不,你不能gnome-system-monitor
同意,因為它顯示了自程序啟動以來ps
CPU 花費在程序上的時間百分比,並顯示了自上次刷新以來的百分比。gnome-system-monitor
我也沒有理由想像你為什麼需要讓這兩個值達成一致。我認為我們這裡有某種XY 問題。你可能想問一個新問題,描述你的最終目標是什麼,你試圖通過使兩個值一致來解決什麼問題。