CPU如何知道有待处理的IO?


17

我一直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都可能使该进程进入休眠状态。如何确认“待处理的IO”状态?


3
“进程在单个CPU上运行”。并不是的。线程在单个CPU内核上运行,但是现代进程具有多个线程,而现代CPU具有多个内核。
MSalters

@MSalters即便如此,尽管单个线程在任何时间只能在一个内核上执行,但是在上下文切换之后,它执行的内核可能会更改。
JAB

1
有一个叫中断请求(IRQ)的东西,但它可能比我们感兴趣的硬件更多
。– mathreadler

Answers:


33

CPU不知道这些,任务调度程序知道。

您引用的定义有些令人误解;当前的procfs(5)联机帮助页具有更准确的定义,但有以下警告:

iowait (从Linux 2.5.41开始)

(5)等待I / O完成的时间。由于以下原因,此值不可靠:

  1. CPU将不等待I / O完成。iowait是任务等待I / O完成的时间。当CPU进入空闲状态以处理未完成的任务I / O时,将在此CPU上调度另一个任务。

  2. 在多核CPU上,等待I / O完成的任务没有在任何CPU上运行,因此iowait很难计算每个CPU的任务数。

  3. 在某些情况下,此字段中的值可能会减小。

iowait通常,尝试测量花费在等待I / O上的时间。它不是特定的CPU 跟踪,也不是(上面的第2点-也与您想知道的内容匹配)。但是,它尽可能地根据每个 CPU进行测量。

任务计划程序“知道”有待处理的I / O,因为它知道由于正在等待I / O而挂起了给定的任务。这是在in_iowait领域对每个任务进行跟踪的task_struct;您可以in_iowait调度程序核心中查找如何设置,跟踪和清除它。Brendan Gregg最近发表的有关Linux平均负载的文章包括有用的背景信息。每当计入计时器滴答时,iowaitin中的条目/proc/stat(最终结果为in top)就会递增,并且“在” CPU上的当前进程处于空闲状态;因此,“ 您可以通过account_idle_time调度程序的CPU时间跟踪代码中查找来查看。

因此,更准确的定义是“当没有更好的事情要做时,该CPU在等待I / O上花费的时间”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.