谁能确切解释什么是IOWait?


194

尽管我已经了解了有关iowait的内容,但对我来说仍然是一个谜。

我知道这是CPU等待IO操作完成所花费的时间,但是究竟是哪种IO操作呢?我还不确定为什么如此重要?在IO操作完成之后,CPU不能只是做其他事情,然后回到处理数据的角度吗?

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

还有什么方法可以最大程度地减少IO等待时间?


Answers:


99

我知道这是CPU等待IO操作完成所花费的时间,但是究竟是哪种IO操作呢?我还不确定为什么如此重要?在IO操作完成之后,CPU不能只是做其他事情,然后回到处理数据的角度吗?

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

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

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

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

还有什么方法可以最大程度地减少IO等待时间?

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

6
不要忘记“确保后端存储足够快以跟上I / O负载。”
jgoldschrafe 2012年

1
@Dave Cheney,当我的进程空闲时,是因为它正在等待IO。那么IOWait和idle之间有什么区别?
ctrl-alt-delor 2012年

4
在IOwait中,该进程处于“不间断睡眠”状态,这意味着该进程无法杀死,以避免损坏磁盘上数据的风险。正常的空闲过程实际上什么都不做,因此消除它的风险较小。
mveroone 2014年

1
最重要的是,这实际上意味着您的IO太慢。无论您是否受CPU限制还是CPU饥饿,“使服务器更快”都是不同的,因为有人认为速度较慢的笔记本光盘足以运行数据库服务器,并且IO负载使CPU仅使用它的2%,就像等待为IO完成而疯狂。
TomTom 2014年

我不能相信这里的前3个答案太错误了。haridsv下面的答案是正确的。没有CPU在“等待”完成io。是的,某些io可能会阻塞-通常有一个很好的理由,在某些情况下,所有io都可能会阻塞。但是您也可以看到iowait发生在完全异步的操作中。
symcbean

47

最近遇到了一个老问题,但觉得现有答案不够。

IOWait的定义和属性

IOWait(通常%wa在顶部标记)是闲置的子类别(%idle通常表示为除定义的子类别之外的所有闲置),这意味着CPU没有执行任何操作。因此,只要CPU可能正在处理另一个进程,它就会这样做。另外,空闲,用户,系统,iowait等都是相对于CPU的度量。换句话说,您可以将iowait视为等待io导致的空闲。

准确地说,iowait是接收和处理硬件中断所花费的时间(占处理器滴答的百分比)。通常将软件中断标记为%si

重要性和潜在的误解

IOWait很重要,因为它通常是了解您是否遇到IO瓶颈的关键指标。但是,缺少iowait并不一定意味着您的应用程序就不会成为 IO的瓶颈。考虑在一个系统上运行的两个应用程序。如果程序1严重受到io瓶颈的影响,而程序2却是CPU的繁重用户,则%user + %systemCPU的使用率仍可能约为100%,并且iowait相应地显示为0。但这仅仅是因为程序2是密集的并且相对而言似乎什么也没说程序1,因为所有这些都是从CPU的角度来看的。

检测IOWait的工具

查看Dave Cheney和Xerxes的帖子

而且还会top显示一个简单的内容%wa

减少IOWait

此外,正如我们快要进入2013年一样,除了其他人所说的那样,简单而出色的IO存储设备(即SSD)的价格也是可以承受的。固态硬盘很棒!!!


35

iowait

iowait是时候该处理器/处理器正在等待(即处于空闲状态,并不会什么),在此期间,有实际上优秀的磁盘I / O请求。

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

因此,您应该注意,如果您看到系统上的平均负载很高,并且在检查时注意到其中大部分实际上是由于I / O等待所致,则不一定意味着您的系统有麻烦-发生这种情况时,除了与I / O绑定的进程(即,比其他任何事情执行更多I / O(非I / O绑定的系统调用)的进程)之外,计算机根本不做任何事情。从您在系统上所做的任何事情仍然非常敏感的事实,这也应该显而易见。

工具

  • sar(从sysstat软件包中,可在大多数* nix机器上获得)
  • iostat
  • sarface(的前端sar

7
请注意,严格来说,I / O等待时间的定义仅在单处理器系统上有效。对于多处理器系统,它需要进行一些改进:veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen

在多大程度上iowait影响Load Average?假设有100个线程在等待网络,洛杉矶会是100个吗?
伊万·巴拉索夫

32

我发现此链接中的解释和示例非常有用:“ iowait”到底是什么?。顺便说一句,为了完整起见,BTW在这里是指磁盘I / O,但也可以包括网络安装的磁盘(例如nfs)上的I / O,如本另一篇文章中所述

我将引用一些重要的部分(以防链接消失),其中一些将是其他人已经说过的重复,但是对我来说至少这些更清楚了:

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

每个CPU可以处于以下四种状态之一:用户,sys,空闲,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占用一秒钟才能完成,则显然存在一个I / O问题。

全文值得一读。这是此页面镜像,以防万一它掉了。


1

对于Solaris,如果需要查看正在运行的I / O操作,则可以使用DTrace查看进程在做什么。对于Linux,有一个类似的程序称为systemtap,它对内核和进程调用的暴露程度相似。

我在学习DTrace时使用的一个示例是将cp命令与dd命令进行比较。您会看到dd写入操作会读取更多内容,而读取操作cp却不会,主要是因为dd默认情况下使用了缓冲区大小(如果我没记错的话)。


0

哪种IO操作取决于您的应用程序和设置。

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

为了最大程度地减少IO时间,请购买更多和更快的内存,获得更快的磁盘,整理磁盘碎片。

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


好的,那么IOwait是花费在阻塞 IO操作上的时间吗?
彼得·克鲁姆斯

因此,例如,如果我执行select()或poll()并阻塞了,那么等待描述符可用的时间将构成iowait时间?
彼得·克鲁姆斯

我认为那应该属于SO,因为它看起来像是一个编程问题。
杰里米·法兰西

Peteris-是的,这是考虑它的好方法。
user2278

0


如果状态为D或Ds,则使用ps aux可以打印进程STAT ,
当进程进入不间断睡眠时,该进程处于不间断睡眠(通常为IO),添加了runqueue的nr_iowait,如果nr_iowait> 0,则计算cpu的空闲时间去等待

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

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

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.