我们最常用的磁盘性能评价指标主要有两个:IOPS和吞吐量。IOPS是Input/Output Per Second的缩写,它表示单位时间内系统能处理的I/O请求数量,即每秒钟系统能处理的读写次数。吞吐量衡量单位时间内系统能处理的数据的体量,即每秒钟磁盘上能读写出的数据量的大小,通常以kB/s或MB/s为单位。
两个指标相互独立又相互关联,在不同业务场景下,侧重关注的指标也有所不同。
举例说明
举个例子来说明这两个指标。磁盘IO就相当于餐馆端餐员从后厨端菜到餐厅,然后由上菜员上菜的过程。托盘的大小,决定了一次最多可以上多少盘菜(数据量)。
一次上菜的过程就相当于一次数据IO请求,端菜员从后厨接菜上菜盘,餐厅接菜员给客户上菜,就是磁盘对IO的读写处理。在端菜员和上菜员数量固定且上菜速度(磁盘数据处理速度)一致的情况下,如果餐厅放置菜盘的托盘有大小之分,那么上菜时用小的托盘肯定比用大的托盘完成上菜的速度肯定快,时间耗时更短(寻找餐桌的时间少,磁盘寻址时间短),但单次菜盘数(吞吐量)较少。
所以在做磁盘性能测试的时候,往往一次只关注一个指标,追求IOPS,就用小托盘端少份数的菜,分多次配送, 会增加寻址时间(需要准备把每盘菜送达准备餐桌)。追求吞吐量,就用大托盘,一次端多份数的菜,节省往来后厨和餐厅的时间(寻址时间)。
测试影响因素
实际测量中,IOPS会受到很多因素的影响
数据块大小
相当于我们前面说的大托盘和小托盘端菜的情况
顺序和随机
顺序就是我们的菜都是按桌上的,随机则表示一个托盘的菜是多个餐桌拥有,那寻找餐桌就比较耗时(寻址时间)。
队列深度
如果只有一个端餐员,那么当端餐员在后厨端菜或者送往餐厅过程中,所有的上菜员都处于等待状态。作为酒店老板,肯定不想看到这种情况,肯定希望上菜员(磁盘)一直处于工作状态,从而节约成本(提高磁盘性能)。想实现这一点,我们可以增加多个端菜员,保持始终有端菜员与上菜员对接,这样整个上菜过程就一直处于饱和状态。
队列深度就是在后台登上厨师炒菜的端菜员到来往后厨与餐厅的端菜员到与上菜员对接的端菜员的总数。
线程数
测试时,增加线程数也可以增加并发度,从而使上菜员一直处于有工作可做的状态。
读写比例
读操作相当于我们将菜从后厨运送到餐桌就结束了。而写操作意味着把餐桌吃完的空盘收回到后厨。因此不同的读写比例也会造成测试结果的不同。
正是由于这些不同影响因素的存在,我们在对磁盘进行性能测试时,需要仔细选择测试参数,否则将无法测出磁盘的最优性能。同时应将测试参数和方法定性定量,否则测试结果将失去比较的价值。
fio 参数解释
yum install fio libaio-devel
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
IOPS
随机读写频繁的应用,如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。
随机写IOPS
4k 随机写
16k 随机写
随机读IOPS
4K 随机读
16k 随机读
顺序读IOPS
4k 顺序读
16k 顺序读
顺序写IOPS
4k 顺序写
16k 顺序写
输出结果分析
4k iops 随机写案例
吞吐量
吞吐量就是把块大小(bs值)调大
写吞吐量
|
|
读吞吐量
顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(Video On Demand),关注连续读写性能。数据吞吐量是关键衡量指标。
iostat查看结果
|
|
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并。
wrqm/s:每秒对该设备的写请求被合并次数。
r/s:每秒读取的次数(IOPS)。
w/s:每秒写入的次数(IOPS)。
rsec/s:每秒读取的扇区数。
wsec/s:每秒写入的扇区数。
rKB/s:每秒读数据量(kB为单位)。
wKB/s︰ 每秒写数据量(kB为单位)。
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)。
avgqu-sz:平均等待处理的IO请求队列长度。
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
svctm:平均每次IO请求的处理时间(毫秒为单位)。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:
util = (r/s+w/s) * (svctm/1000)
对于上面的例子有:util = (7.8+31.49)*(2.62/1000) = 0.098