当前位置: 首页 > 科技观察

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

时间:2023-03-13 06:45:09 科技观察

Sheepdog是一个为虚拟机提供块存储的分布式对象存储系统。号称无单点、零配置、线性可扩展(更多优点省略)。本文主要关注其性能。测试版本为当前***稳定版0.7.4。测试环境节点数:6盘:每个节点配备一块7200转的SATA硬盘,型号WDCWD10EZEX-22RKKA0,容量1TB,测试节点(即用于启动的主机)virtualclient)额外加装一块SSD硬盘,型号INTELSSDSA2CW300G3,容量300GB网络:测试节点配备PCI-E双千兆网卡,通过bonding进行负载均衡文件系统:ext4fs,Mount参数:rw,noatime,barrier=0,user_xattr,data=writebacksheepdog集群可用空间:6个节点各分配100GB,一共600GB。对象副本数:3。客户端实际最大可用空间为200GB,接近项目规划的容量,由于测试项目需要挂载或卸载虚拟客户端资源:4GB内存,4个逻辑CPU从qemu1.7开始,支持KVM加速和virtio两大测试项目IOPS:主要考察小数据块的随机读写能力,测试工具fio(sudoapt-getinstallfio),测试文件固定150GBThroughput:主要考察顺序读写更大数据块的能力,测试工具iozone(sudoapt-getinstalliozone3),测试文件为64MB增量到4GB的倍数,如无特殊说明,测试结果均取自512MB的数据文件。除非特别说明,启动虚拟客户端的qemu命令如下:qemu-system-x86_64--enable-kvm-m4096-smp4-drivefile=sheepdog:mint,if=virtio,index=0\-drivefile=sheepdog:data,if=virtio,index=1-netnic,model=virtio-netuser-vnc:1-daemonizeIOPS测试笔记关于SATA硬盘IOPS测试普通7200SATA硬盘官方公布其平均寻道时间是10.5毫秒,所以,根据下面的公式,理论IOPS值最多只有65。在单线程同步IO的情况下(下图中深蓝线)也是65。在多任务(紫线)或者异步IO(黄线)的情况下,由于操作系统IO调度,IOPS可以达到80到100之间。如果读写操作的文件远小于SATA磁盘的大小,则存储单元的寻址范围缩小,整个磁盘的寻道时间减少,IOPS也可以提高.例如,当测试文件大小占磁盘大小的1/8时,IOPS***在90左右(淡蓝色线)。关于SSD硬盘的IOPS测试,IOPS测试使用的SSD硬盘,在单线程同步IO的情况下,IOPS最高可达9000左右(下图中深蓝线),并且在多任务(紫线)或异步IO(黄线)的情况下,最多40000-50000。由于构建原理不同于传统磁盘,因此减小测试文件大小并不能显着提高IOPS。关于读写比例,由于大部分业务场景既有读操作也有写操作,而且一般读操作比写操作多很多,所以混合读测试项目中的读写比例设置为4:1。一般业务很少有完全随机写的,所以不做只写测试。关于电梯算法,虚拟客户端操作系统的IO调度算法使用的是noop。网上有资料说可以提高IOPS,但是实测效果不明显,所以最终报告没有列出来。IOPS测试一:不带对象缓存,在单线程同步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。sheepdog集群是在250左右的限制吗?进一步测试numjob和iodepth的其他组合。答案是肯定的。测试结果都在250左右,下面是线程数为8,异步IO队列深度分别为1、4、16、64、256的测试结果,线程数增加到16,测试数据做了没有改善。IOPS测试二:使用对象缓存,只读测试单线程同步IO,使用对象缓存,缓存命中率100%(下图中蓝线),sheepdog的IOPS最好能达到6000,对比SSD下同样条件下硬盘(***9000)的测试结果还是有一些磨损。通过多任务处理(紫线)或异步IO(黄线)增加并发IO的数量。当缓存命中率为100%时,IOPS可提升至4万-5万,与同等条件下SSD硬盘的测试结果基本相当。.注意上图是对数刻度,没有数据值,所以数值比较困难。下图中省略了一半的数据块,但是标出了数据值。之所以强调缓存命中率,是因为当缓存没有完全命中时,IOPS会急剧下降。如果低于80%,可能还不如没有对象缓存。下图展示了sheepdog对象缓存命中率和IOPS之间的关系。测试数据块大小从512B倍数增加到512KB。缓存命中率是根据测试时sheepdog缓存目录下目标文件的数量来估算的。的平均值,IOPS值是在预估缓存命中率下测得的读取数据块操作的平均值。50000是牧羊犬集群的限制吗?按照上面的方法测试,答案是肯定的,测试结果都在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吞吐量测试。看后面SSD硬盘的吞吐数据,传统磁盘的顺序读写能力还是相当不错的。SSD硬盘吞吐量方面,大数据块(512KB以上)顺序读吞吐量可达250MB/s-270MB/s,顺序写吞吐量可达200??MB/s-210MB/s。小数据块(16KB)顺序读吞吐量140MB/s,顺序写大约120MB/s-130MB/s。未优化的sheepdog吞吐量是在没有进行软硬件优化的情况下(未绑定双网卡,未使用virtio,默认参数启动sheepdog),sheepdog的吞吐量数据比较低:sequentialwritedatablocksizeis16KB,Throughput13-14MB/sDatablocksizeisbetween256KB-4MB,throughput30-35MB/sSequentialreaddatablocksizeis16KB,throughputisabout25MB/s,如果数据文件大小超过可用内存,减少到20MB/s数据块大小在512KB-4MB之间,吞吐量125-140MB/s。如果数据文件大小超过可用内存,则会降低到80MB/s以下。注意数据文件4GB的测试数据,不用virtio启动sheepdog的命令行参数为:qemu-system-x86_64--enable-kvm-m4096-smp4-drivefile=sheepdog:mint,index=0\-drivefile=sheepdog:data,index=1-vnc:1-daemonize吞吐量测试一:不使用对象缓存从测试结果来看,使用virtio启动客户端优缺点:提高中小数据块读写的吞吐量操作当数据块大小在16KB-512KB之间时,顺序读吞吐量增加10MB/s-30MB/s。当数据块大小在16KB-256KB之间时,顺序写入吞吐量增加5MB/s-8MB/s。等大大降低了大数据块读操作的吞吐量。至于为什么virtio会降低这种情况下测试的吞吐量,不太清楚,当数据块大小达到2MB或4MB时,顺序读的吞吐量降低了80MB/s-90MB/s下面两张图,上图是512MB下的测试数据,下图是本例中在没有优化牧羊犬的情况下读写512MB数据文件的吞吐量差异。吞吐量测试2:使用对象缓存。顺序读写的吞吐量与数据文件的大小没有直接关系,即使数据文件的大小超过了可用内存。同时还使用了virtio,并没有降低读取大数据块的吞吐量。由于SSD硬盘的特性,数据块越大,吞吐量越高。当数据块大小为4MB时,顺序读吞吐量可达240MB/s,顺序写吞吐量可达130MB/s;如果数据块大小仅为16KB,则顺序读取和顺序写入吞吐量分别仅为55MB/s和35MB/s。总结上面的sheepdog性能,sheepdog集群节点数为6个,每个节点只挂载一个SATA硬盘。如果集群节点数增加,每个节点都装满了硬盘,IOPS应该更高,而吞吐量取决于缓存和网络带宽,应该不会有太大变化。