尽管我读过很多关于 iowait 的文章,但它对我来说仍然是个谜。
我知道这是 CPU 等待 IO 操作完成所花费的时间,但具体是哪种 IO 操作?我也不确定,为什么它如此重要?CPU 不能在 IO 操作完成时执行其他操作,然后再处理数据吗?
此外,什么是正确的工具来诊断哪些进程确实等待了 IO。
那么有哪些方法可以最小化 IO 等待时间呢?
答案1
我知道这是 CPU 等待 IO 操作完成所花费的时间,但具体是哪种 IO 操作?我也不确定,为什么它如此重要?CPU 不能在 IO 操作完成时执行其他操作,然后再处理数据吗?
是的,当一个进程因 IO 而受阻时,操作系统会安排其他进程运行。但是,在该进程中,除非使用异步 IO,否则在任何 IO 操作完成之前,它都不会继续运行。
此外,什么是正确的工具来诊断哪些进程确实等待了 IO。
您可能会发现一些有用的工具
iostat
,监控磁盘的服务时间iotop
(如果你的内核支持的话),监控每个进程的 IO 请求细目strace
,查看进程发出的实际操作
那么有哪些方法可以最小化 IO 等待时间呢?
- 确保您有可用的物理内存,以便操作系统可以在内存中缓存磁盘块
- 将文件系统磁盘使用率保持在 80% 以下,以避免过多的碎片
- 调整你的文件系统
- 使用电池供电的阵列控制器
- 执行 io 操作时选择合适的缓冲区大小
答案2
老问题,最近遇到过,但觉得现有的答案不够。
IOWait 定义 & 属性
IOWait(通常标记%wa
为 top)是空闲的一个子类别(%idle
通常表示为除已定义子类别之外的所有空闲),表示 CPU 没有执行任何操作。因此,只要有另一个进程可供 CPU 处理,它就会处理。此外,空闲、用户、系统、iowait 等是相对于 CPU 的测量值。换句话说,您可以将 iowait 视为等待 io 导致的空闲。
确切地说,iowait 是接收和处理硬件中断所用的时间占处理器滴答数的百分比。软件中断通常单独标记为%si
。
重要性及潜在误解
IOWait 很重要,因为它通常是了解您是否遇到 IO 瓶颈的关键指标。但没有 iowait 并不一定意味着您的应用程序不是IO 瓶颈。考虑在系统上运行两个应用程序。如果程序 1 严重受到 IO 瓶颈影响,而程序 2 占用大量 CPU,则%user + %system
CPU 占用率可能仍约为 ~100%,相应地,iowait 将显示 0。但这只是因为程序 2 占用大量 CPU,相对而言似乎与程序 1 无关,因为所有这些都是从 CPU 的角度出发的。
检测 IOWait 的工具
查看 Dave Cheney 和 Xerxes 的帖子
但也会简单top
展现出来%wa
。
减少 IOWait
此外,现在我们即将进入 2013 年,除了其他人所说的之外,还有一个价格实惠的简单而出色的 IO 存储设备选项,即 SSD。SSD 太棒了!!!
答案3
我发现此链接中的解释和示例非常有用:“iowait”到底是什么?顺便说一句,为了完整起见,这里的 I/O 指的是磁盘 I/O,但也可以包括网络挂载磁盘(如 nfs)上的 I/O,如另一个帖子。
我将引用一些重要的部分(以防链接失效),其中一些是其他人已经说过的内容的重复,但对我来说,至少这些更清楚:
用一句话来总结,“iowait”是CPU空闲且至少有一个I / O正在进行的时间百分比。
每个 CPU 可以处于四种状态之一:用户,系统,空闲,iowait。
我想知道当系统有其他进程准备运行时,而一个进程正在等待 I/O 时会发生什么。下面解释了这一点:
如果 CPU 处于空闲状态,则内核将确定当前是否至少有一个从该 CPU 发起的 I/O 正在执行,无论是本地磁盘还是远程安装的磁盘 (NFS)。如果有,则“iowait”计数器加一。如果没有从该 CPU 发起的 I/O 正在执行,则“idle”计数器加一。
以下是一个例子:
假设有两个程序在 CPU 上运行。一个是从磁盘读取数据的“dd”程序。另一个程序不执行 I/O,但 100% 的时间都在进行计算工作。现在假设 I/O 子系统出现问题,并且物理 I/O 需要一秒钟以上才能完成。每当“dd”程序在等待其 I/O 完成时处于休眠状态时,另一个程序就可以在该 CPU 上运行。当发生时钟中断时,总会有一个程序在用户模式或系统模式下运行。因此,%idle 和 %iowait 值将为 0。即使 iowait 现在为 0,也并不意味着没有 I/O 问题,因为如果物理 I/O 需要一秒钟以上才能完成,显然存在问题。
全文值得一读。以下是本页的镜像,以防万一。
答案4
对于 Solaris,如果我需要查看正在运行的 I/O 操作,我会使用 DTrace 查看进程正在做什么。对于 Linux,有一个类似的程序叫做系统水龙头它提供了与内核和进程调用类似级别的暴露。
cp
我在学习 DTrace 时使用的一个例子是将一个命令与另一个命令进行比较dd
。您可以看到,dd
执行的读取操作比写入操作多得多,而cp
没有,这主要是因为dd
默认使用的缓冲区大小(如果我没记错的话)。