在服务器使用过程中,经常需要对磁盘性能进行评估,以此来判断磁盘能否满足业务需要。本文主要讲解磁盘性能相关的基本概念和常见的测试性能的方法。
一、磁盘性能相关的基本概念
磁盘的I/O,顾名思义就是磁盘的输入输出。输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。我们常见的磁盘类型有 ATA、SATA、FC、SCSI、SAS、SSD,这几种磁盘中,服务器常用的是SATA、SAS、SSD磁盘,每一种磁盘的性能是不一样的。一般来说I/O性能: SATA < SAS < SSD
磁盘阵列的瓶颈分析主要体现在2个方面:IOPS与吞吐量。
IOPS(Input/Output Per Second)即每秒进行读写(I/O)操作的次数,是衡量磁盘性能的主要指标之一,多用于数据库等场合,衡量随机读写的性能。
另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(VideoOn Demand),则更关注吞吐量指标。
简而言之:
磁盘的IOPS,也就是在一秒内,磁盘进行多少次I/O读写。
磁盘的吞吐量,也就是每秒磁盘I/O的流量,即磁盘写入加上读出的数据的大小。
IOPS 与吞吐量的关系:
每秒I/O吞吐量=IOPS*平均I/O size。
从公式可以看出:I/O SIZE 越大,IOPS越高,那么每秒I/O的吞吐量就越高。因此,我们会认为 IOPS 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
-
吞吐量
吞吐量主要取决于阵列的架构,光纤通道的大小以及硬盘的个数。
-
阵列的架构与每个阵列不同,但也都存在内部带宽,不过在一般情况下,内部带宽都设计的很充足,不是瓶颈所在。
-
其次是光纤通道对数据流量的影响。比如为了达到1GB/s的数据流量要求,必须使用1GB*8=8GB的光纤卡,或4块2GB的光纤卡。
-
最后说一下硬盘的限制,当前面的瓶颈不再存在的时候,就要看硬盘的个数了,因为不同的硬盘所能支撑的流量大小也不一样。
假设为了满足1GB/s的数据流量要求,除了需要8块1GB的光纤卡,同时所必须的磁盘个数为:
磁盘转速规格 |
10K rpm |
15K rpm |
ATA |
数据传输率 |
10 MB/s |
13 MB/s |
8 MB/s |
所需磁盘个数 |
100块 |
80块 |
125块 |
-
IOPS
决定IOPS的主要取决于阵列的算法、cache命中率以及磁盘个数。
-
Cache命中率取决于数据的分布、Cache Size的大小、数据的访问规则,以及Cache的算法。
-
磁盘的限制,每个磁盘能处理的IOPS是有限制的,通常情况下每个磁盘的最大IOPS是确定的。比如IDE和SATA硬盘的IOPS大致在100以内,而且IOPS的测试结果与测试方式(例如随机读写和顺序读写、读和写的比例、传输数据库尺寸的大小、磁盘的数量)有很大关系。尽管如此,磁盘的IOPS指标还是对我们评估磁盘的压力和是否能够满足系统的性能需求有着一定的指导意义。
决定IOPS |
具体分析 |
阵列的算法 |
同样的读写,在不同的阵列所产生的iops是不同的: RAID 0 :IOPS = Read IOPS + 1*Write IOPS RAID 1 :IOPS = Read IOPS + 2*Write IOPS RADI 3 :IOPS = Read IOPS + 4*Write IOPS RAID 5 :IOPS = Read IOPS + 4*Write IOPS RADI 6 :IOPS = Read IOPS + 6*Write IOPS RAID 10:IOPS = Read IOPS + 2*Write IOPS |
cache命中率 |
取决于数据的分布、Cache大小、数据访问规则、Cache算法。 cache算法越高效,则cache的命中率越高,加速效果越明显; cache容量越大,可以存储的信息量越大,相对的命中率越高; 当cache的容量一定时,读数据的块大小对命中率的影响非常敏感; |
磁盘因素 |
磁盘IOPS瓶颈:单个物理磁盘能够处理的的最大IOPS是有限制的 SAS 15k rpm IOPS:150^180 SAS 10k rpm IOPS:130^150 SATA 7.2k rpm IOPS:70^90 SATA 5.4k rpm IOPS:30^50 SSDIOPS:5K^15K 磁盘容量:相同转速,容量越小,所需的寻址之间越短,IOPS相对越高 |
测试方式 |
随机读写、顺序读写、读写比例、传输数据的大小 |
备注:
1. 同样的读写,不同RAID的读操作所产生的IOPS相差无几,而对IOPS影响最大的是写操作.写操作效率RAID 0最高,RAID 1和10次之.
2. 读cache的命中率越高越好
3. 磁盘接口简述:
•小型计算机系统接口(SCSI)
•集成设备电子学(IDE)
•串行高级技术附件(SATA)
•串行SCSI(SAS)
•光纤通道(FC)
•固态硬盘(SSD)或闪存盘
-
单个磁盘的IOPS计算方法:
读操作 |
1个写操作 |
每个磁盘的IOPS |
每个磁盘的IOPS(考虑命中率+读写比例) |
|
RAID 0 |
读次数*(1-Cahe命中率) |
实际1次io |
(读+写)/磁盘个数 |
[读*读比例*(1-Cache命中率)+(1*写*写比例)]/磁盘个数 |
RAID 1 |
读次数*(1-Cahe命中率) |
实际2次io |
[读+(2*写)]/2 RAID1只能配置2块盘 |
[读*读比例*(1-Cahe命中率)+(2*写*写比例)]/2 |
RAID 5 |
读次数*(1-Cahe命中率) |
实际4次io |
[读+(4*写)]/磁盘个数 |
[读*读比例*(1-Cahe命中率)+(4*写*写比例)]/磁盘个数 |
RAID 10 |
读次数*(1-Cahe命中率) |
实际2次io |
[读+(2*写)]/磁盘个数 |
[读*读比例*(1-Cahe命中率)+(2*写*写比例)]/磁盘个数 |
-
需求计算
案例一:假定业务需求10000 IOPS,120块硬盘,读cache命中率30%,读iops为60%,写iops为40%,分别计算raid1、5、10的情况下,每个磁盘要求的iops为多少?
-
raid 1:
每块硬盘的iops= (10000*0.6*(1-0.3) +2* (10000*0.4))/2= (4200 + 8000)/2 = 6000
这里,10000*(1-0.3)*0.6表示是读的iops,比例是0.6,除掉cache命中,实际只有4200个iops;
请注意:在raid1中,1个写操作实际发生了2个io,所以写的iops为8000。且raid1的RAID系数为2,所以增加硬盘对提升IOPS有限。
-
raid5:
每块硬盘的iops= (10000*0.6*(1-0.3) + 4 * (10000*0.4))/120= (4200 + 16000)/120 = 168
而4 *(10000*0.4) 表示写的iops,因为每一个写,在raid5中,实际发生了4个io,所以写的iops为16000个;
-
raid10:
每块硬盘的iops= (10000*0.6*(1-0.3) + 2 * (10000*0.4))/120 = (4200 + 8000)/120= 102
因为raid10对于一个写操作,只发生2次io,所以,同样的压力+同样的磁盘,每个盘的iops只有102个,远远低于磁盘的极限iops。
-
吞吐率:
此外当吞吐率超过85%时,单个磁盘IOPS计算规则为:
((10000*读比例*(1-Cache命中率))+10000*写比例*RAID系数)/磁盘数/0.85
Cache比例 |
Cache 20% |
Cache 40% |
||
读写比例 |
读80%,写20% |
读60%,写40% |
读80%,写20% |
读60%,写40% |
RAID 0 |
82 |
86 |
67 |
75 |
RAID 1 |
6118 |
7529 |
5176 |
6824 |
RAID 5 |
141 |
204 |
125 |
192 |
RAID 10 |
102 |
125 |
86 |
114 |
即每块磁盘的IOPS大约在200左右即可满足RAID0、RAID5、RAID10的要求。
案例二:一个由5块450G 10K RPM硬盘组成的RAID5,读写比为2:1,cache命中率为80%,求该RAID支持的最大IOPS以及能够给业务提供的IOPS?
首先10K RPM的FC硬盘,单盘的IOPS为140,5块盘最大IOPS值为700;
能够提供给业务的IOPS为:[X*(2/3)*(1-0.8)+ X*(1/3)*4]/5 = 140 X = 477
-
案例分析
在一个实际的case中,一个恢复压力很大的standby(这里主要是写,而且是小io的写),采用了raid5的方案,发现性能很差,通过分析,每个磁盘的iops在高峰时期达到了200,导致响应速度巨慢无比。后来改造成raid10,就避免了这个性能问题,每个磁盘的iops降到100左右。
操作系统 ubuntu 14.04
测试工具 fio
以顺序读为例子,
命令如下:fio -name iops -rw=read -bs=4k-runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio -direct=1
其中 rw=read表示随机读,bs=4k表示每次读4k,filename指定对应的分区,这里我是/dev/sda6,direct=1表示穿越linux的缓存
以下我们会依次测试sata硬盘,sas硬盘,ssd硬盘的顺序读,随机读,顺序写,随机写的速度
-
顺序读
测试命令:fio -name iops-rw=read -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio-direct=1
SATA
Jobs: 1 (f=1): [R] [16.4% done] [124.1M/0K /s] [31.3K/0 iops] [eta 00m:51s]
SAS
Jobs: 1 (f=1): [R] [16.4% done] [190M/0K /s] [41.3K/0 iops] [eta 00m:51s]
SSD
Jobs: 1 (f=1): [R] [100.0% done] [404M/0K /s] [103K /0 iops] [eta 00m:00s]
可以看到在对4KB数据包进行连续读的情况下:
SSD其速度可以达到404MB/S,IOPS达到103K/S
SAS其速度可以达到190MB/S,IOPS达到41K/S
SATA其速度可以达到124MB/S,IOPS达到31K/S
顺序读,SAS总体表现是SATA硬盘的1.3倍,SSD总体表现是sata硬盘的4倍。
-
随机读
测试命令fio -nameiops -rw=randread -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioenginelibaio -direct=1
SATA
Jobs: 1 (f=1): [r] [41.0% done] [466K/0K /s] [114 /0 iops] [eta 00m:36s]
SAS
Jobs: 1 (f=1): [r] [41.0% done] [1784K/0K /s] [456 /0 iops] [eta 00m:36s]
SSD
Jobs: 1 (f=1): [R] [100.0% done] [505M/0K /s] [129K /0 iops] [eta 00m:00s]
随机读,SAS总体表现是SATA硬盘的4倍,SSD总体表现是sata硬盘的一千多倍。
-
顺序写
测试命令:fio -name iops-rw=write -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio-direct=1
SATA
Jobs: 1 (f=1): [W] [21.3% done] [0K/124.9M /s] [0 /31.3K iops] [eta 00m:48s]
SAS
Jobs: 1 (f=1): [W] [21.3% done] [0K/190M /s] [0 /36.3K iops] [eta 00m:48s]
SSD
Jobs: 1 (f=1): [W] [100.0% done] [0K/592M /s] [0 /152K iops] [eta 00m:00s]
同样的4KB数据包顺序写的情况下,SSD卡的成绩为592MB/S,IOPS为152K。而本地硬盘仅为118MB/S,IOPS仅为30290。
-
随机写
测试命令:fio -nameiops -rw=randwrite -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioenginelibaio -direct=1
SATA
Jobs: 1 (f=1): [w] [100.0% done] [0K/548K /s] [0 /134 iops] [eta 00m:00s]
SAS
Jobs: 1 (f=1): [w] [100.0% done] [0K/2000K /s] [0 /512 iops] [eta 00m:00s]
SSD
Jobs: 1 (f=1): [W] [100.0% done] [0K/549M /s] [0 /140K iops] [eta 00m:00s]
在接下来的4KB数据包随机写操作中,SSD卡再次展示了其高超的IO性能,高达549MB/S的随机写速率,IOPS高达140K。相比之下,本地硬盘的随机读写仅为548KB/S,IOPS为134。