这周继续上上周的话题,关于linux下的一些性能分析。之前我们聊了CPU、内存的性能分析方法,这周我们聊聊关于磁盘IO的性能分析。

之前之所以去百度学道,就是因为老王在自己在学校瞎折腾的时候,发现自己的服务器如果压力稍微大一些,就扛不住,而且能很明显的听到磁盘哐哧哐哧飞速旋转的声音。所以,决心去bd看看,大公司是怎么样解决磁盘性能问题的。后来去贴吧学艺,正好接手了贴子存储系统的重构工作,后来和另外一个同事合作,完成了贴吧百亿贴子存储系统的研发,也算完成了当年的夙愿。当时做这个系统开发的时候,对于存储系统的研究还是比较多,今天就抽一些关于性能分析的方法给大家聊聊。

说到IO,就得先说说存储系统。我们知道,在存储系统里面,越靠近cpu的(比如cpu的缓存),价格越贵、容量越小、速度越快;越远离cpu的(比如磁盘),价格越便宜、容量越大、速度越慢。

一般来讲,我们的普通磁盘,读写一次是以毫秒为单位的。而且普通硬盘由于是机械的磁盘、磁道这样的旋转顺序存储,所以顺序读写的性能高于随机读写(随机读写实际是要不断旋转磁头、扇区从而来找到对应的位置)。

而现在又有SSD固态硬盘(Solid State Drives),他是用固态电子存储芯片阵列而制成的硬盘,不存在机械的旋转,所以在随机读写性能上还不错。不过顺序读写有可能和机械硬盘差不多。

好了,有了这些基本知识,我们再来看IO性能的分析。

1、磁盘情况

我们可以通过df命令和fdisk命令,来看看我们磁盘的大小,以及其他的信息。

可以看到我们在/dev/下有一个40多G的硬盘,已经用了14%。然后一共有8k多万个扇区,每个扇区512字节。

2、磁盘性能分析

我们分析io性能,第一个可以使用的工具,仍然是万能的vmstat。

在vmstat的状态统计信息里:

b值代表因为io阻塞排队的任务数;

bi值代表每秒写入磁盘的块数;

bo值代表每秒读出磁盘的块数;

wa值代表因为IO等待消耗的cpu时间比例。

这几个值变大,都意味着IO的消耗增加。对于读请求大的服务器,一般b、bi、wa都会比较大,而对于写入量大的服务器,一般b、bo、wa都会比较大。

除了vmstat,我们还有另外一个更专业的利器:iostat。这个工具是专门用来分析io性能的工具。

初次看到这个结果的时候,确实有点懵。但是待老王一个个给大家分析。

rrqm/s & wrqm/s : 每秒读取/写入磁盘的请求被合并了多少次。我们最好的情况,就是读取或者写入的数据尽量的合并,这样虽然请求次数可能多,但是真正进行io的次数会比较少;

r/s & w/s : 每秒读写次数;

rkB/s & wkB/s : 每秒读写kb数;

avgrq-sz : 平均请求扇区的大小;

avgqu-sz : 平均请求队列的长度,队列长度越短越好;

util : 这个是一个关键参数,表明了io的繁忙程度。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%。所以,如果这个值接近100%,则说明io压力非常大了。

好了,有了以上两个命令,我们基本上可以确定我们现在磁盘整体的运行状态。如果我们要确定是具体哪个进程的io开销有多大,怎么办呢?

我们还有一个工具:iotop。这个命令类似于top,可以显示每个进程的io情况。

有了这个命令,我们就可以定位到具体哪个进程有比较重的io问题。

好了,今天老王就聊到这里,你觉得怎么样呢?

Linux环境下的性能分析 之 IO篇
标签: