RocksDB 在内存下的基准性能测试

这些基准测试的目标是度量数据驻留在RAM内存中时RocksDB的性能。 系统被配置为将事务日志存储在持久存储中,这样在重新引导机器时就不会丢失数据。

TL;DR

450万-700万读取QPS用于持续写操作的点查找。400万-600万 QPS前缀范围扫描与持续写入。

Setup 配置

所有基准测试都在同一个台机器上运行。下面是用于一下基准测试的常见设置。 有些配置会根据测试而变化,将在相应的小节中提到。

  • 2 Intel Xeon E5-2660 @ 2.2GHz, total 16核 (32 with HT)
  • 20MB CPU cache, 144GB Ram
  • CentOS release 6.3 (Kernel 3.2.51)
  • Commit (c90d446ee7b87682b1e0ec7e0c778d25a90c6294) 在master分支
  • 每个最大写入缓冲区128MB
  • Level层级compaction风格
  • 纯SST格式,启用了BloomFilter
  • HashSkipList memtable格式,禁用了BloomFilter
  • WAL已启用并保持在旋转磁盘上。但是,它们没有存档,并且在基准测试期间没有执行任何DB备份
  • 每个键的大小为20字节,每个值的大小为100字节
  • 没有压缩
  • 首先使用db_bench的filluniquerandom模式加载500万个唯一键,然后在32个读线程的readwhile写模式下测试7200秒的读取性能。 每个读取器线程发出随机密钥请求,保证能够找到。与此同时,另一个专用的写线程发出写请求。
  • 测试了轻度写速率(10K写/秒 => ~1.2MB/秒)和中度写速率(80K写/秒=> ~9.6 MB/秒)的性能。
  • 数据库在稳态下总大小为~73GB,数据文件存储在tmpfs中
  • 在基准测试期间禁用统计信息,并将perf_context级别设置为0
  • jemalloc 内存分配器

测试1 Point点查询

在这个测试中,整个键被索引用于快速查找点(即prefix_extractor = NewFixedPrefixTransform(20))。使用此设置时,不支持范围查询。它为点查找查询提供了最大的吞吐量。

80K writes/sec

下面是将写速率设置为80K/秒时报告的读性能:

  1. readwhilewriting : 0.220 micros/op 4553529 ops/sec; (1026765999 of 1026765999 found)

实际的持续写速率被发现在~52K写/秒。该测试是CPU绑定的,在测量过程中,用户空间占用了CPU的98.4%,内核占用了CPU的1.6%。

下面是填充数据库的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=20 --keys_per_prefix=0
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --benchmarks=filluniquerandom --use_existing_db=0 --num=524288000 --threads=1

下面是运行readewriting benchmark的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=20 --keys_per_prefix=0
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --duration=7200 --benchmarks=readwhilewriting --use_existing_db=1 --num=524288000 --threads=32 --writes_per_second=81920

10K writes/sec

下面是将写速率设置为10K/秒时报告的读性能:

  1. readwhilewriting : 0.142 micros/op 7054002 ops/sec; (1587250999 of 1587250999 found)

实际的持续写速率被发现在~10K写/秒。该测试是CPU绑定的,在测量过程中,用户空间占CPU的约99.5%,内核占CPU的约0.5%。

下面是填充数据库的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=20 --keys_per_prefix=0
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/0_WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --benchmarks=filluniquerandom --use_existing_db=0 --num=524288000 --threads=1

下面是运行readewriting benchmark的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=20 --keys_per_prefix=0
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/0_WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --duration=7200 --benchmarks=readwhilewriting --use_existing_db=1 --num=524288000 --threads=32 --writes_per_second=10240

测试2 前缀范围查询

在这个测试中,索引的键前缀大小为12字节(即prefix_extractor = NewFixedPrefixTransform(12))。 db_bench配置为为每个惟一前缀生成大约10个键。在这个设置中,可以在给定的前缀内执行Seek(),也可以在返回的迭代器上执行迭代。 但是,没有定义超出前缀边界的扫描行为。这是图形数据的一种相当常见的访问模式。点查找吞吐量在此设置下测量:

80K writes/sec

下面是将写速率设置为80K/秒时报告的读性能:

  1. readwhilewriting : 0.251 micros/op 3979207 ops/sec; (893448999 of 893448999 found)

实际的持续写速率被发现在~67K写/秒。该测试是CPU绑定的,在测量过程中,用户空间占CPU的98.0%,内核占CPU的2.0%。

下面是填充数据库的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=12 --keys_per_prefix=10
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --benchmarks=filluniquerandom --use_existing_db=0 --num=524288000 --threads=1

下面是运行readewriting benchmark的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=12 --keys_per_prefix=10
  2. --value_size=100 --cache_size=17179869184 --cache_numshardbits=6 --compression_type=none --compression_ratio=1
  3. --min_level_to_compress=-1 --disable_seek_compaction=1 --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2
  4. --level0_file_num_compaction_trigger=8 --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/WAL_LOG
  5. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4 --max_background_flushes=0
  6. --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0 --stats_interval=1048576 --histogram=0 --use_plain_table=1
  7. --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10 --bloom_locality=1 --duration=7200 --benchmarks=readwhilewriting --use_existing_db=1 --num=524288000 --threads=32 --writes_per_second=81920

10K writes/sec

下面是将写速率设置为10K/秒时报告的读性能:

  1. readwhilewriting : 0.168 micros/op 5942413 ops/sec; (1334998999 of 1334998999 found)

实际的持续写速率被发现在~10K写/秒。该测试是CPU绑定的,在测量过程中,用户空间占CPU的99.4%,内核占CPU的0.6%。

下面是填充数据库的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=12
  2. --keys_per_prefix=10 --value_size=100 --cache_size=17179869184 --cache_numshardbits=6
  3. --compression_type=none --compression_ratio=1 --min_level_to_compress=-1 --disable_seek_compaction=1
  4. --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2 --level0_file_num_compaction_trigger=8
  5. --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/0_WAL_LOG
  6. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4
  7. --max_background_flushes=0 --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0
  8. --stats_interval=1048576 --histogram=0 --use_plain_table=1 --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10
  9. --bloom_locality=1 --benchmarks=filluniquerandom --use_existing_db=0 --num=524288000 --threads=1

下面是运行readewriting benchmark的命令:

  1. ./db_bench --db=/mnt/db/rocksdb --num_levels=6 --key_size=20 --prefix_size=12
  2. --keys_per_prefix=10 --value_size=100 --cache_size=17179869184 --cache_numshardbits=6
  3. --compression_type=none --compression_ratio=1 --min_level_to_compress=-1 --disable_seek_compaction=1
  4. --hard_rate_limit=2 --write_buffer_size=134217728 --max_write_buffer_number=2 --level0_file_num_compaction_trigger=8
  5. --target_file_size_base=134217728 --max_bytes_for_level_base=1073741824 --disable_wal=0 --wal_dir=/data/users/rocksdb/0_WAL_LOG
  6. --sync=0 --disable_data_sync=1 --verify_checksum=1 --delete_obsolete_files_period_micros=314572800 --max_background_compactions=4
  7. --max_background_flushes=0 --level0_slowdown_writes_trigger=16 --level0_stop_writes_trigger=24 --statistics=0 --stats_per_interval=0
  8. --stats_interval=1048576 --histogram=0 --use_plain_table=1 --open_files=-1 --mmap_read=1 --mmap_write=0 --memtablerep=prefix_hash --bloom_bits=10
  9. --bloom_locality=1 --duration=7200 --benchmarks=readwhilewriting --use_existing_db=1 --num=524288000 --threads=32 --writes_per_second=10240