我一直iowait
在研究顶部实用程序输出中显示的属性,如下所示。
top - 07:30:58 up 3:37, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
iowait
一般定义如下:
“这是 CPU 空闲并且有一些 IO 挂起的时间。”
据我了解,一个进程在单个 CPU 上运行。在它被取消调度后,要么因为它已经用完它的时间槽,要么在它被阻塞之后,它最终可以再次在任何一个 CPU 上再次被调度。
在 IO 请求的情况下,将进程置于不间断睡眠的 CPU 负责跟踪iowait
时间。其他 CPU 将在其端报告与空闲时间相同的时间,因为它们实际上是空闲的。这个假设正确吗?
此外,假设有一个长 IO 请求(意味着该进程有多次机会被调度但由于 IO 未完成而没有被调度),CPU 怎么知道有“待处理的 IO”?这种信息是从哪里获取的?CPU 怎么能简单地发现某个进程在某个时间进入睡眠状态以完成 IO,因为任何 CPU 都可能使该进程进入睡眠状态。这种“pending IO”的状态是如何确认的?
CPU 不知道这些,任务调度程序知道。
您引用的定义有些误导;当前的
procfs(5)
联机帮助页有更准确的定义,但需要注意:iowait
通常,尝试测量等待 I/O 所花费的时间。它没有被特定的 CPU 跟踪,也不能被跟踪(上面的第 2 点——这也符合您的疑惑)。不过,它是尽可能按CPU测量的。任务调度程序“知道”有挂起的 I/O,因为它知道它挂起给定的任务是因为它正在等待 I/O。
in_iowait
这是在领域中的每个任务跟踪的task_struct
;您可以in_iowait
在调度程序核心中查找它是如何设置、跟踪和清除的。Brendan Gregg 最近关于 Linux 平均负载的文章包含有用的背景信息。中的iowait
条目/proc/stat
,即 中的条目,top
每当考虑到计时器滴答时就会递增,并且当前进程“开启” CPU 空闲;account_idle_time
您可以通过在调度程序的 CPU 时间跟踪代码中查找来看到这一点。所以更准确的定义应该是“在没有更好的事情可做的情况下,在这个 CPU 上等待 I/O 所花费的时间”......