分布式对象存储系统Sheepdog性能测试

标签: 数据存储 sheepdog | 发表时间:2013-12-26 18:47 | 作者:若羽
出处:http://tech.uc.cn

Sheepdog是一个分布式对象存储系统,专为虚拟机提供块存储,号称无单点、零配置、可线性扩展(省略更多优点介绍)。本文主要关注其性能究竟如何,测试版本为目前的最新稳定版0.7.4。

测试环境

  • 节点数量:6个
  • 磁盘:各节点都配备7200转SATA硬盘,型号WDC WD10EZEX-22RKKA0,容量为1TB,另外测试节点(即用于启动虚拟客户机的宿主机)多配置一块SSD硬盘,型号INTEL SSDSA2CW300G3,容量为300GB
  • 网络:测试节点配备PCI-E双千兆网卡,通过bonding进行负载均衡
  • 文件系统:ext4fs,挂载参数:rw,noatime,barrier=0,user_xattr,data=writeback
  • sheepdog集群
    • 可用空间:6个节点各分配100GB,总共600GB
    • 对象副本数量:3个,客户机实际最大可用空间为200GB,接近项目规划的容量
    • 对象缓存:使用SSD硬盘,分配256GB,可完全缓存客户机文件系统,随测试项目需要挂载或卸载
  • 虚拟客户机
    • 资源:4GB内存,4个逻辑CPU
    • 使用qemu 1.7启动,支持KVM加速、virtio
  • 两大测试项目
    • IOPS:主要考察较小数据块 随机读和写的能力,测试工具fio(sudo apt-get install fio),测试文件固定为150GB
    • 吞吐量:主要考察较大数据块 顺序读或者写的能力,测试工具iozone(sudo apt-get install iozone3),测试文件从64MB倍数递增到4GB,如没有特别说明,测试结果取自操作512MB的数据文件

除特别说明,qemu启动虚拟客户机命令如下:

qemu-system-x86_64 --enable-kvm -m 4096 -smp 4 -drive file=sheepdog:mint,if=virtio,index=0 \
-drive file=sheepdog:data,if=virtio,index=1 -net nic,model=virtio -net user -vnc :1 -daemonize


IOPS测试

测试须知

关于SATA硬盘的IOPS

测试用的普通7200转SATA硬盘,官方公布其平均寻道时间10.5毫秒,所以,根据以下公式,理论上的IOPS值最多只有65。

实测结果,在单线程同步IO的情况下(下图深蓝线),也是65,在多任务(紫线)或者使用异步IO(黄线)的情况下,由于操作系统IO调度,IOPS能够达到80到100之间。如果进行读写操作的文件远远小于SATA磁盘大小,缩小了存储单元寻址范围,减少了全磁盘寻道时间,也能提高IOPS,例如,测试文件大小占磁盘大小的1/8的时候,IOPS最高在90左右(浅蓝线)。

关于SSD硬盘的IOPS

测试用的SSD硬盘,在单线程同步IO的情况下,IOPS最多能够达到9000左右(下图深蓝线),在多任务(紫线)或者异步IO(黄线)的情况下,最多能够达到40000-50000之间。由于构造原理不同于传统磁盘,减小测试文件大小并不能明显提高IOPS。

关于读写比例

由于大多数业务场景既有读操作,也有写操作,而且一般读操作比写操作多很多,因此,读写混合测试项目中的读写比例设定为4:1。一般业务很少有完全随机写的情况,因此不进行只写测试。

关于电梯算法

虚拟的客户机操作系统的IO调度算法使用noop,网上有资料能够提高IOPS,但是实测效果不明显,因此最终报告并没有把它单列出来。

IOPS测试1:不使用对象缓存,只读测试

单线程同步IO的情况下(下图深蓝线),sheepdog的IOPS差不多达到100,比单节点单SATA硬盘高,究其原因:客户机中的测试文件为150GB,共有三个副本,即共占450GB,集群有6个节点,平均每个节点75GB,而各个节点所在磁盘容量为1TB,仅占其1/13,因此,无其它IO任务的情况下,IOPS会比全磁盘随机操作高。

减少客户机的测试文件大小为原来的1/8,即19GB,IOPS能够达到130-140左右,验证了无其它IO任务的情况下,测试文件越小,IOPS越高(浅蓝线)。

恢复客户机的测试文件为150GB,在多任务(线程数量为10,紫线)或者异步IO(队列深度为10,黄线)的情况下,IOPS可达230-250。

250左右是否该sheepdog集群的极限?进一步换其它numjob和iodepth的组合进行测试,答案是肯定的,测试结果都在250左右,以下是线程数量为8,异步IO队列深度分别为1、4、16、64、256的测试结果,线程数量增加到16,测试数据并没有提高。

IOPS测试2:使用对象缓存,只读测试

单线程同步IO、使用对象缓存且缓存命中率100%的情况下(下图蓝线),sheepdog的IOPS最高可达6000,对比相同条件下SSD硬盘的测试结果(最高9000),还是有些损耗。

通过多任务(紫线)或者异步IO(黄线)的方式提高并发IO数量,在缓存命中率100%的情况下,IOPS可以提高到40000-50000,基本与相同条件下SSD硬盘的测试结果相当。

注意上图为对数刻度,且没有数据值,很难比较数值大小,下图省略了一半数据块,但是标上了数据值。

之所以强调缓存命中率,是因为在不完全命中缓存的时候,IOPS下降很厉害,低于80%的话,可能还不如没有对象缓存。下图是sheepdog对象缓存命中率与IOPS的关系图,其中,测试的数据块大小从512B倍数递增到512KB,缓存命中率是在测试过程中,根据sheepdog的cache目录中已有的对象文件数量估算的平均值,IOPS值是读取数据块操作在估算的缓存命中率条件下测量的平均值。

50000是否该sheepdog集群的极限?仿照上面的方法进行测试,答案也是肯定的,测试结果都在50000以内,以下是线程数量为8,异步IO队列深度分别为1、4、16、64、256的测试结果,线程数量增加到16,测试数据并没有提高。

IOPS测试3:不使用对象缓存,读写混合测试

读写混合测试的IOPS比只读测试的结果,总的来说要低一些,而且起伏较大,需要多次测试计算其平均值。

单线程同步IO的情况下(下图深蓝线),能够达到80-100。

减少客户机的测试文件大小为原来的1/8,即19GB,IOPS能够达到100-120(浅蓝线)。

恢复客户机的测试文件为150GB,在多任务(线程数量为10,紫线)或者异步IO(队列深度为10,黄线)的情况下,IOPS大多在180-250之间,但也有时候只到160左右。

IOPS测试4:使用对象缓存,读写混合测试

单线程同步IO、使用对象缓存且缓存命中率100%的情况下,IOPS差不多达到4000。

通过多任务或者异步IO的方式提高并发IO数量,在缓存命中率100%的情况下,IOPS可达10000-20000之间。

注意上图为对数刻度,且没有数据值,下图省略了一半数据块,但是标上了数据值。可以看到,大数据块读写混合的情况下,多任务或异步IO的IOPS可能还不如单任务同步IO


吞吐量测试

测试须知

关于SATA硬盘的吞吐量

普通7200转SATA硬盘的吞吐量数据,对比一下后面SSD硬盘的吞吐量数据,说明传统磁盘顺序读写的能力还是相当出色的。

关于SSD硬盘的吞吐量

大数据块(512KB以上)顺序读,吞吐量可达250MB/s-270MB/s,顺序写,吞吐量可达200MB/s-210MB/s。

小数据块(16KB)顺序读,吞吐量也有140MB/s,顺序写大概120MB/s-130MB/s。

无优化sheepdog的吞吐量

在软硬件不做任何优化的情况下(不绑定双网卡、不使用virtio、以默认参数启动sheepdog),sheepdog的吞吐量数据比较低:

  • 顺序写

    • 数据块大小为16KB,吞吐量13-14MB/s
    • 数据块大小在256KB-4MB之间,吞吐量30-35MB/s
  • 顺序读

    • 数据块大小为16KB,吞吐量25MB/s左右,如果数据文件大小超过可用内存,降低到20MB/s
    • 数据块大小在512KB-4MB之间,吞吐量125-140MB/s,如果数据文件大小超过可用内存,降低到80MB/s以下

以下两图,上图为数据文件512MB的测试数据,下图为数据文件4GB的测试数据

注,不使用virtio方式启动sheepdog的命令行参数为:

qemu-system-x86_64 --enable-kvm -m 4096 -smp 4 -drive file=sheepdog:mint,index=0 \
-drive file=sheepdog:data,index=1 -vnc :1 -daemonize

吞吐量测试1:不使用对象缓存

从测试结果看,使用virtio方式启动客户机有利有弊:

  • 提高了中小数据块读写操作的吞吐量

    • 当数据块大小在16KB-512KB之间时,顺序读的吞吐量提高10MB/s-30MB/s不等
    • 当数据块大小在16KB-256KB之间时,顺序写的吞吐量提高5MB/s-8MB/s不等
  • 大大降低了超大数据块读操作的吞吐量,至于为何virtio在这种情况下会降低测试的吞吐量,尚不清楚

    • 当数据块大小达到2MB或者4MB时,顺序读的吞吐量降低80MB/s-90MB/s

以下两图,上图为512MB下的测试数据,下图为该情况下,与无优化sheepdog读写512MB数据文件两者吞吐量之差。

吞吐量测试2:使用对象缓存

使用了对象缓存,顺序读写的吞吐量与数据文件大小没有直接关系,即使数据文件大小超过可用内存。

同时也使用了virtio,并没有因此降低读取大数据块的吞吐量。

由于SSD硬盘的特点,数据块越大,吞吐量越高,在数据块大小为4MB的情况下,顺序读的吞吐量可达240MB/s,顺序写也有130MB/s;如果数据块大小只有16KB,顺序读和顺序写的吞吐量分别只有55MB/s和35MB/s。


总结sheepdog性能

对象缓存 IOPS 吞吐量(MB/s)
只读250,读写混合(4:1)200 数据块512KB,顺序读150,顺序写35
只读45000,读写混合(4:1)16000 数据块512KB,顺序读175,顺序写105;数据块4MB,顺序读240,顺序写130

以上为sheepdog集群节点数为6个,且各节点都只挂载一块SATA硬盘的情况下测得的结果,如果增加集群节点数,并且每个节点都挂满硬盘,IOPS应该会更高,而吞吐量取决于缓存和网络带宽,应该不会有明显变化。

相关 [分布 对象 系统] 推荐:

分布式对象存储系统Sheepdog性能测试

- - UC技术博客
Sheepdog是一个分布式对象存储系统,专为虚拟机提供块存储,号称无单点、零配置、可线性扩展(省略更多优点介绍). 本文主要关注其性能究竟如何,测试版本为目前的最新稳定版0.7.4. 磁盘:各节点都配备7200转SATA硬盘,型号WDC WD10EZEX-22RKKA0,容量为1TB,另外测试节点(即用于启动虚拟客户机的宿主机)多配置一块SSD硬盘,型号INTEL SSDSA2CW300G3,容量为300GB.

Hadoop分布式文件系统HDFS和OpenStack对象存储系统Swift有何不同?

- - ITeye博客
HDFS使用 集中式单一节点架构(NameNode)来维护文件系统元数据,而在Swift中,元数据 分布在整个集群中并拥有多个副本. 注意:集中式元数据存储使HDFS存在单点故障和扩展性问题,因此规模越大就性能越低,就越难扩展甚至不能扩展,所幸的是HDFS2使用NameNode HA和HDFS Federation解决了这两个问题.

新系统自动判断软件对象的交互

- SotongDJ - Solidot
过去四十年,软件工程中的一大创新是面向对象的编程语言. “对象”实际上是程序的软件库,让程序员从计算细节上转移注意力到更重要的编程任务上. 一个复杂的程序有数百万行代码,如果程序员从头开始参与项目,他可以方便对面向对象的程序增添功能;但如果程序员是中途进来参与大项目,了解现有对象的互动可能有些难度,需要颇费一段时间.

多重继承及虚继承中对象内存的分布

- Michael - 淘宝数据平台与产品部官方博客 tbdata.org
这篇文章主要讲解G++编译器中虚继承的对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念. 问题拿捏得十分到位,下面是我对原文的翻译,原文见这里(By Edsko de Vries, January 2006).

分布式缓存系统 Xixibase

- Le - 开源中国社区最新软件
Xixibase是一个高性能,跨平台的分布式缓存系统. Xixibase server 采用 C++ 实现,底层网络库采用的是Boost Asio. Xixibase 主要特点: 1. 实现'Local Cache'功能, 当客户端打开'Local Cache'选项, 客户端可以将数据同时存储在Server 端和本地,并且保证本地数据和Server 端的数据的一致性.

分布式检索系统 ElasticSearch

- - 丕子
ElasticSearch最近发展不错,github等都用它,可以关注I下. ElasticSearch是分布式,REST风格,搜索和分析系统. 具有实时数据,实时分析,分布式,高可用性,多租户,全文搜索,面向文档,冲突管理,自由模式,rest风格API,每个操作的持久性,Apache 2的开源许可证,基于Apache Lucene之上的特点.

分布式消息系统:Kafka

- - 标点符
Kafka是分布式发布-订阅消息系统. 它最初由LinkedIn公司开发,之后成为Apache项目的一部分. Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务. 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转. 传统的企业消息系统并不是非常适合大规模的数据处理.

分布式系统介绍-PNUTS

- - CSDN博客推荐文章
PNUTS是Yahoo!的分布式数据库系统,支持地域上分布的大规模并发操作. 它根据主键的范围区间或者其哈希值的范围区间将表拆分为表单元(Tablet),多个表单元存储在一个服务器上. 一个表单元控制器根据服务器的负载情况,进行表单元的迁移和拆分. 每条记录的数据都没有固定的模式(采用JSON格式的文本).

Ganglia:分布式监控系统

- - CSDN博客移动开发推荐文章
1         环境安装配置. 1.1      依赖软件下载. Ganglia是伯克利开发的一个集群监控软件. 可以监视和显示集群中的节点的各种状态信息,比如如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,同时可以将历史数据以曲线方式通过php页面呈现. 而ganglia又依赖于一个web服务器用来显示集群状态,用rrdtool来存储数据和生成曲线图,需要xml解析因此需要expat,配置文件解析需要libconfuse.

kafka分布式消息系统

- - CSDN博客云计算推荐文章
Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录、浏览、点击、分享、喜欢)以及系统运行日志(CPU、内存、磁盘、网络、系统及进程状态). 当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线).