Peter Krumins Asked: 2009-05-28 01:52:46 +0800 CST2009-05-28 01:52:46 +0800 CST 2009-05-28 01:52:46 +0800 CST 谁能准确解释IOWait是什么? 772 尽管我已经阅读了有关 iowait 的信息,但它对我来说仍然是个谜。 我知道这是 CPU 等待 IO 操作完成所花费的时间,但究竟是哪种 IO 操作呢?我也不确定,为什么它如此重要?CPU 不能在 IO 操作完成时做些别的事情,然后再回去处理数据吗? 还有什么是正确的工具来诊断哪些进程确实在等待 IO。 以及有哪些方法可以最大限度地减少 IO 等待时间? io iowait 7 个回答 Voted Dave Cheney 2009-05-28T02:28:43+08:002009-05-28T02:28:43+08:00 我知道这是 CPU 等待 IO 操作完成所花费的时间,但究竟是哪种 IO 操作呢?我也不确定,为什么它如此重要?CPU 不能在 IO 操作完成时做些别的事情,然后再回去处理数据吗? 是的,当一个进程在 IO 上被阻塞时,操作系统会安排其他进程运行。但是在该进程中,除非它使用异步 IO,否则在任何 IO 操作完成之前它都不会进行。 还有什么是正确的工具来诊断哪些进程确实在等待 IO。 一些您可能会觉得有用的工具 iostat, 监控磁盘的服务时间 iotop(如果你的内核支持的话),监控每个进程的 IO 请求的分解 strace, 查看一个进程发出的实际操作 以及有哪些方法可以最大限度地减少 IO 等待时间? 确保您有可用的物理内存,以便操作系统可以在内存中缓存磁盘块 将文件系统磁盘使用率保持在 80% 以下以避免过多碎片 调整你的文件系统 使用电池支持的阵列控制器 执行 io 操作时选择好的缓冲区大小 Grumpy 2012-12-26T04:45:13+08:002012-12-26T04:45:13+08:00 老问题,最近碰到了,但觉得现有的答案不够。 IOWait 定义和属性 IOWait(通常标记%wa在顶部)是空闲的子类别(%idle通常表示为除定义的子类别之外的所有空闲),这意味着 CPU 没有做任何事情。因此,只要 CPU 可以处理另一个进程,它就会这样做。此外,空闲、用户、系统、iowait 等是相对于 CPU 的度量。也就是说,可以把iowait看成是等待io造成的idle。 准确地说,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。固态硬盘太棒了!!! haridsv 2014-11-08T01:08:17+08:002014-11-08T01:08:17+08:00 我发现此链接中的解释和示例非常有用:“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”计数器加一。如果没有从该 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 需要一秒钟才能完成,显然会有一个问题。 全文值得一读。这是此页面的镜像,以防万一。 Xerxes 2009-05-28T02:32:52+08:002009-05-28T02:32:52+08:00 iowait iowait是处理器/处理器等待的时间(即处于空闲状态并且什么都不做),在此期间实际上有未完成的磁盘 I/O 请求。 这通常意味着块设备(即物理磁盘,而不是内存)太慢,或者只是饱和。 因此,您应该注意,如果您看到系统上的平均负载较高,并且在检查时发现其中大部分实际上是由于 I/O 等待造成的,这并不一定意味着您的系统有问题 - 当您的系统出现这种情况时除了 I/O 绑定的进程(即,比其他任何事情执行更多 I/O 的进程(非 I/O 绑定的系统调用))之外,机器根本无事可做。从您在系统上所做的任何事情仍然非常敏感这一事实也应该很明显。 工具 sar(从sysstat包中,在大多数 *nix 机器上可用) iostat sarface(一个前端sar) Milner 2009-05-28T04:34:26+08:002009-05-28T04:34:26+08:00 对于 Solaris,如果我需要查看正在运行的 I/O 操作,我会使用 DTrace 查看进程在做什么。对于 Linux,有一个类似的程序称为systemtap,它提供了对内核和进程调用的类似程度的暴露。 我在学习 DTrace 时使用的一个示例是将cp命令与dd命令进行比较。您可以看到它dd为写入做了更多的读取,而cp没有,主要是因为dd默认使用的缓冲区大小(如果我没记错的话)。 Jeremy French 2009-05-28T02:01:56+08:002009-05-28T02:01:56+08:00 什么样的 IO 操作将取决于您的应用程序和设置。 这很重要,因为在某些情况下 CPU 无法获得它需要继续的数据或指令。在某些情况下,它可以继续,但这取决于正在运行的应用程序以及它可以做什么。如果您有一个执行大量磁盘访问的单线程应用程序,那么您将需要等待。 为了最大限度地减少 IO 时间,购买更多更快的内存,获得更快的磁盘,对你拥有的磁盘进行碎片整理。 如果它是一个内部应用程序,这是瓶颈,请查看它是否可以优化为读取更大的块或异步执行 IO。 Singo 2014-01-02T07:50:34+08:002014-01-02T07:50:34+08:00 使用ps aux可以打印进程STAT ,如果stat为D或者Ds,进程进入Uninterruptible sleep时进程处于Uninterruptible sleep(通常是IO) ,增加runqueue的nr_iowait,如果nr_iowait > 0则统计cpu的空闲时间等待 vmstat 还显示有多少进程块 r:等待运行时的进程数。 b:不间断睡眠的进程数。 http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
是的,当一个进程在 IO 上被阻塞时,操作系统会安排其他进程运行。但是在该进程中,除非它使用异步 IO,否则在任何 IO 操作完成之前它都不会进行。
一些您可能会觉得有用的工具
iostat
, 监控磁盘的服务时间iotop
(如果你的内核支持的话),监控每个进程的 IO 请求的分解strace
, 查看一个进程发出的实际操作老问题,最近碰到了,但觉得现有的答案不够。
IOWait 定义和属性
IOWait(通常标记
%wa
在顶部)是空闲的子类别(%idle
通常表示为除定义的子类别之外的所有空闲),这意味着 CPU 没有做任何事情。因此,只要 CPU 可以处理另一个进程,它就会这样做。此外,空闲、用户、系统、iowait 等是相对于 CPU 的度量。也就是说,可以把iowait看成是等待io造成的idle。准确地说,iowait 是接收和处理硬件中断所花费的时间占处理器节拍的百分比。软件中断通常单独标记为
%si
.重要性和潜在的误解
IOWait 很重要,因为它通常是了解您是否在 IO 上遇到瓶颈的关键指标。但是没有 iowait 并不一定意味着你的应用程序在 IO 上没有瓶颈。考虑在一个系统上运行的两个应用程序。如果程序 1 严重 io 瓶颈,而程序 2 是重度 CPU 用户,则
%user + %system
CPU 的使用率可能仍然约为 100%,相应地,iowait 将显示 0。但这只是因为程序 2 是密集型的,并且相对似乎什么也没说程序 1 因为所有这些都是从 CPU 的角度来看的。检测 IOWait 的工具
查看 Dave Cheney 和 Xerxes 的帖子
但也有一个简单的
top
将显示在%wa
.减少 IOWait
此外,由于我们现在即将进入 2013 年,除了其他人所说的之外,简单的 IO 存储设备的选择是负担得起的,即 SSD。固态硬盘太棒了!!!
我发现此链接中的解释和示例非常有用:“iowait”到底是什么?. 顺便说一句,为了完整起见,这里的 I/O 是指磁盘 I/O,但也可以包括网络挂载磁盘(例如 nfs)上的 I/O,如另一篇文章中所述。
我将引用一些重要的部分(以防链接失效),其中一些会重复其他人已经说过的话,但至少对我来说这些更清楚:
我想知道当系统准备好运行其他进程而一个进程正在等待 I/O 时会发生什么。下面解释它:
这是一个例子:
全文值得一读。这是此页面的镜像,以防万一。
iowait
iowait
是处理器/处理器等待的时间(即处于空闲状态并且什么都不做),在此期间实际上有未完成的磁盘 I/O 请求。这通常意味着块设备(即物理磁盘,而不是内存)太慢,或者只是饱和。
因此,您应该注意,如果您看到系统上的平均负载较高,并且在检查时发现其中大部分实际上是由于 I/O 等待造成的,这并不一定意味着您的系统有问题 - 当您的系统出现这种情况时除了 I/O 绑定的进程(即,比其他任何事情执行更多 I/O 的进程(非 I/O 绑定的系统调用))之外,机器根本无事可做。从您在系统上所做的任何事情仍然非常敏感这一事实也应该很明显。
工具
sar
(从sysstat
包中,在大多数 *nix 机器上可用)iostat
sarface
(一个前端sar
)对于 Solaris,如果我需要查看正在运行的 I/O 操作,我会使用 DTrace 查看进程在做什么。对于 Linux,有一个类似的程序称为systemtap,它提供了对内核和进程调用的类似程度的暴露。
我在学习 DTrace 时使用的一个示例是将
cp
命令与dd
命令进行比较。您可以看到它dd
为写入做了更多的读取,而cp
没有,主要是因为dd
默认使用的缓冲区大小(如果我没记错的话)。什么样的 IO 操作将取决于您的应用程序和设置。
这很重要,因为在某些情况下 CPU 无法获得它需要继续的数据或指令。在某些情况下,它可以继续,但这取决于正在运行的应用程序以及它可以做什么。如果您有一个执行大量磁盘访问的单线程应用程序,那么您将需要等待。
为了最大限度地减少 IO 时间,购买更多更快的内存,获得更快的磁盘,对你拥有的磁盘进行碎片整理。
如果它是一个内部应用程序,这是瓶颈,请查看它是否可以优化为读取更大的块或异步执行 IO。
使用ps aux可以打印进程STAT
,如果stat为D或者Ds,进程进入Uninterruptible sleep时进程处于Uninterruptible sleep(通常是IO)
,增加runqueue的nr_iowait,如果nr_iowait > 0则统计cpu的空闲时间等待
vmstat 还显示有多少进程块
r:等待运行时的进程数。
b:不间断睡眠的进程数。
http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/