wa=waiting for i/o ,又称 iowait
wa%的统计口径是一切 hardware interrupt 造成的 cputime ,他本身被归类到 idle%中
https://serverfault.com/questions/12679/can-anyone-explain-precisely-what-iowait-is 进一步指出
> IOWait (通常标注%wa 在 top )是 idle 的一个子类(%idle 通常表示为除了定义的子类之外的所有 idle ),意思是 CPU 没有做任何事情。因此,只要 CPU 可以处理另一个进程,它就会处理。此外,idle 、user 、system 、iowait 等都是针对 CPU 的度量。换句话说,你可以把 iowait 看作是等待 io 导致的空闲。
> 准确地说,iowait 是接收和处理硬件中断所花费的时间占处理器滴答的百分比。软件中断通常单独标记为%si.
> 但是没有 iowait 并不一定意味着您的应用程序在 IO 上没有瓶颈。考虑在一个系统上运行的两个应用程序。如果程序 1 是严重的 io 瓶颈,而程序 2 是重度 CPU 用户,则%user + %systemCPU 可能仍约为 ~100%,相应地,iowait 将显示 0 。但这只是因为程序 2 是密集型的,相对而言似乎什么也没说程序 1 ,因为所有这些都是从 CPU 的角度来看的。
> 假设有两个程序在一个 CPU 上运行。一个是从磁盘读取的“dd”程序。另一个是不执行 I/O 但将 100% 的时间用于计算工作的程序。现在假设 I/O 子系统有问题,并且物理 I/O 需要一秒钟才能完成。每当“dd”程序在等待其 I/O 完成时处于休眠状态,另一个程序就可以在该 CPU 上运行。当时钟中断发生时,总会有程序运行在用户态或系统态。因此,%idle 和 %iowait 的值将为 0 。即使 iowait 现在为 0 ,这并不意味着没有 I/O 问题,因为如果物理 I/O 需要一秒钟才能完成,则显然存在问题。
https://serverfault.com/questions/684339/why-cpu-spent-time-on-iowa> CPU 空闲状态分为两种不同的“子”状态:iowait 和 idle 。
> 如果 CPU 空闲,则内核然后确定是否有至少一个当前正在进行的 I/O 到本地磁盘或从该 CPU 启动的远程安装磁盘 (NFS)。如果存在,则 CPU 处于状态 iowait 。如果没有从该 CPU 启动的正在进行的 I/O ,则 CPU 处于 idle 状态。
> 因此,iowait 是 CPU 空闲时间的百分比,并且至少有一个 I/O 正在从该 CPU 启动。
> iowait 计数器表明系统可以处理更多的计算工作。仅仅因为 CPU 处于 iowait 状态并不意味着它不能在该 CPU 上运行其他线程或进程。
> 所以,iowait 这只是一种空闲时间。
(假设是 Linux ,虽然一般概念可以应用于其他操作系统。)
https://serverfault.com/questions/972343/what-is-the-relation-between-io-wait-utilisation-and-load-average> 工作负载不能仅通过平均负载和 %iowait 来描述。这些指标仅汇总特定状态下的任务。分别计算可运行和不可中断、空闲时间和未完成的 I/O 。
> 您可能会遇到这样一种情况,即有任务处于可运行状态,有一些空闲 CPU 周期,但 I/O 上没有空闲。想象一个有点繁忙的 Web 服务器,有 200 个工作进程在 2 个 CPU 上运行。平均负载约为 1 ,iowait 接近 0 。任务很多,每个任务的工作量都不是很多,CPU 闲置但在磁盘上等待的时间更少。
如果这个假设的 Web 服务器 VM 被实时迁移,它的内存延迟和可用的 CPU 时间可能会受到短暂的影响。一个症状是更高的平均负载,但这不会驱动 iowait 。