IOPS,读写惩罚与IOPS的估计

IOPS:磁盘每秒可以进行多少次IO。不过每次IO根据写入数据的大小,这个值也是不固定的。比如每次IO写入很大的一块连续数据,那么IOPS就会变小。如果再加上磁头的频繁换道,那么IOPS会变得非常低。如果不换道,且每次写入最小的数据块,那么此时IOPS就会变得最高。

如:
应用程序向OS请求:“读取A文件到我的缓冲区”。操作系统读取后返回程序一个信号,这次IO就OK了。
读取的时候,OS把任务交给了文件系统:
文件系统向磁盘控制器驱动请求:“读取从LBA10000开始的128个扇区,然后再读取从LBA5000开始的64个扇区”。这样就是文件系统向下做了两次IO。
磁盘控制器读取的时候,对于SCSI协议,完成一次连续LBA地址扇区的读写就是一次IO,但是期间可能要发送很多条SCSI指令才行(比如要读的太多,那么需要一个循环,每次循环一个指令)。从最底层来说,每次向磁盘发送一个SCSI帧(指令),就算一次IO。这个是最细粒度的IO。通常说的磁盘IO指的是完成整个一次SCSI读写(也就是完成一次连续LBA地址扇区读写)。

也就是说,磁盘IO就是,控制器发送一条读的命令集合(如从LBA10000开始的128个扇区),然后控制器去记录磁盘去读写并返回需要的时间。然后用1除以这个时间就行。 这个时间可定就和扇区的个数、分布情况有关咯。比如扇区很多,那么这次读需要的时间肯定很多,IOPS自然就下来了。

对于写入10000个小文件来说,每秒的IO是很多的(每读一个文件至少一次IO,这是在那个文件的扇区连续的情况下)。而如果是写入一个10M的文件,IOPS的意义不大,主要就看转速了。

不过小秦发现,网上或很多书籍中讨论的IOPS指的不是存储层面的,可能是文件系统层面、也可能是应用层面。所以具体看的时候还要考虑实际情况。

对于做RAID的IOPS,并不是简单的IOPS的叠加,原因是RAID中会的有读写的惩罚。比如我5快盘做了RAID 5,那么写一个小数据的时候数据大小达不到条带深度,所以就写一个盘,但实际上写的这个操作会引发另外的两个IO:校验盘中的检验值会的被取出(一次IO),生成新的检验值后会将新的校验值写入校验盘(另一次IO)。这些多出来的IO就叫做IO惩罚。具体的数据可以参见EMC论坛(https://community.emc.com/message/578478#578478)中给的数据:
RAID 5 & RAID 3:Drive IOPS = Read IOPS + 4*Write IOPS
RAID 6:Drive IOPS = Read IOPS + 6*Write IOPS
RAID 1 & RAID1/0:Drive IOPS = Read IOPS + 2*Write IOPS
安照论坛中的例子,假定4500 IOPS中读/写比是2:1,则不同RAID类型Drive IOPS要求分别如下:
RAID 1/0: (2/3)*4500 + 2*(1/3)*4500 = 6000 IOPS
RAID 5: (2/3)*4500 + 4*(1/3)*4500 = 9000 IOPS
RAID 6: (2/3)*4500 + 6*(1/3)*4500 = 12000 IOPS

那如何通过这个IOPS来估计需要多少次盘呢?EMC的论坛给出了一个数据:
Fibre Channel 15k rpm:IOPS大概为180
SAS 15k rpm:IOPS大概为180
Fibre Channel 10k rpm:IOPS大概为140
SATA 7.2k rpm:IOPS大概为80
SATS 5.4k rpm:IOPS大概为40
Flash drive:IOPS大概为2500
所以对于上面的例子,假定选用FC 15K RPM硬盘,则:
RAID 1/0: 6000/180 = 34 块
RAID 5: 9000/180 = 50 块
RAID 6: 12000/180 = 67 块

不过由于现在的存储都有cache,所以这里的数据可能不是很准确。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*