基准性能测试(闪存)

这些基准测试度量数据驻留在闪存上时的RocksDB性能。(本页基准是在2018年7月用RocksDB 5.13.1生成的)

配置

所有基准测试都在同一个AWS实例上运行,一下是测试设置的细节:

  • 实例类型: i3.8xlarge
    • 32个vCPUs,Intel Xeo E5-2686 v4 (Broadwell) @ 2.3GHz
  • 这台机器有244 GB内存
  • 4 x 1.9TB NVMe SSD存储 (XFS文件系统)
  • 内核版本: 4.4.0-1054-aws
  • 1G rocksdb块缓存
  • 80亿的key; 每个键的大小为20字节,每个值的大小为400字节
  • 内存分配器为 jemalloc

这是一个IO绑定的工作负载,其中数据为3.2TB,而机器只有244GB 内存,这些结果是通过使用tools/benchmark.sh 通过make release创建 db_bench的版本构建得到的, 其中只做了少量更改(NUM_THREADS=64 NUM_KEYS=8000000000 CACHE_SIZE=17179869184)

测试1: 按随机顺序批量加载keys

测量向数据库加载80亿个键的性能。键按随机顺序插入。在基准测试运行开始时,数据库是空的,并逐渐填满,在数据加载过程中没有读取任何数据。

  1. rocksdb: 157.6 minutes, 353.6 MB/sec (3.2TB ingested, file size 1.5TB)

RocksDB被配置为首先加载L0中的所有数据,关闭压缩并使用未排序的向量memtable。 然后,它再次传递数据,将L0中的所有文件合并到L1中的排序文件中。 下面是我们用来加载数据到rocksdb的命令:

  1. export DB_DIR=/raid/db
  2. export WAL_DIR=/raid/wal
  3. export TEMP=/raid/tmp
  4. export OUTPUT_DIR=/raid/output
  5. tools/benchmark.sh bulkload
  6. du -s -k /raid/db
  7. 1498565136 /raid/db

测试2: 按顺序批量加载keys

测试向数据库加载80亿个键的性能。键按顺序插入。在基准测试运行开始时,数据库是空的,并逐渐填满。在数据加载过程中没有读取任何数据。

  1. rocksdb: 159 minutes, 335.7 MB/sec (3.2TB ingested, file size 1.45 TB)

RocksDB被配置为使用多线程压缩,以便多个线程可以同时压缩(通过文件重命名)多个级别的非重叠键范围。 这就是rocksdb在这种工作负载下比leveldb快得多的主要原因。

下面是将数据加载到rocksdb的命令:

  1. tools/benchmark.sh fillseq_disable_wal
  2. du -s -k /raid/db
  3. 1448482656 /raid/db

测试3: 随机写操作

测量随机覆盖20亿个键到数据库中的性能。数据库首先由之前的基准创建,按顺序插入80亿个键。 测试在启用Write-Ahead-Log (WAL)的情况下运行,但是没有对WAL执行提交的fsync。这个测试使用一个线程。

  1. rocksdb: 15 hours 38 min; 56.295 micros/op, 17K ops/sec, 13.8 MB/sec

RocksDB配置了20个压缩线程。这些线程可以同时在相同或不同级别压缩非重叠的键范围。还为1TB数据库配置了rocksdb, 方法是将级别设置为6,从而减少写放大。L0-L1压缩被优先考虑以减少停机。zlib压缩只在L2或更高级别启用,以便L0压缩可以更快的进行。 文件被配置为64MB大小,以便在创建新压缩的文件之后减少频繁的fsync。

下面在rocksdb中覆盖20亿 keys的命令:

  1. NUM_KEYS=2000000000 NUM_THREADS=1 tools/benchmark.sh overwrite

测试4: 随机读

测量具有10亿个键的数据库的随机读取性能,每个键为10个字节,值为800个字节。 rocksdb和leveldb都配置了一个大小为4 KB的块。未启用数据压缩。基准测试应用程序中有一个线程向数据库发出随机读取(读取10亿个键)。 rocksdb被配置为在每次读取时验证校验和,而leveldb关闭了校验和验证。

  1. rocksdb: 18 hours, 64.7 micros/op, 15.4K ops/sec (checksum verification)

首先将数据按顺序写入数据库的所有80亿键,从而j将数据加载到数据库中,加载完成后,基准随机选择一个键并发出读取请求。 上述测量不包括数据加载部分。rocksdb之所以更快,是因为它不使用mmaped IO,因为在一些linux平台上使用mmaped IO的速度比较慢。 此外,rocksdb将块缓存分割为64个部分,以减少锁争用。rocksdb被配置为避免由seek触发的压缩,而leveldb对该工作负载进行了查找压缩。

下面是用rocksdb运行基准测试时使用的命令:

  1. NUM_KEYS=1000000000 NUM_THREADS=1 tools/benchmark.sh readrandom

测试5: 多线程读和单线程写

使用80亿 keys和对现有keys的持续更新,随机从数据库中读取1亿个keys,从而测试性能。读取键数设置为1亿,缩短实验时间。 每个键是10字节,值是800字节。rocksdb和leveldb都配置了一个大小为4KB的块,未启用数据压缩,基准测试中有32个专门的读取线程向数据库发出随机读取。 一个单独的线程尽最大努力向数据库写入数据。

  1. rocksdb: 75 minutes, 1.42 micros/read, 713376 reads/sec

通过将所有10亿keys按顺序写入数据库,数据首先被加载到数据库中。加载完成后,基准生成32个线程,这些线程随机选择键并发出读请求。另一个单独的写线程随机选择并同时发出写请求。 报告的时间不包括数据加载阶段。它测量完成读取1亿keys的持续时间。测试是使用rocksdb发行版5.13完成的

  1. NUM_KEYS=100000000 NUM_THREADS=32 tools/benchmark.sh readwhilewriting