Ps

對於四核 CPU 上的 Firefox 程序,如何使 Ubuntu Linux 16.10 系統監視器 % CPU 使用率與 ps 或 top 一致?

  • May 13, 2016

我想讓 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同意,因為它顯示了自程序啟動以來psCPU 花費在程序上的時間百分比,並顯示了自上次刷新以來的百分比。gnome-system-monitor

我也沒有理由想像你為什麼需要讓這兩個值達成一致。我認為我們這裡有某種XY 問題。你可能想問一個新問題,描述你的最終目標是什麼,你試圖通過使兩個值一致來解決什麼問題。

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