理解 %IOWAIT (%WIO)

%iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 %wio,含义都是一样的,这个指标常常被误读,很多人把它当作I/O问题的征兆,我自己每隔一段时间就会遇到对 %iowait 紧张兮兮的客户,不得不费尽唇舌反复解释,事实上这个指标所含的信息量非常少,不能单独用来判断系统有没有I/O问题,在此我们详细探讨一下它真正的含义,先从man page上的解释开始:

09:35:06 AM CPU %user %nice %system %iowait %steal %idle 09:35:07 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:35:08 AM all 0.51 0.00 2.53 13.13 0.00 83.84 09:35:09 AM all 1.54 0.00 7.69 39.49 0.00 51.28 09:35:10 AM all 2.04 0.00 9.18 39.80 0.00 48.98 09:35:11 AM all 1.02 0.00 7.65 40.31 0.00 51.02

下面是man page中的部分解释:

  • Linux:
%iowait Percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
  1. HP-UX:
%wio idle with some process waiting for I/O (only block I/O, raw I/O, or VM pageins/swapins indicated).

Linux和HP-UX的man page分别从两个角度描述了这个指标:Linux着眼于I/O,强调的是仍有未完成的I/O请求;而HP-UX着眼于进程,强调的是仍有进程在等待I/O,二者所说的是同一件事的两个方面,如果合在一起就完整了,就是:至少有一个I/O请求尚未完成,有进程因为等待它而休眠,我们不妨采纳Linux的措辞,%iowait 表示在一个采样周期内有百分之几的时间属于以下情况:CPU空闲、并且有仍未完成的I/O请求。
对 %iowait 常见的误解有两个:

  • 是误以为 %iowait 表示CPU不能工作的时间
    这种误解太低级了,%iowait 的首要条件就是CPU空闲,既然空闲当然就可以接受运行任务,只是因为没有进程可以运行,CPU才进入空闲状态的。那为什么没有进程可以运行呢?因为进程都处于休眠状态、在等待某个特定事件:比如等待定时器、或者来自网络的数据、或者键盘输入、或者等待I/O操作完成,等等。
  • 是误以为 %iowait 表示I/O有瓶颈问题
    为什么人们会认为 %iowait 偏高是有I/O问题的迹象呢?他们的理由是:”%iowait 的第一个条件是CPU空闲,意即所有的进程都在休眠,第二个条件是仍有未完成的I/O请求,意味着进程休眠的原因是等待I/O,而 %iowait 升高则表明因等待I/O而休眠的进程数量更多了、或者进程因等待I/O而休眠的时间更长了。“ 听上去似乎很有道理,但是不对:首先 %iowait 确实表示CPU空闲、所有进程都在休眠,也确实有的进程在等待I/O,然而 %iowait 升高并不能证明等待I/O的进程数量增多了,也不能证明等待I/O的总时间增加了。

为什么呢?看看下面两张图就明白了:

第一张图演示的是:在I/O完全一样的情况下,CPU忙闲状态的变化就能够影响 %iowait 的大小,图中我们看到,在CPU繁忙期间发生的I/O,无论有多少,%iowait 的值都是不受影响的(因为 %iowait 的第一个前提条件就是CPU必须空闲);当CPU繁忙程度下降时,有一部分I/O落入了CPU空闲的时间段内,这就导致了 %iowait 升高,可见,I/O并没有变化,%iowait 却升高了,原因仅仅是CPU的空闲时间增加了,请记住,系统中有成百上千的进程数,任何一个进程都可以引起CPU和I/O的变化,因为 %iowait、%idle、%user、%system 等这些指标都是全局性的,并不是特指某个进程。

再看第二张图,它描述了另一种情形:假设CPU的繁忙状况保持不变的条件下,即使 %iowait 升高也不能说明I/O负载加重了,如果2个I/O请求依次提交、使得整个时段内始终有I/O在进行,那么 %iowait 是100%;如果3个I/O请求同时提交,因为系统有能力同时处理多个I/O,所以3个并发的I/O从开始到结束的时间与一个I/O一样,%iowait 的结果只有50%;2个I/O使 %iowait 达到了100%,3个I/O的 %iowait 却只有50%,显然 %iowait 的高低与I/O的多少没有必然关系,而是与I/O的并发度相关,所以,仅凭 %iowait 的上升不能得出I/O负载增加 的结论。

这就是为什么说 %iowait 所含的信息量非常少的原因,它是一个非常模糊的指标,如果看到 %iowait 升高,还需检查I/O量有没有明显增加,avserv/avwait/avque等指标有没有明显增大,应用有没有感觉变慢,如果都没有,就没什么好担心的。

本文转载自:http://www.linuxprobe.com/understand-iowait.html

更多Linux干货请访问:http://www.linuxprobe.com/

时间: 2024-08-07 21:19:33

理解 %IOWAIT (%WIO)的相关文章

%iowait和CPU使用率的正确认知

resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU Usage Time and Percentage is calculated Linux进程状态 man (on RHEL 7) # man mpstat %usr Show the percentage of CPU utilization that occurred while executi

理解Linux系统中的load average

理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios 一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing).也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟

解决centos7.2中磁盘iowait过高

(一)简述 每天都收到磁盘iowait告警信息,尤其是日志服务器在进行大量的读写操作过程中,从而造成系统处于崩溃边缘,为查找磁盘iowait由于什么原因造成的以及后续的系统的优化点.centos有许多查找问题的工具,也有高级的. I/O Wait 就是一个需要使用高级的工具来debug的问题,当然也有许多基本工具的高级用法.I/O wait的问题难以定位的原因    是因为我们有很多工具可以告诉你说I/O 受限了,但是并没有告诉你具体是哪些进程们引起的. 具体的思路如下:top .查看由cpu一

[转]理解Linux的性能

来源:http://www.linuxfly.org/post/114/ 项目中常遇到需要对目前运行的系统进行效率分析,或碰到客户咨询如何优化系统的效率问题.更多的情况是,在系统出现问题的时候,需要分析原因,定位系统故障或瓶颈,当然,最好是可以一并解决故障.但实际上,操作系统优化是一个非常复杂的问题,况且linux有自己一套有别于其他操作系统管理的机制,由此会引起很多不必要的误解和麻烦.自问我是写不错条理性的文章了,只能转一份高人写的文档供参考.(文章根据实际进行了一定的裁减,并对容易碰到的问题

理解ANR的前世今生,解决ANR就是这么简单!

1. 什么是ANR? ANR(Application Not Responding)即应用程序无响应. 2. ANR产生的原因是什么? ANR产生的根本原因是APP阻塞了UI线程.在android系统中每个App只有一个UI线程,是在App创建时默认生成的,UI线程默认初始化了一个消息循环来处理UI消息,ANR往往就是处理UI消息超时了.那么UI消息来源有哪些呢?主要有两种来源: 2.1 来自于AMS的回调消息 在Android系统中,应用程序是有Android的四大组件组成,AMS负责对应用程

iostat和iowait详细解说

简单的说,sar -u看出来的cpu利用率iowait 不实用,iostat -x 中的 svctm   和util 参数 命令形式: iostat -x 1 每隔一秒输出下 其中的svctm参数代表平均每次设备I/O操作的服务时间 (毫秒),反应了磁盘的负载情况,如果该项大于15ms,并且util%接近100%,那就说明,磁盘现在是整个系统性能的瓶颈了. await 参数代表平均每次设备I/O操作的等待时间 (毫秒), 也要多和 svctm 来参考.差的过高就一定有 IO 的问题.如果 svc

02 基础篇:到底应该怎么理解“平均负载”?

02 | 基础篇:到底应该怎么理解"平均负载"? 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况.比如像下面这样,我在命令行里输入了 uptime 命令,系统也随即给出了结果. uptime 02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88 但我想问的是,你真的知道这里每列输出的含义吗?我相信你对前面的几列比较熟悉,它们分别是当前时间.系统运行时

深入理解Kafka必知必会(3)

Kafka中的事务是怎么实现的? Kafka中的事务可以使应用程序将消费消息.生产消息.提交消费位移当作原子操作来处理,同时成功或失败,即使该生产或消费会跨多个分区. 生产者必须提供唯一的transactionalId,启动后请求事务协调器获取一个PID,transactionalId与PID一一对应. 每次发送数据给<Topic, Partition>前,需要先向事务协调器发送AddPartitionsToTxnRequest,事务协调器会将该<Transaction, Topic,

Python——深入理解urllib、urllib2及requests(requests不建议使用?)

深入理解urllib.urllib2及requests            python Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议[1] .Python语法简洁而清晰,具有丰富和强大的类库. urllib and urllib2 区别 urllib和urllib2模块都做与请求URL相关的操作,但