- 论坛徽章:
- 0
|
访问规则一样,但其实其分配的平均度还是不一样,我们做个假设,3个系统都是完全随机访问。\r\n\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n1111111111222222222222223333333333333 raid group\r\n\r\n分别表示1/2/3个系统,如果3个系统压力差不多,每次访问落到1,2,3的可能性也都差不多。特别是前后两次。\r\n\r\n1111111111111111111111111111111111111111\r\n1111111111111111111111111111111111111111\r\n1111111111111111111111111111111111111111\r\n2222222222222222222222222222222222222222\r\n2222222222222222222222222222222222222222\r\n2222222222222222222222222222222222222222\r\n3333333333333333333333333333333333333333\r\n3333333333333333333333333333333333333333\r\n3333333333333333333333333333333333333333\r\n\r\n如果随机性一致,假设各个系统十次IO,共计30次read,并且分布很均匀,可能看到的情况是read交替发生,分别对应1,2,3,1,2,3,1,2,3这样的访问,同时假设3个系统的数据量相同。(暂不考虑系统之间差别比较大的情况,我直觉上感觉结果类似),同时假设磁盘全盘寻道时间为15ms(稍慢一点,但快也快不了太多)\r\n\r\n对于方案1,由于raid stripe比较大,io比较小,每次io读一个盘就够了,结果是磁头从1跳转到系统2,平均用5ms,再跳到系统3,还是5ms,回到系统1,又用了10ms,这样30次总计寻道时间约为20*10=200ms,由于有不同的raid group(9个),这30次完成的时间可能存在部分并行,数据分散在9组盘,因此可能性大约是1/9,即总的io时间大约22ms之内完成30次io(由于读一般在1/(2*15000)秒之内完成,一定不超过0.1ms,所以读的时间忽略,只考虑寻道)\r\n\r\n对于方案2,磁头每次io读,寻道时间比较长,一次为7.5 (大约是全盘寻道的一半),完成10次为75ms,但分散在3组raid里,并行度为3,完成30次io大约用25ms。\r\n\r\n从这种方式计算,可以看到最大分散式的磁盘访问效率应当高于集中式的,但差别并不是几倍关系,而是25%(例如)\r\n\r\n如果存在某种系统现住比其他系统忙的情况呢?极端情况为系统1最忙,系统2最不忙,系统3也比较忙,比例大约4:2:4,即30次io中各12次系统1/3,6次系统2\r\n\r\n方案一:\r\n系统1寻道12*(2.5*2/5+5*1/5+10*2/5)=48ms (12次寻道中,1/5可能磁头在系统2, 2/5可能磁头在系统3,2/5可能就在系统1自身附近)\r\n系统2寻道6*(5*2/5+2.5*1/5+5*2/5)=39ms\r\n系统3寻道48ms 完成\r\n累计时间135ms,并行度依然是9,平均为15ms\r\n\r\n方案二\r\n系统1,12*7.5=90ms,并行度为3,平均为30ms\r\n系统2,6*7.5=45ms, 平均为15ms\r\n系统3,平均为30ms\r\n\r\n从以上计算,似乎得到的结论都是分散优于集聚。不过这里面有一个小漏洞,就是由于3个系统相互独立,我们并不需要3个系统的累加平均,而可能只需要其中一个。意思就是我并不需要3各系统总平均时间最快,而可能只需要1个最快,其他两个可以更慢一些。按照方案1的情况,无论系统1/2/3各自的io量多少,其实都会受到别的系统的影响,这样看来第一种情况下,方案一完成12次io,实际花了135ms(别的系统没有读完,系统1也要等),实际平均为11.5ms的响应时间。而方案二为30/12=2.5ms ! 不要怀疑,整整快了5倍,就是这样的!\r\n\r\n如果这样,我们可以构造一个特别的系统,让其中一个达到最优。显然办法就是让IO量最大的分散在最多的盘上,io量次之的分散在稍少的盘上,大概比例可以按照io量分配,但它们之间没有任何重叠。这里面有比较冗长的计算(过程并不复杂,但要考虑很多概率的问题),在这里就不详细写了,这也就是所谓加权最优,让更多的数据访问在最大的并行度实现,但它们之间不相互干扰。\r\n\r\n这其中还没有考虑很多问题,一个是cache hit的问题,另一个是几个系统之间的高峰、低谷相互重叠,如果把这些东西都加进来,估计没有谁能算得清。而且数据位置、io量还在不停变化,计算结果可能只有理论意义,实践上没有任何用途。\r\n\r\n现在我的结论大概是这样:\r\n1. 如果系统之间io量比较稳定,并且高峰低谷没有明显差异,可以采用集中式(独占raid group)\r\n2. 按io量比例分配磁盘,io量越大,占据越多的raid group,在可能的情况下,避免系统之间raid group的跨越\r\n3. 如果无法避免,例如io量很大,但数据量不大,在没有达到边界值的时候(iops/容量5iops/G),尽力分到更少的盘/raid goup上\r\n4. 如果远远高于这个值,例如达到了10,则尽力分到更多的盘,具体分配规则如下\r\n5. 分配raid group之间的跨越以iops/G为比例,量越多,跨越越多。假如有3个系统,系统1, 20 , 系统2, 10, 系统3要求 5,则系统1跨所有的盘,系统2跨2/3, 系统3跨1/3,系统2和3之间没有重叠。\r\n6. 以上永远的限制条件是保证任何时候,任何系统的任何一块磁盘iops < 200\r\n7. 如果第6条达不到,则需要考虑那个系统不是oltp业务,优先oltp\r\n8. 如果第7条也做不到,say no to everyone,然后采用最简单的方案:把所有数据平均分散在所有的磁盘上。正如搂主所做。\r\n\r\n以上只是一个概念性的经验,并没有严格分析,可能随系统io特性不同而有巨大差别,不是通用的方案。特别是如果系统达到极限的时候,以上计算完全失效。而这个极限,大概就是楼主遇到的17000这个情况。 |
|