就像我已经阅读了关于爱荷华州一样,这对我来说仍然是个谜。
我知道这是CPU等待IO操作完成的时间,但是究竟是什么样的IO操作呢? 我也不确定,为什么这么重要? 在IO操作完成的时候,CPU不能只是做别的事情,然后回到处理数据的地步?
另外什么是正确的工具来诊断哪些进程正确地等待IO。
有什么办法来减lessIO等待时间?
我知道这是CPU等待IO操作完成的时间,但是究竟是什么样的IO操作呢? 我也不确定,为什么这么重要? 在IO操作完成的时候,CPU不能只是做别的事情,然后回到处理数据的地步?
是的,操作系统将安排其他进程在IO上被阻塞时运行。 但是在这个过程中,除非使用asynchronousIO,否则无论IO操作何时完成,都不会进行。
另外什么是正确的工具来诊断哪些进程正确地等待IO。
一些你可能会觉得有用的工具
iostat
,监视磁盘的服务时间 iotop
(如果您的内核支持它)监视每个进程的IO请求的细分 有什么办法来减lessIO等待时间?
老问题最近碰到了,但觉得现有的答案是不够的。
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度来看的。
查看Dave Cheney和Xerxes的post
而且一个简单的top
将显示在%wa
。
而且,现在我们已经快要进入2013年了,除了别人说的话之外,简单好用的IO存储设备的select也是可以承受的,也就是SSD。 固态硬盘真棒!
iowait
iowait
是处理器/处理器正在等待的时间(即, 处于空闲状态并且什么也不做 ),在此期间,实际上存在未完成的磁盘I / O请求。
这通常意味着块设备(即物理磁盘,而不是内存)太慢,或者完全饱和。
因此,您应该注意,如果您的系统上看到的是高负载平均值,并且在检查时注意到这其中大部分实际上是由于I / O等待,但这并不一定意味着您的系统有问题 – 并且在您除了I / O绑定的进程(即执行比其他任何操作(非I / O绑定的系统调用)更多的I / O的进程)之外,机器完全没有任何事情要做。 这也应该是显而易见的,因为你在系统上做的任何事情都是非常敏感的。
工具
sar
(来自sysstat
软件包,在大多数* nix机器上可用) iostat
sarface
( sarface
的前端) 我发现这个链接的解释和例子非常有用: “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/