最近冬瓜哥比较忙,加上休假,没有写什么文章。上周看到某群里讨论stripe size,于是乎冬瓜哥就想写个文章论述一下这个话题。
PMC 的Adaptec Raid卡的Stripe Size指的是一个条带在每块硬盘上占据的那一小块的容量(也就是条带深度,所以说成是blocksize或者segment size更为合适),而LSI的Raid卡的Stripe Size指的是整个条带的容量。这个非常重要的背景知识恐怕很少有人知道。本文中的“stripe size”指的是“整个条带的容量”,而不是一个条带跨在每个盘上的容量。
如何调节Stripe Size来使系统性能最大化?这个问题,首先得看你的应用场景到底是什么样的,主要有以下几个维度来决定这个问题的答案:
你的业务属于OLTP型还是OLAP型
追求的是MB/s吞吐量还是IOPS吞吐量
IO Size
追求的是吞吐量还是时延
上层IO的调用方式:同步异步,dio/buffer-io,write back/write through
IO 控制器与硬盘之间有没有经过SASExpander,如果有,PHY宽度是多少
下面冬瓜哥就来分析一下这几个因素自己搅和在一起,以及与Stripe Size搅和在一起会是个什么场景。
1. 如果的你的业务追求MB/s,同时还属于OLTP型。 这种场景很少见,一般追求MB/s吞吐量的都是地址连续的大块IO场景,而OLTP场景都是随机IO,而且IOSize一般都比较小,4K~16K左右。但是,的确有追求MB/s的OLTP场景,比如,CDN服务器,其的确是一个随机IO,但是又要求极高的带宽吞吐量,因为其要塞满前端带宽,否则就亏大了。这种情况下,除了使大量静态内容缓存在RAM中之外,底层磁盘也得给力,用SSD可以满足。这个场景其实本质上等效于追求高IOPS的场景,只不过从业务角度来看追求的是MB/s,只需要将IOPS乘IO Size便等于MB/s。所以,对这个场景的分析见下文。
2. 如果业务追求MB/s,同时属于OLAP型。 这种类型属于应用比较普遍的类型,比如视频流、备份、大数据分析等等。OLAP类型的应用一般会发出大块的地址连续的IO。不管是对HDD还是SSD,这种IO类型都是比较舒服的。而单盘的带宽也不过是几百兆B每秒,此时采用Raid可以提升带宽。
A . 如果应用层是这样的:单线程、direct io,同步IO、IOSize较大,地址连续IO。这种场景下,整个系统IO路径上同一个时刻只存在一个IO,此时,很不幸,系统性能与Stripe Size无关,因为这个IO不管是落在一块盘上,还是被分散到多块盘上,性能几乎相同,可能后者还略低于前者,因为后者需要Raid卡固件分解成多笔IO,发到多块不同的盘上执行,而如果这多块盘通过sas expander挂接到IO控制器上,这个问题会更加严重,因为一般x4 PHY的宽端口的并发度只有4,如果是多于4块盘的raid组,该场景下分解成多笔IO将会拖慢系统性能。这一点估计业界了解的人很少,关于SAS网络的门道,冬瓜哥看后续机会再介绍。
B . 如果应用层是这样的:其他参数与A场景相同,IO方式变为异步IO。假设该场景下outstanding IO数量假设为y(相当于队列深度为y,或者说当应用发出的io还剩y个没有返回时),IO Size=z,raid组硬盘数量为q,那么,条带容量应当=zq,以及令y=q,或者y=q的整数倍,此时系统MB/s达到最大值。也就是说,每个segment的容量=z,每个IO落在一个快盘上而不是分散到多块盘上,由于系统内outstanding io不为1,以及连续地址IO,raid卡固件会将队列中的多个IO发送到多块盘并行处理。
C . 如果应用层是这样的:多线程、每个线程都为同步IO。线程数量为p,那么该场景等效于B场景下的outstanding io数量为p时候的场景。
D . 如果应用层是这样的:多线程,每个线程都为异步IO。线程数量为p,每个线程的outstanding io数量为y。该场景相当于B场景下outstanding io数量为py时候的场景。
3. 如果业务追求的是IOPS,同时属于OLTP型。 OLTP型业务同时要求IOPS和时延,不能为了IOPS而牺牲了时延,反之亦然。
A . 如果应用层是这样的:单线程、direct io,同步IO、地址随机IO。这种场景下,整个系统IO路径上同一个时刻只存在一个IO,此时,很不幸,系统性能与Stripe Size无关。
B . 如果应用层是这样的:其他参数与A场景相同,IO方式变为异步IO。假设该场景下outstanding IO数量假设为y(相当于队列深度为y,或者说当应用发出的io还剩y个没有返回时),IO Size=z,raid组硬盘数量为q,那么,条带容量应当=zq,以及令y=q,或者y=q的整数倍,此时系统IOPS达到最大值。也就是说,每个segment的容量=z=IO Size,每个IO落在一个快盘上而不是分散到多块盘上,由于系统内outstanding io不为1,以及连续地址IO,raid卡固件会将队列中的多个IO发送到多块盘并行处理。如果该场景下另IO Size=Stirpe Size,那么性能将会奇差无比,因为根本无法并发。
C . 如果应用层是这样的:多线程、每个线程都为同步IO。线程数量为p,那么该场景等效于B场景下的outstanding io数量为p时候的场景。
D . 如果应用层是这样的:多线程,每个线程都为异步IO。线程数量为p,每个线程的outstanding io数量为y。该场景相当于B场景下outstanding io数量为py时候的场景。
上述仅列出了一些主要场景、主要参数的场景,更多场景大家可以自行研究。不过可以看到,这里面有个窍门,也就是让segment size=io size,此时系统性能最大化,不管是连续地址IO还是随机地址IO场景。将一个IO分散到多个盘,任何场景下都不是好主意,这个结论颠覆了多数人的认知,如果想不明白可以继续想。总结一下,Stripe size的调节,本质上是调节整体系统的并发度,也就是让IO充分的并发起来。也可以看到,如果系统顶层的压力不够,也就是没有足够多的IO被outstanding的话,系统性能无论如何也上不来,是一个恒定值,这个值完全取决于系统IO路径上的时延,时延越小,IOPS越大,所以,如果使用SSD,即便是上层应用写的很烂,采用单线程同步IO,也可以获取较高的IOPS。
怎么样,要想玩IO性能分析,就要做到所谓Full Stack,也就是将整个IO路径,从应用,到内核,到硬件,到外部存储系统,磁盘,磁头磁道扇区,全都整明白,才敢出来玩一玩性能分析。拿着厂商的“Best Practice”出来装逼的都是耍流氓。
那么,怎么才能整明白IO路径?公众号主页回复“io路径”。
关注“大话存储”获取业界最高逼格的存储及计算机系统知识。
。
冬瓜哥简介:冬瓜哥是《大话存储》系列图书作者,现任PMC-Sierra存储系统架构师。