浅谈分布式存储的性能限制模型

2016年01月 · 福叔

应该有一个方法论指导用户进行软件定义存储的容量选型。

引用业界友人的观点,整体的角度看来,一个性能优异的软件定义存储,不在于它本身在各种高端的硬件条件下,表现出的强劲性能。而在于在合理搭配的一套硬件配置下,能挖掘出硬件自身的潜力,自上而下,打通“奇经八脉”,在软件和硬件的层面,尽量减少各种“瓶颈”和“死区”,以合理的成本满足应用的需求。

相较于传统存储设备,SDS天生的优势在于通用化带来的灵活性和非锁定,用户能够根据自己的需要,存储软件和存储硬件、存储介质(硬盘)分开采购,分别升级性能、功能与扩容;而它天生的劣势在于,不如传统存储“一体机”专用堆栈的优化彻底,很多SDS厂商并不是服务器硬件和网络方面的专家,甚至在大多数情况下,用户在为SDS选定硬件时,往往也不征求他们的意见,配置“头重脚轻”的情况时有发生。像信息技术领域里很多两难问题一样,也许存储领域中的变革,在灵活性vs.深度优化方面,也注定“鱼与熊掌不可兼得”。

一个所谓企业就绪(enterprise-ready)的软件定义存储解决方案,必须回答客户有关如何选型硬件,如何规划性能与容量的问题。XSKY在帮助行业客户规划分布式存储方案的过程中,积累了一些基本的认识,在这里分享给大家,还望圈内行家大拿轻点拍砖。

原则1:IOPS相当于存储带宽

在行家眼里,讨论每秒读写次数和存储带宽事实上是一回事,因为IOPS*blocksize=bandwidth,在本文后面的论述中,我们统一用存储带宽(bandwidth)来衡量节点的性能指标和限制。

原则2:系统短板决定最高性能

无论存储软硬件堆栈中使用多么厉害的CPU、网络、固态硬盘,或者什么次时代的优化算法,硬件或软件层面的某个(不起眼)的环节都可能成为性能上限的关键瓶颈,阻碍其他任何软件调优或硬件升级的努力。——由于大多数人的理解力和想象力有限,那些“基于几块SATA 磁盘的SDS单节点能够持续提供10万IOPS”这样的系统我们只能当神话看了,不在本文讨论之列。

原则3:先研究理论上限,再做组件级调优

理想是远大而美好的,但现实是雾霾而残酷的。一个设计好的SDS系统,总应该有一个理论的性能上限。如果无视这个上限,盲目设定调优目标埋头苦干,无异于缘木求鱼。一个现实可行的性能优化思路应该是,认真分析该软件定义存储原理架构,发现各种理论上限的限制条件,大胆假设,结合反复实验进行局部调整,而后整体迭代优化。

在此以流行的开源分布式软件定义存储系统Ceph为例,机头和数据存储节点融合部署,我们把它放在相对理想的情形下,分析一下性能限定模型,为合理的规划与调优提供一些思路。

首先看看Ceph的带宽如何分配的,以版本0.94为例。

如果Ceph每个节点以千兆网络接入,当网络带宽看似“跑满”的时候,数据是否能以1Gbps的速率落盘呢?

答案是否定的,原因是Ceph除了接收客户端数据需要带宽以外,将数据分布以及在节点间做多份拷贝也都需要带宽。

假设Ceph集群和存储客户端(应用)之间的网络叫做“接入网络”,而Ceph内部做多份数据块拷贝的网络叫做“复制网络”,数据在从客户端写入SDS集群时,大概遵循下图所示的过程:

浅谈分布式存储的性能限制模型1

1、为方便讨论,假设集群k个机头和客户端进行IO交互,集群共有n台对称的服务器处理数据。

2、当数据从客户端发起,经由k个“机头”中的一个进入时,按照系统设定的大小(缺省4MB),被切成很多份,根据一致性哈希CRUSH算法,在接入网络中,自己留下1/n大小,其余被分发到集群中的n-1台服务器上。(细心的同学应该发现,接入网络入口的流量导致占用了机头服务器间的出口带宽。)

3、数据在集群中落盘后,Ceph会根据用户的复制份数设定,在复制网络中,将数据块拷贝到其他节点——复制网络和接入网络可以不是一个物理网络,在生产环境中,往往建议把它们分开。复制的目的是:a) 数据的高可用 b) 在某些融合环境下,保证数据接近计算。无论如何,拷贝份数越多,复制网络带宽占用越大。

这只是写入的场景(数据自外向内流动),下面看看读取场景。

浅谈分布式存储的性能限制模型2
考察k个机头中的某一个(如图中的服务器1),数据会在这里汇聚,以流的方式发送向客户端。在数据达到一定量的情况下,仅仅有1/n的数据来自于本机,其他(n-1)/n部分的数据可能来自于集群中的其他服务器,服务器1上会产生从集群其他服务器来的数据流入。可见,接入网络出口的流量导致占用了机头服务器间的入口带宽。

结合上面谈到的写场景中接入网络的数据流分析,在此我们不妨得出一个简单而有趣的事实:“Ceph集群的读写操作带宽在门限上是相互影响的。”

不妨将这个问题量化,假设每个机头的接入网络网口带宽限制为C1,存储客户端对每机头节点的“实际”输入带宽占用为X,“实际”输出带宽占用为Y。

浅谈分布式存储的性能限制模型3
根据上图解释的原理,稍微脑补一下,不难发现,X和Y应该满足下面两个限制条件:

  • X + X* (k-1)/n + Y*(n-1)/n <= C1 ——限制1
  • Y + Y*(k-1)/n + X*(n-1)/n <= C1 ——限制2

到这里,我们仅仅讨论了接入网络交互带来的限制。事实上,单个硬盘的读写性能,Ceph OSD本身的读写性能,OSD的数量规划,也会对系统整体性能形成限制。

为了简化讨论,假设集群中每台服务器配置用于存放数据的硬盘数量一样(m个),所配置的每块硬盘的性能指标一样,每块物理硬盘对应一个OSD。存储数据做q份拷贝,硬盘的写性能最大指标为W,读性能最大指标为R(例如,SATA HDD 3.5寸盘的大块数据顺序读写指标大约是120MBps)。这里又可以导出下面两个基本限制:

  • X*k*q <= n*m*W ——限制3
  • Y*k <= n*m*R ——限制4

事实上硬盘的物理条件所限,对于同一磁盘硬件,常常读操作和写操作的性能是相互影响的,这里还有一个隐藏的限制,即f(W, R) < a。f是一个读写相互影响的经验函数,根据不同厂商、不同介质、不同型号的硬盘而不同。讨论分析这个问题是个很复杂的事情,取决于硬盘实现原理,也取决于读写比例,很多时候需要依靠多次实验才能看到真实的结果——本文就把它直接忽视了,无论如何,这并不影响限制条件3和4的正确性!

浅谈分布式存储的性能限制模型4我们称Ceph在不同服务器的OSD间制作多份数据拷贝的网络为“复制网络”。在多数生产环境中,会将“接入网络”和“复制网络”分到两个物理网口部署。复制网络的繁忙程度完全取决于系统设定的数据拷贝份数。假设同样在n个集群节点,k个机头,数据做q份拷贝的情况下,复制网络的带宽限制为C2,则有下面的制约关系:

  • (q – 1)*k*X/n <= C2 ——限制5

综合这5种限制,我们代入实际硬件配置条件,如网口带宽、服务器数量、硬盘数量,可以反解出数据输入X和数据输出Y的一些上限值,为容量规划、系统调优提供一个基本的范围指导。

举一个XSKY之前在某互联网服务运营商的测试用例。集群采用24台服务器用作存储服务器,运行CephFS。每台服务器使用1块128GB SSD,作为MDS元数据资源池;配置5块4T SATA盘作为5个OSD;配置双千兆网口网络,将接入网络和复制网络分开;数据做两份拷贝。

在集群中测试5MB的大文件顺序写,8个客户端加压,观察总网络带宽占用最大达到400MB/s。测试300MB的大文件顺序写,8个客户端加压,观察总网络带宽占用最大到800MB/s。看似网络带宽被占用的不错了,那整体实际有多少数据落盘呢?最理想情况下,系统调优的空间有多大呢?

我们代入之前分析限制条件1、3、5看看:

  • X + X* (8-1)/24 <= 1000/8  —— 接入网络网口入口流量限制
  • X*8*2 <= 24*5*120 —— 磁盘写性能限制
  • (2 – 1)*8*X/(24-1) <= 1000/8 —— 数据复制网络接口流量限制

取三者的最小值,即X=MIN(96.8, 900, 359.4) = 96.8MBps,可以看到在最理想情况下(Ceph软件层处理带宽损耗为0),系统可以有最多到96.8/(1000/8)=77.44%的网络带宽落于磁盘。相比较实验的结果,5M文件写的实际落盘带宽为(400/8)/(1+7/24)=38.7MBps,300M文件写的实际落盘带宽为(800/8)/(1+7/24)=77.4MBps。后者比较接近96.8这个理想数值,可见这个版本的CephFS对较大文件的写入效率还是不错的,对较小文件的顺序输入还有较大的优化空间。

本文抛砖引玉,不敢说考虑到所有的限制条件,还请圈内各位大拿斧正。——逻辑上讲,越多的限制必要条件叠加在一起,这个模型就越精确,方能为理性的架构规划一个分布式存储集群提供量化的参考。

希望大家在SDS的实践探索中愈辩愈明,共同提高。