如何使 Ubuntu Linux 16.10 系统监视器 % CPU 使用率与四核 CPU 上的 Firefox 进程的 ps 或 top 一致?

如何使 Ubuntu Linux 16.10 系统监视器 % CPU 使用率与四核 CPU 上的 Firefox 进程的 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:查看进程最后一秒的 CPU 使用情况,我学会了如何查看最后一秒的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 数量”复选框吗?

答案1

快速回答:不,这实际上不可能。

这里的问题首先是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问题。您可能想问一个新问题,描述您的最终目标是什么,您试图通过使两个价值观一致来解决什么问题。

相关内容