在所有 BSD/Linux/MacOS 和 Solaris 上,我做了一个观察 - 无论系统多么繁忙,top
总是报告很少(通常是 1-2 个)正在运行的进程。
根据我有限的理解,如果一个进程正在使用CPU时间,或者等待CPU时间变得可用,那么它就处于“运行”状态。
因此,这是一个场景:我使用 SSH 来建立 VNC 隧道,然后top
在远程计算机上的终端模拟器中运行:
top
本身被列为“正在运行”的进程(可以理解)sshd
已列出,但未“运行”Xvnc
已列出,但未“运行”
但是sshd
,隧道 VNC 流量Xvnc
是让我不断更新屏幕内容的原因,他们怎么可能不使用 CPU 时间呢?
如果他们正在使用 CPU 时间,那么为什么他们没有“运行”呢?
答案1
我认为这是一个时间问题。top
每 N 秒检查一次 CPU 状态。在运行检查时,top
将有处于活动状态,因为它正在主动检查系统的状态。看到这一点的一个好方法是减少更新时间top
并观察进程的移动!正如建议的man top
:
o The user interface, through prompts and help, intentionally
implies that the delay interval is limited to tenths of a sec‐
ond. However, you're free to set any desired delay. If you
want to see Linux at his scheduling best, try a delay of .09
seconds or less.
For this experiment, under x-windows open an xterm and maximize
it. Then do the following:
. provide a scheduling boost and tiny delay via:
nice -n -10 top -d.09
. keep sorted column highlighting Off so as to
minimize path length
. turn On reverse row highlighting for emphasis
. try various sort columns (TIME/MEM work well),
and normal or reverse sorts to bring the most
active processes into view
What you'll see is a very busy Linux doing what he's always
done for you, but there was no program available to illustrate
this.
如果您尝试这样做,您应该会看到更多进程进入R
模式。您还可以尝试top
以批处理模式运行几次并收集标记为正在运行的进程:
sudo nice -n -10 top -d.09 -bn 100 | awk '$8~/R/{print $NF}' | sort -u
在我的系统上,在当前负载(包括开放的 ssh 隧道)下,我得到以下进程:
cinnamon
firefox
kworker/0:1
kworker/1:2
kworker/2:2
kworker/3:0
plugin-containe
ssh
tint2
top
Xorg
答案2
如今,大多数进程都在等待某些事情发生,比如来自网络的数据包、磁盘 I/O 完成、人类在键盘上打字或使用鼠标,而如此快速的 CPU 已成为常态。
启动计算密集型进程,例如某些图片或电影处理,它将显示为正在运行。
当然top
,在分析进程时总会发现自己由于明显的原因而运行。
请注意,显示的状态不是平均值,而是快照,因此即使进程比top
出于采样原因始终显示为睡眠状态的进程繁忙得多。