题 谁能准确解释IOWait是什么?


尽管我读过关于爱荷华州的消息,但对我来说仍然是个谜。

我知道CPU等待IO操作完成所花费的时间,但究竟是什么样的IO操作?我也不确定,为什么它如此重要?在IO操作完成时,CPU是否只能执行其他操作,然后返回处理数据?

还有什么是正确的工具来诊断哪些进程确实等待IO。

什么是最小化IO等待时间的方法?


170
2018-05-27 09:52




而且,什么是高iowait? - Muhamed Huseinbašić


答案:


我知道这是CPU花费的时间   等待IO操作   完成,但是什么样的IO   准确的操作?我也是   不确定,为什么它如此重要?   CPU不能只做其他事情   当IO操作完成时,和   然后回到处理数据?

是的,操作系统将安排其他进程运行,而其中一个进程在IO上被阻止。但是在该过程中,除非它使用异步IO,否则在IO操作完成之前它不会进展。

还有什么是正确的工具   诊断哪些过程完全正确   等待IO。

您可能会发现一些有用的工具

  • iostat,监视磁盘的服务时间
  • iotop (如果您的内核支持它),监视每个进程的IO请求的细分
  • strace,来看一个过程发出的实际操作

什么是最小化IO的方法   等待时间?

  • 确保您拥有可用的物理内存,以便操作系统可以将磁盘块缓存在内存中
  • 保持文件系统磁盘使用率低于80%,以避免过多的碎片
  • 调整你的文件系统
  • 使用电池支持的阵列控制器
  • 执行io操作时选择好的缓冲区大小

90
2018-05-27 10:28



不要忘记“确保您的后端存储足够快以跟上您的I / O负载。” - jgoldschrafe
@Dave Cheney,当我的进程空闲时,因为它正在等待IO。那么IOWait和idle之间的区别是什么? - ctrl-alt-delor
在IOwait中,进程处于“不间断睡眠”状态,这意味着它无法被杀死,以避免损坏磁盘上数据的风险。正常的空闲进程实际上什么都不做,所以杀死它的风险就更小了。 - mveroone
实际上,这意味着你的IO太慢了。 “让服务器更快”是不同的,无论你是CPU限制还是你的CPU挨饿,因为有人认为慢速笔记本光盘足以运行数据库服务器而IO负载使得CPU只使用它的2%,等待为IO完成疯狂。 - TomTom
我不能相信这里的前三个答案是这样的 错误。 haridsv的答案是正确的。没有cpu“等待”io完成。是的,有些io可以阻止 - 通常有充分的理由,在某些情况下所有io都可以阻止。但是你也可以看到iowait发生了完全异步的操作。 - symcbean


老问题,最近碰到了,但感觉现有答案不足。

Iowait定义和属性

IOWait(通常标记为 %wa 在顶部)是一个空闲的子类别(%idle 通常表示为除定义的子类别之外的所有空闲),这意味着CPU没有做任何事情。因此,只要CPU可以处理另一个进程,它就会这样做。另外,空闲,用户,系统,iowait等是关于CPU的测量。换句话说,你可以把iowait想象成等待io引起的空闲。

准确地说,iowait花费的时间用于接收和处理硬件中断占处理器滴答的百分比。软件中断通常分别标注为 %si

重要性和潜在的误解

IOWait非常重要,因为它通常是了解IO是否存在瓶颈的关键指标。但缺乏iowait并不一定意味着你的应用程序  IO上的瓶颈。考虑在系统上运行的两个应用程序。如果程序1严重受瓶颈,程序2是一个重CPU用户,那么 %user + %system CPU可能仍然是~100%,相应地,iowait会显示0.但这只是因为程序2是密集型的,并且相对而言似乎没有对程序1说什么,因为所有这些都是从CPU的角度来看。

检测IOWait的工具

请参阅Dave Cheney和Xerxes的帖子

但也简单 top 将展示 %wa

减少IOWait

此外,由于我们现在几乎进入2013年,除了其他人所说的,简单的IO存储设备的选择是可负担得起的,即SSD。固态硬盘真棒!


44
2017-12-25 12:45





iowait

iowait 是处理器/处理器等待的时间(即在处理器中) 闲置状态 并且 没有),其中实际上存在  出色的磁盘I / O请求。

这通常意味着块设备(即物理磁盘,而不是存储器)太慢或者只是饱和。

因此,您应该注意,如果您在系统上看到高负载平均值,并且通过检查通知,其中大部分实际上是由于I / O等待,这并不一定意味着您的系统出现问题 - 当您的系统出现问题时除了I / O绑定进程(即执行I / O多于其他任何进程的进程(非I / O绑定系统调用))之外,机器无关紧要。从你在系统上做的任何事情仍然非常敏感的事实来看,这也应该是显而易见的。

工具

  • sar (来自 sysstat 包,可在大多数* nix机器上使用)
  • iostat
  • sarface (前端到 sar

34
2018-05-27 10:32



请注意,严格来说,I / O等待时间的定义仅在单处理器系统上有效。对于多处理器系统,它需要稍微改进一下: veithen.blogspot.be/2013/11/iowait-linux.html - Andreas Veithen
到什么程度 iowait 影响 Load Average?比方说,等待网络的100个线程,LA将是100吗? - Ivan Balashov


我发现这个链接的解释和示例非常有用: 究竟什么是“iowait”?。顺便说一句,为了完整起见,这里的I / O指的是磁盘I / O,但也可能包括网络挂载磁盘(如nfs)上的I / O,如 这个帖子

我将引用几个重要的部分(如果链接已经死亡),其中一些将重复其他人已经说过的内容,但对我来说至少这些更清楚:

用一句话来概括它,'iowait'是时间的百分比   CPU处于空闲状态且至少有一个I / O正在进行中。

每个CPU可以处于以下四种状态之一:user,sys,idle,iowait。

我想知道当一个进程正在等待I / O时系统有其他进程准备好运行时会发生什么。以下解释:

如果CPU空闲,则内核确定是否至少存在   一个I / O当前正在进行本地磁盘或远程   已从该CPU启动的已装入磁盘(NFS)。如果有   是,然后'iowait'计数器加1。如果没有   正在从该CPU启动的I / O,即“空闲”计数器   增加1。

这是一个例子:

假设在CPU上运行了两个程序。一个是'dd'   程序从磁盘读取。另一个是没有I / O的程序   但是它花费100%的时间进行计算工作。现在假设   I / O子系统和物理I / O存在问题   正在接管一秒钟才能完成。每当'dd'程序是   在等待其I / O完成时睡着了,另一个程序是   能够在该CPU上运行。当发生时钟中断时,会出现   始终是在用户模式或系统模式下运行的程序。   因此,%idle和%iowait值将为0.即使iowait   现在是0,这并不意味着没有I / O问题,因为那里   很明显,如果物理I / O占用一秒钟就可以了   完成。

全文值得一读。这里有一个 这个页面的镜像,如果它下降。


27
2018-05-27 12:34





对于Solaris,如果需要查看正在运行的I / O操作,我使用DTrace查看进程正在执行的操作。对于Linux,有一个类似的程序叫做 SystemTap的 它提供了与内核和进程调用类似的暴露程度。

我在学习DTrace时使用的一个例子是比较a cp 命令到 dd 命令。你可以看到 dd 为写入做了更多的读取,而 cp 没有,主要是因为缓冲区大小 dd 默认情况下使用(如果我没记错的话)。


1
2018-05-27 10:01





什么样的IO操作取决于您的应用程序和设置。

这很重要,因为在某些情况下,CPU无法获取所需的数据或指令。在某些情况下,它可以继续,但它将取决于哪些应用程序正在运行它可以做什么。如果您有一个执行大量磁盘访问的单线程应用程序,那么您将需要等待。

要最大限度地缩短IO时间,请购买更多更快的内存,获得更快的磁盘,对磁盘进行碎片整理。

如果它是一个内部应用程序,它是瓶颈,看看它是否可以优化以读取更大的块或异步执行IO。


0
2018-01-01 15:50



好的,所以iowait是花在一个时间上的 闭塞 IO操作? - Peter Krumins
因此,例如,如果我执行select()或poll()并且它会阻塞,那么等待描述符变为可用的时间将构成iowait时间? - Peter Krumins
我认为那将属于SO,因为它看起来像一个编程问题。 - Jeremy French
彼得斯 - 是的,这是一个很好的思考方式。 - user2278


使用ps aux可以打印进程STAT
如果stat是D或Ds,则进程处于Uninterruptible sleep(通常为IO)
当进程进入Uninterruptible sleep时,会添加nr_iowait的runqueue,如果nr_iowait> 0,则cpu的空闲时间计入iowait

vmstat还显示了多少个进程块
r:等待运行时间的进程数。
b:不间断睡眠中的进程数。

http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/


0