任何人都可以准确解释IOWait是什么?

就像我已经阅读了关于爱荷华州一样,这对我来说仍然是个谜。

我知道这是CPU等待IO操作完成的时间,但是究竟是什么样的IO操作呢? 我也不确定,为什么这么重要? 在IO操作完成的时候,CPU不能只是做别的事情,然后回到处理数据的地步?

另外什么是正确的工具来诊断哪些进程正确地等待IO。

有什么办法来减lessIO等待时间?

我知道这是CPU等待IO操作完成的时间,但是究竟是什么样的IO操作呢? 我也不确定,为什么这么重要? 在IO操作完成的时候,CPU不能只是做别的事情,然后回到处理数据的地步?

是的,操作系统将安排其他进程在IO上被阻塞时运行。 但是在这个过程中,除非使用asynchronousIO,否则无论IO操作何时完成,都不会进行。

另外什么是正确的工具来诊断哪些进程正确地等待IO。

一些你可能会觉得有用的工具

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

有什么办法来减lessIO等待时间?

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

老问题最近碰到了,但觉得现有的答案是不够的。

IOWait的定义和属性

IOWait(通常标记为%wa )是一个空闲的子类别( %idle通常表示为除了定义的子类别以外的所有空闲),这意味着CPU没有任何操作。 因此,只要有另一个CPU可以处理的进程,就会这样做。 另外,闲置,用户,系统,爱荷华等等都是相对于CPU的测量。 换句话说,你可以把艾奥瓦视为等待io所造成的闲置。

确切地说,Iowait是花在接收和处理硬件中断上的时间占处理器时间的百分比。 软件中断通常分别标记为%si

重要性和潜在的误解

IOWait非常重要,因为它通常是了解IO是否受到瓶颈的关键指标。 但是,缺乏iowait并不一定意味着你的应用不是 IO瓶颈。 考虑在系统上运行的两个应用程序。 如果程序1的瓶颈很严重,程序2是一个沉重的CPU用户,CPU的%user + %system可能仍然是〜100%,相应地,iowait将显示为0.但是,这只是因为程序2是密集的和相对的似乎对程序1一无所知,因为这一切都是从CPU的angular度来看的。

检测IOWait的工具

查看Dave Cheney和Xerxes的post

而且一个简单的top将显示在%wa

减lessIOWait

而且,现在我们已经快要进入2013年了,除了别人说的话之外,简单好用的IO存储设备的select也是可以承受的,也就是SSD。 固态硬盘真棒!

iowait

iowait是处理器/处理器正在等待的时间(即, 处于空闲状态并且什么也不做 ),在此期间,实际上存在未完成的磁盘I / O请求。

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

因此,您应该注意,如果您的系统上看到的是高负载平均值,并且在检查时注意到这其中大部分实际上是由于I / O等待,但这并不一定意味着您的系统有问题 – 并且在您除了I / O绑定的进程(即执行比其他任何操作(非I / O绑定的系统调用)更多的I / O的进程)之外,机器完全没有任何事情要做。 这也应该是显而易见的,因为你在系统上做的任何事情都是非常敏感的。

工具

  • sar (来自sysstat软件包,在大多数* nix机器上可用)
  • iostat
  • sarfacesarface的前端)

我发现这个链接的解释和例子非常有用: “iowait”究竟是什么? 。 顺便说一句,为了完整起见,这里的I / O是指磁盘I / O,但也可以在networking挂载的磁盘(如nfs)上包含I / O,如其他文章所述 。

我会引用一些重要的章节(如果链接已经死了),其中一些将重复其他人已经说过的话,但是对我来说,至less这些更清楚:

总而言之,“iowait”是CPU闲置的时间百分比,至less有一个I / O正在进行。

每个CPU可以处于以下四种状态之一:用户,系统,闲置,爱荷华州。

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

如果CPU处于空闲状态,则内核将确定是否至less有一个I / O正在进行到本地磁盘或从该CPU启动的远程挂载的磁盘(NFS)。 如果有,那么'iowait'计数器会加1。 如果没有从该CPU启动的I / O,则“空闲”计数器加1。

这里是一个例子:

假设有两个程序在CPU上运行。 一个是从磁盘读取的“dd”程序。 另一个是没有I / O的程序,但是花100%的时间做计算工作。 现在假定I / O子系统有问题,物理I / O正在接pipe一秒钟。 每当“dd”程序在等待其I / O完成时处于睡眠状态,另一个程序就能够在该CPU上运行。 当发生时钟中断时,总是有一个程序在用户模式或系统模式下运行。 因此,空闲百分比和%iowait值将为0.即使iowait为0,这并不意味着没有I / O问题,因为如果物理I / O占用一秒钟时间,显然有一个问题。

全文值得一读。 这里是这个页面的镜像 ,以防万一。

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

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

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

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

为了尽量减lessIO时间,购买更多,更快的内存,获得更快的磁盘,碎片整理你的磁盘。

如果这是一个内部应用程序是瓶颈,看看它是否可以优化读大块或asynchronousIO。

使用ps aux可以打印进程STAT
如果stat是D或Ds,则进程处于不间断睡眠(通常为IO)
当一个进程进入Uninterruptible sleep时,joinrunqueue的nr_iowait,如果nr_iowait> 0,cpu的空闲时间被计算到iowait

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

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