liunx 定位IO瓶颈方法

定位IO瓶颈的一些方法(iotop工具具体查看IO负载主要是落在哪个进程上)

IO瓶颈往往是我们可能会忽略的地方(我们常会看top、free、netstat等等,但经常会忽略IO的负载情况),今天给大家详细分享一下如何确认一台服务器的IO负载是否到达了瓶颈,以及可能优化、定位的点。

先来看一台典型的IO密集型服务器的cpu统计图:

可以看到,CPU总使用率不高,平均1.3%,max到5.6%,虽然大部分都耗在了iowait上,但才百分之五左右,应该还没到瓶颈吧???
错了!这里要特别注意:iowait≠IO负载,要看真实的IO负载情况,一般使用iostat –x 命令
$ iostat –x 1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.04    4.99    0.00   94.92

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    81.00 104.00  4.00 13760.00   680.00   133.70     2.08   19.29   9.25  99.90
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda5              0.00    81.00 104.00  4.00 13760.00   680.00   133.70     2.08   19.29   9.25  99.90

这里重点指标是svctm和util这两列,man一下可以看到如下解释:
svctm
       The average service time (in milliseconds) for I/O requests that were issued to the device.
%util
       Percentage  of  CPU time during which I/O requests were issued to the device (bandwidth utilization for the device).Device saturation occurs when this value is close to 100%.

可以看到,svctm指的是“平均每次设备I/O操作的服务时间 (毫秒)”,而util指的是“一秒中I/O 操作的利用率,或者说一秒中有多少时间 I/O 队列是非空的。”
我们这里发现util已经接近100%,结合man的说明“Device saturation occurs when this value is close to 100%”可以知道其实目前这台服务器的IO已经到达瓶颈了。

那为什么最前面的cpu统计图的iowait项只有5.5%左右呢?因为这个iowait(也就是top里的wa%)指的是从整体来看,CPU等待IO的耗时占比:
wa -- iowait
Amount of time the CPU has been waiting for I/O to complete.
也就是说,CPU可能拿出一部分时间来等待IO完成(iowait),但从磁盘的角度看,磁盘的利用率已经满了(util%),这种情况下,CPU使用率可能不高,但是系统整体QPS已经上不去了,如果加大流量,会导致单次IO耗时的继续增加(因为IO请求都堵在队列里了),从而影响系统整体的处理性能。

确认了IO负载过高后,可以使用iotop工具具体查看IO负载主要是落在哪个进程上了。

那如何规避IO负载过高的问题呢?具体问题具体分析:
1. 如果你的服务器用来做日志分析,要避免多个crontab交叠执行导致多进程随机IO(参考:随机IO vs 顺序IO),避免定期的压缩、解压大日志(这种任务会造成某段时间的IO抖动)。
2. 如果是前端应用服务器,要避免程序频繁打本地日志、或者异常日志等。
3. 如果是存储服务(mysql、nosql),尽量将服务部署在单独的节点上,不要和其它服务共用,甚至服务本身做读写分离以降低读写压力;调优一些buffer参数以降低IO写的频率等等。另外还可以参考LevelDB这种将随机IO变顺序IO的经典方式。

参考资料:
http://oplinux.com/order/iostat.html
http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

时间: 2024-11-09 01:48:10

liunx 定位IO瓶颈方法的相关文章

如何识别SQL Server中的IO瓶颈

原文:如何识别SQL Server中的IO瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2329/how-to-identify-io-bottlenecks-in-ms-sql-server/ 问题: 我们可能经常会遇到SQLServer数据库频繁关闭的情况.在分析了内存和CPU使用情况后,我们需要继续调查根源是否在I/O.我们应该如何识别SQLServer是否有I/O相关的瓶颈? 解决: 当数据页经常从缓冲池中移进移出的时候,I/O子系统就会成

IO负载高的来源定位 IO系列

http://elf8848.iteye.com/category/281637 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到IO负载的来源进程和来源文件导致无法进行相应的策略来解决问题. 这个现象在MySQL上更为常见,在5.6(performance_schema提供io instrument)之前,我们通常只能猜到是MySQL导致的高IO,但是没法定位具体是哪个文件带来的负载. 例如是ibdata的刷写?还是冷门ib

liunx系统安装tomcat的方法

安装tomcat前需要先安装jdk,安装jdk的方法参考我的上一篇文章:liunx系统安装jdk的方法 1.下载tomcat 下载地址:http://tomcat.apache.org/download-60.cgi 我下载的是apache-tomcat-6.0.44.zip 2.安装tomcat 将下载的压缩包apache-tomcat-6.0.44.zip放到目录/usr/tomcat下 2.1.解压命令如下: # unzip apache-tomcat-6.0.44.zip 2.2.编辑c

jquery模拟字母顺序排序定位城市列表方法(bug改进)

jquery模拟字母顺序排序定位城市列表方法 下载地址http://www.lanrenzhijia.com/jquery/3155.html bug 重庆--长沙不能正常排序. 原因是derail有可能会放回两个字符的数组.需要做判断 改进 //改动 特殊字符-->可能还有问题--返回的是数组有两个字符 var   derail =makePy(SortList.eq(i).find('.num_name').text().charAt(0)) if(derail.length==2&&a

linux下重新定位svn url方法

linux下重新定位svn url方法: 如果更换了SVN服务器,就需要重新定位,指向新的svn url. 重新定位命令:svn switch --relocate 原svn地址 新svn地址. 查看原svn路径方法:svn info linux下重新定位svn url方法

重新定位SVN URL方法

linux下重新定位SVN URL方法: 如果更换了SVN服务器,就需要重新定位,指向新的SVN URL. 重新定位命令:svn switch --relocate 原svn地址 新svn地址 如何查看原svn地址? 查看原svn路径方法:svn info 例如: 1.进入工作复本 cd ~/test 2.查看仓库地址(URL)     svn info     路径: .     URL: svn://192.168.1.16/web/www.kukaka.org     版本库根: svn:

IE8 textarea 滚动条定位不准解决方法

工作中遇到一个bug: IE8 下textarea 如果带滚动条(height:100px;overflow:scroll-y;),内容高度超过可视区域之后,输入文字,滚动条位置会乱跳. 开始以为是js的问题,查看了代码感觉不是js的问题,于是借助索工具搜索了一番,这个问题感觉很少见,但是搜索之后发现确实有人遇到过这个问题. 也有些许的解决方案,经过几轮测试找到了最终的解决方案: textarea.fix-scroll{ width: 700px; min-width: 100%; max-wi

牛人笔记----(死锁问题定位与解决方法)

1 --死锁问题定位与解决方法 2 3 --为了解决死锁问题,SQLSERVER数据库引擎死锁监视器会定期检查陷入死锁的任务 4 --如果监视器检测到这种依赖循环关系,会选择其中一个任务作为牺牲品,然后 5 --终止其事务并提示错误.这就是用户会遇到的死锁错误 6 7 --可以发生死锁的资源 8 --需要说明的是,死锁不是只发生在锁资源上,以下类型的资源都可能会造成阻塞,并 9 --最终导致死锁 10 11 --1.锁:例如:页,行,元数据和应用程序上的锁 12 --2.工作线程:如果排队等待线

阻塞与死锁(三)——死锁的定位及解决方法

原文:阻塞与死锁(三)--死锁的定位及解决方法 死锁所在的资源和检测: 在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源.会造成这些任务的永久阻塞,从而出现死锁. 下图为例: l  事务T1获得了行R1的共享锁. l  事务T2获得了行R2的共享锁. l  然后事务T1请求行R2的排它锁,但是T2完成并释放其对R2的共享锁之前被阻塞. l  T2请求行R1的排它锁,但是事务T1完成并释放其对R1持有的共享锁之前被阻塞. 现在T2与T1相互等待,导致了死锁.一般情