原文:http://www.weiruoyu.cn/?p=506


这两天发现一台测试用的服务器经常负载很高,但cpu和内存消耗却很少,很是奇怪,经过诊断发现是由于大容量的测试数据导致高并发下的磁盘IO消耗比较大,由于缓存是小文件并且数量比较大,所以并发比较高的情况下Io消耗非常大。那怎样才能快速的定位到并发高是由于磁盘io开销大呢?
一、用 top 命令中的 信息进行观察
204027418.jpg

划红线的参数解释如下:
Tasks: 437 total 进程总数
4 running 正在运行的进程数
430 sleeping 睡眠的进程数
3 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s):
7.1% us 用户空间占用CPU百分比
4.2% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
76.8% id 空闲CPU百分比
12% wa 等待输入输出的CPU时间百分比
12% wa 的百分比可以大致的体现出当前等待输入输出的磁盘io请求过于频繁。

为进一步分析,我们跟踪关键进程定位程序
#strace -p 28644 (如图示占用CPU较高)

205645745.jpg

说明在多线程条件下,如果并发操作过于频繁,semtimedop会调用失败,Input/output 出错。
进一步定位到程序 #ps -ef | grep 28644

210320529.jpg

可以知道是ora_lgwr_nms程序导致的读写开销比较大。


二、利用IOSTAT命令观察
磁盘的IO性能是衡量计算机总体性能的一个重要指标。Linux提供了iostat命令来获却磁盘输入/输出(即IO)统计信息。
#iostat -x 1 统计完整的结果,每秒一次。

211124839.jpg

iowait的值比较大,说明读写频繁。
#iostat -p 1统计各个分区的读写情况,每秒1次。
083525343.jpg

使用 #mount 命令,来对应查找就知道sda5对应的/opt分区和sdb8对应的/data分区读写频繁。
083648227.jpg

再定位到DATA分区,查看数据库归档情况,发现一分钟内归档产生四个文档并且每个文件有48M这么大,写入应该非常频繁,导致磁盘IO开销比较大。
083838990.jpg

而OPT分区由于有FTP传输到导致磁盘开销比较大。
分析定位完毕,针对相关问题调整FTP和数据库归档,然后再看一下都正常了。

084733678.jpg

084802567.jpg

总结:TOP、IOSTAT都是比较常见的命令,通过基本命令的灵活应用来分析和定位问题是比较方便的,特别是基本命令的参数选择和使用更是值得我们大家研究的。

补充:磁盘IOPS知识

IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的 I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

传统磁盘本质上一种机械装置,如FC, SAS, SATA磁盘,转速通常为5400/7200/10K/15K rpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。
寻道时间Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。
旋转延迟Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速, 通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。
数据传输时间Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。

因此,理论上可以计算出磁盘的最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15K rpm,则磁盘IOPS理论最大值分别为,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200

决定IOPS的主要取决与阵列的算法,cache命中率,以及磁盘个数。阵列的算法因为不同的阵列不同而不同.在raid5与raid10上,读iops没有差别,但是相同的业务,写iops最终落在每块磁盘上是有差别的,如果达到了每块磁盘的写的i0ps限制,性能会受到影响。对于raid5来说每一个写实际发生了4个io,而raid10只发生了2次io,所以raid10比raid5在写上要快一些。

参考:http://www.weiruoyu.cn/?p=506