IO和IOPS浅析
块&IO
块:是存储数据的最小单元;
IO:对块的读写操作,是存储读写动作的最小单元;
- IO的大小:取决于IO操作的的块到大小
- IO的读写:IO的动作
- 顺序和随机IO:按照顺序读写或随机读写
存储性能的主要指标
- IOPS:每秒的读写次数(几千到几百万)
- 带宽:每秒数据传输量(单位MB/s,GB/S)
- 时延:IO的响应时间(ms毫秒/μs微秒),从操作系统内核发出的一个读或者写的IO命令,到操作系统内核接收到IO确认回应的时间。
各个指标之间的关系
- 同一时刻的带宽=IOPS*IO大小
- IO时延=IO队列等待时间+单个IO的读写处理时间
- 随着系统IOPS接近理论性能,IO响应时间会非线性增长
- 当系统压力>最大性能的70%时,IO响应时间会剧增
IO读写对性能的影响
- 硬盘:无论是HDD机械硬盘还是SSD闪存盘,读性能数值都高于写性能
- RAID:对于绝大部分RAID级别(5/6/10),写惩罚会明显降低写性能
- 控制器:存储控制器基于数据可靠性的考虑,需要为写操作执行额外的镜像保护
IO顺序随机对性能的影响
- 顺序读
- 顺序读容易预取
- 通过顺序流识别和预取算法
- 提前读取磁盘的连续数据到控制器或SSD缓存中
- 随机IO预取命中率极低
- 顺序写
- 顺序写容易合并
- 顺序IO可以合并后落盘,不会触发RAID写惩罚
- 随机IO由于落盘位置无法预测,很难进行合并
IO从应用落盘的路径
- 文件系统:将文件切分为Block,发给HBA
- HBA卡:将Block按照传输协议进行切分
- SAN交换机:接收HBA的IO,发给存储
- 存储端口:封装成和HBA发出的一致的IO
- 存储缓存:从端口接收I0,镜像后返回确认
- 硬盘:从存储缓存异步接收IO,最终落盘
机械硬盘的数据读写
- 磁头径向移动到相应磁道,称为寻道时间
- 马达旋转到相应扇区,称为旋转时间
- 马达带动盘片旋转,开始连续数据读写
1块硬盘的IOPS如何计算?
以10000转SAS硬盘为例,假设寻道时间3ms
平均旋转时间=60*1000/10000/2=3ms
IOPS=1000/(3+3)=166,忽略传输时间
RAID组的IOPS计算
- 条件
5块盘的RAID5,含校验数据,不含热备盘
单盘读写IOPS为150,读写比例为6:4,求RAID组总的IOPS
- 求解
全读的IOPS=1504=600,全写的IOPS=1504/4=150
总IOPS=60060%+15040%=420
利用率=420/(150*5)=56%,只发挥了所有硬盘一半的性能
写惩罚
不同的RAID级别,为了保证当有物理磁盘损坏的情况下可以恢复数据,数据写入的过程中都需要有一些特别的计算。比如对于RAID-5,条带上的任意磁盘上的数据改变,都会重新计算校验位。如下图所示,一个7+1的RAID-5的条带中,七个磁盘存储数据,最后一个磁盘存储校验位。
- 数据写入RAID的过程
对于一个数据的写入,我们假设在第五个磁盘上写入的数据为111,那么整个RAID-5需要完成写入的过程分为以下几步:
1.读取原数据0110,然后与新的数据1111做XOR操作: 0110 XOR 1111 = 1001
2.读取原有的校验位0010
3.用第一步算出的数值与原校验位再做一次XOR操作: 0010 XOR 1001 = 1011
4.然后将1111新数据写入到数据磁盘,将第三步计算出来的新的校验位写入校验盘。
由上述几个步骤可见,对于任何一次写入,在存储端,需要分别进行两次读+两次写,所以说RAID-5的Write Penalty的值是4。
- 不同RAID级别的Write Penalty
RAID级别 | 原理 | 单盘写惩罚 |
---|---|---|
5 | 单校验,需要读数据、读校验位、写数据、写校验位 | 4 |
6 | 双校验,,需要读数据、读两次校验位、写数据、写两次校验位 | 6 |
10 | 镜像,!-次写入相同数据到两个硬盘 | 2 |
常见存储性能问题
- 底层硬盘IOPS量超过阈值
- 常见于FC,NL硬盘;
- 出现问题以后可以用statpd命令实时检查硬盘当前IOPS值,要求NL硬盘不高于75,FC硬盘不高于150-200;
- 某硬盘延迟过高成为慢盘,拖慢整个存储
- 使用statpd命令配合-sortcol参数排序找到响应时间远高于其他的硬盘(几倍);
- 仅在所有同类硬盘IOPs都在阈值范围内的情况下,某块盘的延迟明显超过其他盘才可以判定为慢盘否则优先处理磁盘IO超限问题;
-
存储使用DECO(去重和压缩)卷带来性能衰减
-
Vlun 多路径配置问题,导致单条路径带宽达到瓶颈
- 使用statvlun 和 statport -host 配合-sortcol等参数检查主机路径●某业务对Vlun读写使用的block size过大;
- 使用statvlun 配合-sortcol等参数排序block size 一项,确定引发问题主机;
- 同步模式远程复制中,主备存储配置不一致或复制
- 链路问题影响主存储链路质量问题,检查SFP及host port和光交porterrshow计数值
物理硬盘的IOPS和延时阈值
前提条件读操作50%、写操作50%、10 size 8~16KB,读写比例悬殊和I0 size增加都会影响IOPS处理能力和响应时间。涉及命令statpd
NL 磁盘75个IOPS 延时30ms
FC 磁盘 150个IOPS 延时25ms
SSD 磁盘 4000个IOPS 延时5ms
尺寸 转速 硬盘类型(数据传输协议) IOPS
-----------------------------------------------------------------
2.5 10000rpm SAS 113
2.5 15000rpm SAS 156
3.5 15000rpm SAS 146
2.5 5400rpm SATA 71
3.5 7200rpm SATA 65
3,5 10000rpm SCSI(U320) 104
3,5 15000rpm SCSI(U320) 141
3.5 10000rpm FC 125
3.5 15000rpm FC 150
3.5 10000rpm FATA 119
-
同类型物理磁盘IOPS阈值普遍达到100%,通过checkhealth -svc -detail就可以实时检测到告警,但由于节点缓存的作用通常不会出现明显vun延时升高,尤其是在顺序读操作占比较高时;
建议加强监控,避免新业务的添加; -
同类型物理磁盘IOPS阈值普遍达到200%,通过checkhealth -svc -detail就可以实时检测到告警,通常会出现明显的延时升高;
建议加强监控,避免新业务的添加,限制主机I避免对核心业务造成进一步影响,不要尝试直接进行大面积的数据和应用迁移; -
同类型物理磁盘IOPS阈值普遍达到300%,大部分应用会出现明显的延时升高或是卡顿等;
建议通过statvlun、statport命令确认大批I0的来源,限制对应主机I0,同时关闭不重要的业务缓解对核心业务造成的影响,在保证核心业务的前提下合理评估后续数据向高性能磁盘或是其他存储迁移的操作。
如何计算 RAID 中的 IOPS?
一客户那边出现了跟存储磁盘IOPS相关的问题:应用系统在调用数据库时特别慢,页面打开同样慢。最终一路排查下来,问题还是在存储端。
存储中划给oracleRAC使用的RAID5,使用的是包含EMC存储操作系统在内的5块硬盘。
具体的说:这5块盘,都是FC 10K RPM的450G硬盘(每个盘的IOPS为140),磁盘最大的IOPS为700。假设读写比为2:1,能够提供给前端应用的IOPS只能为:350(RAID5是1读4写)。
这样的IOPS,的确不能满足实际应用的使用需求所导致的情况。这个问题其实也不是碰到一次两次,就借着这次一起整理下关于磁盘IOPS的计算方式:
1、准备工作:
通常当数据库管理员提出需要更多存储空间的时候,他们还会指定必须要达到多少IOPS。首先需要知道I/O中读操作(Read)与写操作(Write)所占的百分比。然后通过下列公式,将主机的IOPS需求转换成硬盘实际IOPS负载:
在计算具体的磁盘IOPS之前,需要对常见的RAID类型的读写比、不同硬盘类型的IOPS值、具体应用的IOPS需求等等有一些了解。
- 不同RAID类型的IOPS计算公式
RAID类型 | 公式 |
---|---|
RAID5、RAID3 | Drive IOPS=Read IOPS + 4*Write IOPS |
RAID6 | Drive IOPS=Read IOPS+6*Write IOPS |
RAID1、RAID10 | Drive IOPS=Read IOPS+2*Write IOPS |
- 不同磁盘类型的IOPS
硬盘类型 | IOPS |
---|---|
FC 15K RPM | 180 |
FC 10K RPM | 140 |
SAS 15K RPM | 180 |
SAS 10K RPM | 150 |
SATA 10K RPM | 290 |
SATA 7.2K RPM | 80 |
SATA 5.4K RPM | 40 |
Flash drive | 2500 |
2、案例
看两个案例,其中第二个也是在客户现场碰到的实际情况。 IOPS的计算需要结合上述表格中的相应参数值。
- 20TB 存储空间同时满足 4500 IOPS 、 RAID5 ,从实际使用来说,如何计算不同 RAID 所支持的 IOPS ?RAID5 或者 RAID10 的时候分别需要多少块硬盘?
首先需要知道 I/O 中读操作与写操作所占的百分比。然后通过第 2 章节中的公式,将主机 IOPS 需求转换成硬盘实际 IOPS 负载:
假定 4500 IOPS 中读 / 写比是 2 :1 ,则不同的 RAID 类型 Drive IOPS 分别如下:
RAID10 :( 2/3 ) 4500+2 ( 1/3 ) *4500 = 6000 IOPS
RAID5 :( 2/3 ) 4500+4 ( 1/3 ) *4500 = 9000 IOPS
RAID6 :( 2/3 ) 4500+6 ( 1/3 ) *4500 = 12000 IOPS
再参照第 2 章节中不同硬盘类型的 IOPS 值,换算出需要多少块盘:
RAID10 :6000/180 = 34 块
RAID5 :9000/180 = 50 块
RAID6 :12000/180 = 67 块
- 客户环境中,存在一个 RAID group ,是由 5 块 450G 10K RPM 的 FC 盘组成,换算出该 RAID 支持的最大 IOPS 以及能够给前端应用提供的 IOPS
首先 10K RPM 的 FC 盘,单块盘的 IOPS 为 140 , 5 块盘最大 IOPS 值为 700 。
假设读写比为 2 :1 ,能够提供给前端应用的 IOPS 为:
( 2/3 ) X+4 ( 1/3 ) *X = 700
2*X = 700 X=350 能够提供给前端应用的 IOPS 为 350 。