设置选项和基本调整

除了在rocksdb上使用基本操作( https://github.com/facebook/rocksdb/wiki/Basic-Operations )编写代码之外,您还可能对如何调优rocksdb以获得所需的性能感兴趣。 在本页中,我们将介绍如何进行初始设置,这对于许多用例来说应该是足够好的。

RockSDB有许多配置选项,但是大多数配置选项都可以被许多用户安全地忽略,因为大多数配置选项都是为了影响特定工作负载的性能。 对于一般用途,大多数rocksdb选项都可以保留其默认值,但是,我们在下面建议一些选项,每个用户可能都希望对一般工作负载进行试验。

首先,您需要考虑与资源限制相关的选项(另请参见:基本操作 ( https://github.com/facebook/rocksdb/wiki/Basic-Operations ) ):

Write Buffer Size 写入缓冲区大小

这可以按数据库和/或按列族设置。

列族写入缓冲区大小

这是用于列族的最大写入缓冲区大小。

它表示在转换为按磁盘排序的文件之前要在内存中积累的数据量(由磁盘上未排序的日志支持)。默认值为64 MB。

你需要为2倍你最坏情况下的内存使用做预算。如果您没有足够的内存来完成此操作,那么应该减少此值。否则,不建议更改此选项。例如:

  1. cf_options.write_buffer_size = 64 << 20

有关跨列族共享内存的信息,请参见下文。

数据库写入缓冲区大小

这是数据库中所有列族中所有写缓冲区的最大大小。它表示在写入磁盘之前在所有列族的memtables中建立的数据量。

默认情况下,此功能被禁用(设置为0)。你不需要改变它。但是,作为参考,如果您确实需要将其更改为64GB,例如:

  1. db_options.db_write_buffer_size = 64 << 30;

Block Cache Size 块缓存大小

可以创建一个块缓存,其大小与所选大小相同,用于缓存未压缩的数据。

我们建议这应该是总内存预算的1/3左右。剩余的可用内存可以留给OS(操作系统)页面缓存。 为OS页面缓存保留大量内存有助于避免内存预算紧张(另请参见:rocksdb中的内存使用)。

设置块缓存大小要求我们还设置与表相关的选项,例如,如果您想要128MB的LRU缓存:

  1. auto cache = NewLRUCache(128 << 20);
  2. BlockBasedTableOptions table_options;
  3. table_options.block_cache = cache;
  4. auto table_factory = new BlockBasedTableFactory(table_options);
  5. cf_options.table_factory.reset(table_factory);

注意:您应该为进程管理的所有DB的所有列族在所有表选项上设置相同的缓存对象。 实现这一点的另一种方法是将相同的表工厂或表选项传递给所有DB的所有列族。 要了解有关块缓存的更多信息,请参见:块缓存。( https://github.com/facebook/rocksdb/wiki/Block-Cache )

Compression 压缩

您只能选择主机系统支持的压缩类型。使用压缩是CPU、I/O和存储空间之间的权衡。

  1. 1.cf_options.compression 控制用于第一个n-1级别的压缩类型。我们建议使用lz4klz4压缩),如果没有,则使用snappyksnappycompression
  2. 2.cf_options.bottommost_compression 控制用于第n级的压缩类型。我们建议使用zstandardkzsdd),如果没有,则使用zlibkzlibcompression)。

要了解有关压缩的更多信息,请参见压缩。 ( https://github.com/facebook/rocksdb/wiki/Compression )

Bloom Filters 布隆过滤器

只有当它适合您的查询模式时,才应该启用它;如果您有许多点查找操作( 即Get() ),那么一个bloom过滤器可以帮助加快这些操作的速度; 相反,如果您的大多数操作是范围扫描( 如iterator() ),那么bloom过滤器将不会有帮助。

Bloom过滤器对每个键使用若干位,一个好的值是10,这将产生一个假阳性率为1%的过滤器。

如果 Get() 是查询的常见操作,则可以配置bloom过滤器,例如,每个键10位:

  1. table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));

要了解有关Bloom过滤器的更多信息,请参阅:Bloom过滤器。( https://github.com/facebook/rocksdb/wiki/RocksDB-Bloom-Filter )

Rate Limits 频率限制

为了平滑I/O操作,最好限制压缩和刷新的速率,这样做的一个原因是为了避免读取延迟异常值。 这可以通过db_options.rate_limiter选项完成。速率限制是一个复杂的话题,它包含在速率限制中。( https://github.com/facebook/rocksdb/wiki/Rate-Limiter )

注意: 确保将相同的速率限制器对象传递给您进程中的所有数据库。

SST File Manager SST文件管理

如果您使用的是闪存,我们建议用户使用discard标志安装文件系统,以提高写放大率。

如果您使用闪存和丢弃标志,将使用修剪。如果修剪尺寸非常大,修剪可能会临时导致较长的I/O延迟。 sst文件管理器可以限制文件删除速度,从而控制每个修剪的大小。

可以通过设置db_options.sst_file_manager选项来启用sst文件管理器。 有关sst文件管理器的详细信息,请参见:sst_file_manager_impl.h. ( https://github.com/facebook/rocksdb/blob/5.14.fb/util/sst_file_manager_impl.h#L28 )

Other General Options 其他常规选项

下面是一些选项,我们认为设置的值可以实现一般工作负载的合理开箱即用性能。 我们没有改变这些选项,因为当用户将现有的rocksdb实例升级到新版本时,担心不兼容或回归。 我们建议用户使用以下设置启动新的数据库项目:

  1. cf_options.level_compaction_dynamic_level_bytes = true;
  2. options.max_background_compactions = 4;
  3. options.max_background_flushes = 2;
  4. options.bytes_per_sync = 1048576;
  5. options.compaction_pri = kMinOverlappingRatio;
  6. table_options.block_size = 16 * 1024;
  7. table_options.cache_index_and_filter_blocks = true;
  8. table_options.pin_l0_filter_and_index_blocks_in_cache = true;

如果您使用默认值而不是这些选项来运行现有的服务,不要感到难过。 虽然我们认为这些方案优于违约方案,但它们都不可能带来重大改善。

Conclusion and Further Reading 结论和进一步阅读

现在,您已经准备好测试您的应用程序,看看您的RockSDB初始性能如何。希望它足够好!

如果您的应用程序中的rocksdb在上述基本设置之后的性能足够好,我们不建议您进一步调整它。 随着时间的推移,工作负载通常会发生变化,如果您预先花费不必要的资源来调优rocksdb,使其对当前工作负载具有高性能,那么将来对该工作负载的一些适度变化可能会将性能推下悬崖。

另一方面,如果性能对您来说不够好,您可以按照更详细的调优指南进一步调优rocksdb。( https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide