
同事前几天问我,某友好用户的平台日常基本没有什么业务量,但在某个特定搞活动的时候,刚开始的时候系统很卡。经过测试和分析后,定位到了分布式存储,觉得分布式存储的性能很差。把分布式存储改为FCSAN以后性能会有所改善。难道分布式存储性能真的很差吗?我们今天就展开讨论一下这个话题。
存储的性能除了外部的网络、协议以外,还和存储内部的磁盘类型、磁盘数量、缓存、数据的组织等因素有直接关系。现在的存储主要使用SSD、SAS和SATA作为介质。从“盘”的角度看,主要是随机读写和顺序读写。

表1
通过简单的测试,我们得出上表1的结果。在顺序读写的时候,SSD的性能和SAS和SATA的性能差距并不是很大。SSD比SATA快4倍,SAS比SATA快1.5倍。也就是说SATA在顺序大块读写的能力并不差,在这种情况下,有着很高的性价比。对于一些顺序读写的需求,比如存储视频、图片完全可以采用全SATA磁盘组成“大块”(64M-128M)的文件或对象存储,也不需要副本,采用raid5或raid6就足够了。
SAN存储主要提供高并发随机小IO的存储能力,这是大部分应用都需要的能力。从表1的“随机读写IOPS性能”比较上看,机械驱动的SAS和SATA盘就明显和SSD不在一个水平线上了。SSD比SATA快1131倍,SAS比SATA快4倍。用SATA、SAS盘作为SAN存储的存储层显然有点吃力了。所以不管是FCSAN还是SRVSAN都会有“缓存”层。FCSAN的缓存一般是用了物理内存,而SRVSAN用了SSD。将经常访问的“热点”数据保留在缓存中,起到“加速”的作用。上面的例子就是因为需要“临时抱佛脚”,所有的数据都要从持久化层的SATA盘中读取,当然存储的性能就很差了。分布式存储的性能需要“热身”才能体现出来。有缓存的和没有缓存慢多少呢?根据上面的数据,至少慢了1000倍,用户的感知当然不太好。
有些愿意思考的大侠们会提出新问题:SRVSAN不就是利用很多盘来提高性能吗?其实不完全是!SRVSAN的性能主要和作为缓存的SSD性能和缓存中热点数据命中的概率直接相关。从这个角度来说,SRVSAN的缓存SSD越大越好,如果大到连持久化层都是SSD是最理想的。如果SRVSAN计算“热点”数据的算法很烂,命中率很低,往往就只能提高SSD的容量。
大侠们会继续问,那SRVSAN存储的多磁盘能带来什么好处?其实好处就是可以提高IO的并发量,并发量提高了,写入缓存的性能也就提高了。就像100个人排队买票,如果只有一个窗口,队伍排队很长,如果有10个窗口,速度就大大提高,如果开更多的窗口,性能还会提升。

SRVSAN存储往往作为共享存储,每个时间片都会响应不同应用的IO。同一个IO实际上每次访问的磁盘位置是固定的,而且也不是我们想象中所认为是多个副本一起参与读操作的。比如三副本,不是三个副本一起来响应IO而是只有主副本来响应IO,剩下的二个副本纯粹为了数据安全而存在的。为什么要采取这个机制呢?还是以排队为例,来讲清楚这个问题。买一张去上海的车票,有三个窗口。为了更快的买到票,让三个人同时排队,谁先买到了,另外二个就放弃排队。如果每一张票都是这样,对于窗口来说,排队的人多了3倍,流量被放大了,同时还需要引入复杂的控制制度,对整体速度提高并不是很大,为了控制引起的消耗会很大。一般SRVSAN采取的是固定窗口的做法即读主副本,某个IO一定只会在这个特定的窗口下(主副本所在的磁盘)排队。每个副本是均匀分布在磁盘里的,每个磁盘内的主副本的个数也是均衡的,从概率角度看,每块盘都是1/3的副本是主副本,每块盘被访问的到概率也是一样的,忙闲程度也差不多。这样,磁盘越多,就像开的窗口越多,排队的就越少,响应得就越快。
注意:1000多块的SATA盘的4K随机读写才等于一块普通的SSD的性能,提高缓存内数据命中率才是体现SRVSAN性能的关键因素。
上面的例子FCSAN比SRVSAN的性能好,也是不争的事实。主要原因一样要到磁盘层直接读取数据。但是SAS比SATA随机读的IOPS性能好4倍,次要原因是我们目前FCSAN比SRVSAN容量小很多,承担的业务也少,同时并发的IO也少,FCSAN的队列浅。
SRVSAN存储比较适合访问流量比较均衡的应用,才能体现出它的性能。像文章开头的突发的例子,为了让客户满意和接受,我建议还是跑在FCSAN上更加合适。

致力于云计算的普及和应用




