NoSQL数据库崛起,从测试看NVMe SSD的优势

"\u003Cdiv\u003E\u003Cp\u003E近年来,经典的关系型数据库仍然占着霸主地位,Memblaze很多研究是针对MySQL等关系型数据库进行的,比如《\u003Ca class=\"pgc-link\" data-content=\"mp\" href=\"https:\u002F\u002Fwww.toutiao.com\u002Fi6693357833095741965\u002F?group_id=6693357833095741965\" target=\"_blank\"\u003EMySQL数据库场景中NVMe SSD的优化\u003C\u002Fa\u003E》中提到的混合介质的多命名空间管理,就是一项无需MySQL改动配置便可以在开启Doublewrite的同时降低NVMe SSD写放大,提高性能和寿命的技术。关系型数据库盛行,但是数据库市场也并非一成不变,随着NoSQL,特别是以TiDB为代表的NewSQL数据库的实际应用越来越多。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E诞生于Big Data时代的RockDB\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E互联网是NoSQL应用最多的行业,Facebook、谷歌以及国内的阿里、网易都走在NoSQL研究和应用的前列,而在NoSQL发展之路上,NVMe SSD必不会缺席。以RocksDB为代表的高性能K\u002FV数据库引擎就擅长于挖掘闪存的读写潜力。另一方面,诞生于Big Data时代的RocksDB,也是为远大于内存容量的海量on-disk数据而优化的,这样的设计使其适合考察存储介质的性能。\u003C\u002Fp\u003E\u003Cp\u003ERocksDB是Facebook公司在2013年基于LevelDB的K\u002FV引擎数据库引擎,受Apache Cassandra 和Apache HBase的启发,以开源的形式发布的。RocksDB着重强调了面向高性能存储介质、multi-core CPU的设计理念;带来了诸如多线程Compaction;低mutex锁以及Column Family等诸多LevelDB中没有的特性。\u003C\u002Fp\u003E\u003Cp\u003E这篇文章我们就通过几个RocksDB测试来一窥NVMe SSD在NoSQL场景中的性能表现,并对其中涉及到的多队列调用等技术做一个解读。\u003C\u002Fp\u003E\u003Cpre\u003ECPU:AMD 1stGen Zen (aka Naples)\u003Cbr\u003EEPYC 7351P 16-Core Processor 2.4GHz with HT\u003Cbr\u003E内存:128 GB DDR4-2666 DRAM\u003Cbr\u003E数据库:RocksDB 5.8.8\u003Cbr\u003E操作系统:CentOS 7.4(gcc 4.8.5 )\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp\u003E\u003Cstrong\u003E对比测试中采用的SSD\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cpre\u003EPlaze5 700 series 4TB (U.2形态)\u003Cbr\u003E某主流品牌800GB SATA SSD (6Gb\u002Fs)\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp\u003E测试第一阶段使用随机写方式对数据库写入500GB数据并获取存储设备性能数据,第二阶段则是8:2的混合随机读写测试。结果展示包括RocksDB自带的db_bench采集的数据库吞吐数据以及iostat的硬盘性能数据。此外,这次测试也采用了RocksDB默认的LeveledCompactionStrategy (LCS) 策略;并关闭了压缩功能。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E第一阶段:数据库_随机写(无压缩)\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E第一阶段测试中,使用随机写的方式对RocksDB写入500 GB数据,总计 5.12亿 K\u002FV item; 我们首先使用了 thread=16的并发压力;并开启了Compaction。\u003C\u002Fp\u003E\u003Cp\u003E测试结果如下:\u003C\u002Fp\u003E\u003Cp\u003ESATA: 360.2 MB\u002Fs (如下图所示,从 %iowait, avgqu-sz,w_await 都看到了SATA SSD已经饱和的迹象)\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F04bea3c9808f427fbc33f8329aca98fe\" img_width=\"991\" img_height=\"420\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003ENVMe SSD写带宽达到了448.4 MB\u002Fs,对于一款NVMe SSD来说,这样的带宽性能并不高,从w_await 和 %util来看,NVMe SSD吞吐能力仍有较大的空间,要进一步提高性能还需要对负载压力及CPU等组件的信息进行综合分析。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002F90109dadc0f949dba000e0a26563a303\" img_width=\"1002\" img_height=\"421\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E在此,所以我们逐渐加码压力, 在threads=28 的条件下,看到了NVMe SSD更高的写吞吐能力数据。(SATA SSD在threads=16时已经触及性能峰值,所以不再执行本轮测试。)\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp9.pstatp.com\u002Flarge\u002Fpgc-image\u002Ff7b869990e9c4987bcaa6b4d67e65ba5\" img_width=\"997\" img_height=\"424\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E从iostat抓到的四条记录看,写带宽最低值534MB,最高值650MB\u002Fs,而从w_await和%util来看,NVMe SSD还有较大的潜力可以挖掘。(相信通过使用新一代或者更高端的AMD的CPU将获得更高的系统性能,在此暂不做深入讨论。)\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E第二阶段:数据库_8:2 混合随机读写(无压缩)\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E上一阶段我们已经造完了500GB数据,第二阶段首先使用threads=16的并发压力,对这5.12亿 K\u002FV Item进行混合随机读写测试,并记录该任务的完成时间。\u003C\u002Fp\u003E\u003Cpre\u003ESATA : 12.673 micros\u002Fop 78908 ops\u002Fsec ; 完成时间: 112 min\u003Cbr\u003ENVMe 3.037 micros\u002Fop 329234 ops\u002Fsec; 完成时间 : 26 min\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp\u003E读写混合在生产环境中十分常见, NVMe带来的时间上的节省也因此有极大的现实意义; 越早一刻完成compaction就有越多的Peak IO性能时段可以交付给数据库。\u003C\u002Fp\u003E\u003Cp\u003ENVMe SSD性能碾压SATA SSD的因素有很多,多队列调用是其中之一。从下面火焰图的结果中也可以清晰的看到NVMe使用了 blk-mq-make-request 多队列调用;而SATA只能调用原有的单队列。SATA只能支持单队列IO操作(generic_make_request)的问题被这个场景鲜明的展示了出来。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F63aff9c0e8a14244be0109ffb3189685\" img_width=\"763\" img_height=\"661\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003ENVMe SSD的高并发与多核CPU结合使得系统性能有了质的提升。从RocksDB的角度讲,LSM数据结构在高频read的时候会触发background compaction;特别是RocksDB这样实现了multi-threaded compaction的K\u002FV型数据库来说, NVMe的多队列multi-queue特性很适合这样的场景; 相比之下 单一队列的SATA应付这样的场景就非常的吃力。\u003C\u002Fp\u003E\u003Cp\u003E接下来还是用iostat看下两个盘的表现。\u003C\u002Fp\u003E\u003Cp\u003ESATA SSD在测试中的iostat截图\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F16f476991b964435a479e8380ea3fb3c\" img_width=\"1046\" img_height=\"507\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003ENVMe SSD在测试中的iostat截图\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fa3a352c95d4247aa83a7a772088b718e\" img_width=\"1084\" img_height=\"364\" alt=\"NoSQL数据库崛起,从测试看NVMe SSD的优势\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E可以看到NVMe SSD的带宽超过了1200MB\u002Fs。(iostat取值有一定的随机性,但是仍能看到NVMe SSD与SATA SSD性能质的差异。)\u003C\u002Fp\u003E\u003Cp\u003E展望未来,RocksDB6.x系列性能还在持续改善,另一方面基于4.18内核的RHEL8.0也带来了诸多I\u002FO性能的提升,AMD的Zen架构的多NUMA架构也有了很多进展。而这些改变多数更有利于发挥NVMe SSD为代表的高速存储设备的性能优势。未来NoSQL数据库大行其道必然不能缺少这样一个协同前进的生态。\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E"
发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();