ToplingDB CSPP MemTable 有多快

(一)背景ToplingDB,虽然 fork 自 RocksDB 并且兼容其 API,但实现了脱胎换骨的改进,最重要的就是实现了性能更高的 MemTable 和 SST。我们在 db_bench: ToplingDB vs RocksDB 测试中,看到了 cspp memtable 的单线程性能,本文中,我们测试它的多线程性能。(二)配置参数cspp memtable 的写性能太强,我们必须配置多线程 flush 才能跟得上,而每个 memtable 又最多只能有 1 个线程来 flush,如此,又必须配置足够多的 memtable(write_buffer_num),才能充分发挥多线程 flush 的作用。我们测试的是小 KV,key_size=8,value_size=20,所以评价指标优先使用 OPS,即每秒操作数,也就是每秒钟向 DB 中写入多少条 KV。我们这次只测试写性能,为了方便大家重现该测试,我们使用阿里云的 ecs.g7.16xlarge 进行测试。CPU 核数 & 超线程数32 核 64 超线程CPU 型号Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz内存256GToplingDB 和 RocksDB 相同的参数:benchmarksfillrandomkey_size8value_size20num100000000threads40target_file_size_base33554432 (32M)target_file_size_multiplier2write_buffer_size1Gwrite_buffer_num17max_background_flushes16max_subcompations13max_background_compactions13enable_pipelined_writetrueToplingDB 和 RocksDB 不同的参数:ToplingDBRocksDBmemtable_factoryCSPP MemTableSkipListtable_factorydispatch_all_fast, no zipBlockBasedTable, no zipdb 目录放在 /dev/shm,全内存模式,消除 IO 带来的不确定性,其它参数均使用默认值,最后,设置不同的 batch_size 运行多次。rocksdb 命令行:./db_bench -key_size=8 -value_size=20 -num=100000000 \
-db=/dev/shm/db_bench_rocksdb -bloom_bits=10 -write_buffer_size=1073741824 \
-target_file_size_base=33554432 -target_file_size_multiplier=2 \
-min_level_to_compress=10 -cache_size=34359738368 -enable_pipelined_write=true \
-max_write_buffer_number=17 -max_background_flushes=16 -subcompactions=13 \
-max_background_compactions=13 -disable_wal=true \
-benchmarks=fillrandom -threads=40 -batch_size=100ToplingDB 命令行(命令行中没有的参数在 db_bench_enterprise.yaml 中修改):./db_bench -json=sideplugin/rockside/sample-conf/db_bench_enterprise.yaml \
-key_size=8 -value_size=20 -num=100000000 -disable_wal=true \
-benchmarks=fillrandom -threads=40 -batch_size=100(三)测试结果3.1. fillrandom
ToplingDB CSPP MemTable 有多快_第1张图片
结果显示,当 batch_size=500 时,使用 CSPP,DB 的写性能超过 2000万 OPS,也就每秒钟可以向 DB 写入超过 2000万 条 KV。可以看到,只要 batch_size 足够大时,CSPP MemTable 的性能稳定地超过 SkipList 3 倍,实际上,CSPP MemTable 本身相比 SkipList 有 6 倍的写性能,测试中的 3 倍是被其它环节拉低后的结果。3.2 readwhilewritingreadwhilewriting 测试的是:多个线程读(-threads=40),一个线程写(-batch_size=100)
ToplingDB CSPP MemTable 有多快_第2张图片
可见,CSPP MemTable 不仅仅是写性能高,读性能更高,当然,读的时候除了搜索 MemTable,还需要搜索 SST,ToplingDB 的 SST,比 RocksDB 的 BlockBasedTable 更快。因为只有一个写线程,所以不会象 fillrandom 那样写得太快需要多线程 flush。(四)可期的改进:省略 MemTable Flush很久以前,我们就有个 ToplingDB 省略 L0 Flush 的改进计划,但是这将会是对 RocksDB 伤筋动骨的一个修改,所以一直未付诸行动。从这个测试中我们可以看到,当使用 CSPP MemTable 时,Flush 是一个明显的瓶颈,我们配置了 16 个线程来执行 Flush,实际运行中一般用到 8 个左右(通过 LOG 或 ToplingDB 的 WebView 可以看到),这些 Flush 实际上是以 Pipeline 的方式执行的,因为不同 Flush 线程操作的是不同时间的 MemTable,互相之间有时间差,从而构成一个实际上的 Pipeline。如果省略了 MemTable Flush,然后 MemTable 会直接与 L1 的 SST 执行 Compact,就 fillrandom 测试来说,性能再提高 30% 是问题不大的。更进一步,在真实场景中,省去 MemTable Flush,还能大幅减小 IO,因为 L0 几乎肯定是不压缩的,Flush 对 IO 的消耗相当可观。

你可能感兴趣的:(后端数据库mysql)