ls
我在 Ubuntu Linux 终端中运行以下命令(执行了10,000 次),并使用该top
命令来监控 CPU 使用情况。虽然top
显示总 CPU 使用率(第 2 行)约为 48%(13.1% 用户 + 34.9% 内核),但下面的列表并未反映正确的 CPU 使用率。只有 6.5% 的 CPU 与 bash 进程相关。注意:我已经关闭了 Irix 模式,因此 6.5% 与第 2 行的比例相同。
for i in {1..10000}; do (ls /tmp/ >/dev/null); done
我还尝试htop
未选中“隐藏内核线程”选项,但得到了相同的结果。
系统的哪一部分正在使用 CPU(内核?)以及为什么它对top
/隐藏htop
?
答案1
您正在运行许多生命周期极短的进程。您不会在顶部输出中看到太多它们。
Top 定期测量系统活动(通常每秒一次)。每次刷新时,它都会遍历进程列表并收集每个进程的统计信息。根据调度的运气,ls
此时可能有零个或一个进程。如果top
没有看到ls
进程,则不会显示该进程。即使top
看到一个进程ls
,获取统计数据也不是原子的;如果该进程在枚举进程的时间top
和读取该进程的统计信息的时间之间终止,则该进程将不会显示。因此,通常没有任何ls
流程可列出。
即使有一个ls
进程,该进程也不会运行很长时间,因此它在最后一秒所占的 CPU 使用率可以忽略不计。它可能位于列表底部附近的某个位置。
由于 CPU 使用情况不是自动测量的,而只是一个近似值,因此内核收集的 CPU 总使用情况统计信息并不总是与逐个进程收集的使用情况统计信息的总和相匹配。这些总和对于足够长时间运行的进程来说是匹配的,但是当存在短暂的进程时,正如本示例所示,它们可能会有很大差异。