rocksdb的设置选项和基本调整

除了在 RocksDB 上使用基本操作编写代码外,您可能还对如何调整 RocksDB 以实现所需的性能感兴趣。在本页中,我们将介绍如何进行初始设置,该设置应该足以满足许多用例的需求。

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

写入缓冲区大小

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

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

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

您需要预算 2 倍于最坏情况下的内存使用量。如果没有足够的内存,则应减小此值。否则,不建议更改此选项。例如:

cf_options.write_buffer_size = 64 << 20;

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

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

db_options.db_write_buffer_size = 64 << 30;

块缓存大小

您可以创建所选大小的块缓存,以缓存未压缩的数据。

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

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

auto cache = NewLRUCache(128 << 20);

BlockBasedTableOptions table_options;
table_options.block_cache = cache;

auto table_factory = new BlockBasedTableFactory(table_options);
cf_options.table_factory.reset(table_factory);

压缩

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

cf_options.compression控制用于第一级的压缩类型。 我们建议使用 LZ4 (),如果不可用,则使用 Snappy ()。n1kLZ4CompressionkSnappyCompression

cf_options.bottommost_compression控制用于关卡的压缩类型。 我们建议使用 ZStandard (),或者如果不可用,则使用 Zlib ()。nthkZSTDkZlibCompression

SST 文件管理器

如果您使用的是闪存,我们建议用户使用丢弃标志挂载文件系统,以提高写入放大。

如果您使用的是闪存和标志,则将采用修剪。如果修整大小非常大,修整可能会暂时导致较长的 I/O 延迟。SST 文件管理器可以限制文件删除速度,以便控制每个修剪的大小。discard

SST文件管理器可以通过设置选项来启用。SST文件管理器的详细信息可以在这里看到:sst_file_manager_impl.h。db_options.sst_file_manager

其他常规选项

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

cf_options.level_compaction_dynamic_level_bytes = true;
opts.max_background_jobs = 6;
options.bytes_per_sync = 1048576;
options.compaction_pri = kMinOverlappingRatio;
table_options.block_size = 16 * 1024;
table_options.cache_index_and_filter_blocks = true;
table_options.pin_l0_filter_and_index_blocks_in_cache = true;
table_options.format_version = <the latest version>;

RocksDB 调优指南

RocksDB是灵活且高度可配置的。另一方面,RocksDB多年来提高了其自适应性。如果您在 SSD 上有正常的应用程序,我们不建议您对 RocksDB 进行微调。我们建议用户使用“设置选项”和“基本优化”,除非您看到明显的性能问题,否则无需对其进行优化。一方面,页面上建议的典型配置,甚至是现成的配置,通常适用于正常工作负载。另一方面,当工作负载或硬件发生变化时,微调的 RocksDB 实例通常容易出现更大的性能回归。用户通常需要不断调整 RocksDB 以保持性能水平。

数据库统计设计

统计信息 – 将其设置为 。您可以随时通过调用 获取人类可读的 RocksDB 统计信息。有关详细信息,请参阅统计信息。rocksdb::CreateDBStatistics()options.statistics.ToString()

压缩和数据库统计信息 – RocksDB 始终保留一些有关压缩和基本数据库运行状态的统计信息。这是查找 LSM 树形状并从那里估计读写性能的最简单方法。有关详细信息,请参阅压实统计信息和数据库状态

性能上下文和 IO 统计信息上下文 性能上下文和 IO 统计信息上下文可以帮助确定一个特定查询中的计数器。

性能瓶颈的可能性。

系统指标

有时,由于系统指标已饱和,性能会受到限制,并且症状有时是意外的。微调 RocksDB 的用户应该能够从操作系统查询系统指标,并确定特定系统指标是否具有高使用率。

磁盘写入带宽。通常,RocksDB 压缩会尝试写入比 SSD 驱动器所能承受的更多内容。症状可能是 RocksDB 的写入停止(请参阅压缩统计信息或统计信息 。或者,由于压缩积压和 LSM 树结构倾斜,它可能会导致读取速度变慢。读取查询的性能上下文有时会显示一次读取读取的 SST 文件过多。如果发生,请从调整压缩开始。StallsSTALL_MICROS
磁盘读取 IOPS。请注意,可以保证合理读取性能的持续读取 IOPS 通常远低于硬件规格。我们鼓励用户通过系统工具(例如 fio)测量他们想要使用的读取 IOPS,并再次检查系统指标。如果 IOPS 已饱和,请从检查压缩开始。还要尝试提高块缓存命中率。有时问题可能是由读取索引,过滤器或大型数据块引起的,并且有不同的处理方法。
中央处理器。CPU 通常是由读取路径引起的,但也可能是由压缩引起的。许多选项都可能产生影响,例如压实、压缩、布隆过滤器、块大小等。
空间。从技术上讲,这不是瓶颈。但是当系统指标不饱和时,性能足够好,我们已经将SSD空间填满了,我们说它受到空间的瓶颈。如果用户希望从主机提供更多数据,压缩和压缩是需要调整的主要领域。有关减少空间使用的指南,请参阅空间调整。

放大因子

我们还用于调整 RocksDB 压缩的术语是放大因子:写入放大、读取放大和空间放大。这些放大因素将用户的逻辑请求的大小与 RocksDB 对底层硬件发出的请求联系起来。有时在调整 RocksDB 时应该优化哪个因素是显而易见的,而有时则不清楚。无论哪种方式,压实都是改变三者之间权衡的关键。

写入放大是写入存储的字节与写入数据库的字节的比率。

例如,如果向数据库写入 10 MB/s,并且观察到磁盘写入速率为 30 MB/s,则写入放大为 3。如果写入放大率较高,则工作负载可能会成为磁盘吞吐量的瓶颈。例如,如果写入放大为 50,最大磁盘吞吐量为 500 MB/s,则数据库可以维持 10 MB/s 的写入速率。在这种情况下,降低写入放大将直接增加最大写入速率。

高写入放大也会缩短闪存寿命。有两种方法可以观察写入放大。首先是通读 的输出。第二种是将磁盘写入带宽(您可以使用)除以数据库写入速率。DB::GetProperty(“rocksdb.stats”, &stats)iostat

读取放大是每个查询的磁盘读取次数。如果您需要阅读 5 页来回答查询,则读取放大为 5。逻辑读取是从缓存(RocksDB 块缓存或操作系统文件系统缓存)获取数据的读取。物理读取由存储设备、闪存或磁盘处理。逻辑读取比物理读取便宜得多,但仍会产生 CPU 成本。您可能能够估计输出中的物理读取速率,但其中包括为查询和压缩完成的读取。iostat

空间放大是磁盘上数据库文件的大小与数据大小的比率。如果将 10MB 放入数据库,而它在磁盘上使用 100MB,则空间放大为 10。您通常需要对空间放大设置硬限制,以免磁盘空间或内存不足。有关减少空间放大的指南,请参阅空间调整。

要了解有关不同数据库算法背景下的三个放大因子的更多信息,

系统指标未饱和时速度缓慢

通常,系统指标不会饱和,但 RocksDB 仍然没有用户想要的那么快。这可能是由于不同的原因。下面是一些常见方案:

压实速度不够快有时SSD远未饱和,但压实仍然赶不上。RocksDB 压缩可能不会尝试最大化资源利用率,并且受配置的压缩并行性的限制。默认值通常较低,通常有改进的余地。请参阅并行度选项。
写入速度不够快虽然写入通常受到写入 I/O 的瓶颈,但在某些情况下,I/O 不够快,RocksDB 无法足够快地写入 WAL 和 memtable。用户可以尝试无序写入、手动 WAL 刷新和/或将相同的数据分片到多个数据库并并行写入它们。
需求更低的读取延迟有时没有什么问题,但用户只是希望读取延迟更低。首先通过性能上下文和 IO 统计信息上下文检查每个查询状态,以确定是 CPU 或 I/O 导致了时间,并相应地尝试选项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值