关于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




