为什么“正在运行”的进程这么少?

为什么“正在运行”的进程这么少?

在所有 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出于采样原因始终显示为睡眠状态的进程繁忙得多。

相关内容