You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Linux系统top命令未统计全部任务的疑问

解惑Linux top命令中任务总数的“消失”部分

嘿,这个问题问得特别细致!我刚盯着你贴的top输出算了一遍——1个运行中、55个睡眠中,加起来才56,确实和总任务数81差了25个,这可不是top算错了,是它默认没把一类特殊状态的进程列在Tasks行里而已。

先把你贴的top输出放在这里方便对照:

top - 21:16:18 up 23 days,  1:47,  2 users,  load average: 0.06, 0.03, 0.01

Tasks:  81 total,   1 running,  55 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   1008824k total,   606424k used,   402400k free,   164676k buffers

Swap:        0k total,        0k used,        0k free,   310044k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND

1 root      20   0 19692 2552 2220 S  0.0  0.3   0:04.54    0 init

2 root      20   0     0    0    0 S  0.0  0.0   0:00.00    0 kthreadd

3 root      20   0     0    0    0 I  0.0  0.0   0:00.00    0 kworker/0:0

...

消失的任务去哪了?

差的这25个进程,全是处于**不可中断睡眠状态(Uninterruptible Sleep,标记为D)**的进程。top默认的Tasks行只列出了最常见的几种状态,但这个D状态是特殊的:它代表进程正在等待关键的I/O操作(比如磁盘读写、硬件设备响应),这个过程中进程不能被任何信号打断,所以被单独归类,没出现在默认的Tasks统计行里。

另外你输出里的kworker/0:0进程状态是I(空闲的内核线程),这类进程也会被算入总任务数,但同样没在默认Tasks行列出,不过这部分数量通常很少,主要的差值还是来自D状态进程。

怎么验证?

给你两个简单的方法确认:

  • 在top界面按f键进入字段选择模式,找到State选项并勾选(按空格选中),再按回车返回主界面,就能看到每个进程的状态列,数一下标记为D的进程数量,刚好能补全差值。
  • 用命令行统计所有进程状态:执行ps aux | awk '{print $8}' | sort | uniq -c,这个命令会列出所有进程状态以及对应的数量,把所有数字加起来就等于top里的total tasks数,你会看到D状态的数量正好是25左右。

备注:内容来源于stack exchange,提问作者supercobra

火山引擎 最新活动