IO

RocksDB为用户提供了一个选项列表,以提示应该如何执行I/Os。

控制的I/O写

Range Sync

RocksDB的数据文件通常以附加方式生成。文件系统可以选择缓冲写,直到脏页达到阈值并将所有这些页一起写出来。 这可能会导致大量的写I/O,并导致在线I/Os等待太长时间,导致长时间的查询延迟。 相反,您可以要求RocksDB定期通过设置选项提示OS写出未完成的脏页面。 用于SST文件和选项的bytes_per_sync。wal_bytes_per_sync for WAL文件。 在底层,每当为这样的大小追加一个文件时,它都会在Linux上调用sync_file_range()。 最近的页面不包括在范围同步中。

Rate Limiter

您可以通过选项控制RocksDB写入数据文件的总速率。 rate_limiter,以便为在线查询预留足够的I/O带宽。 有关详细信息,请参见速率限制器 (https://github.com/facebook/rocksdb/wiki/Rate-Limiter)。

Write Max Buffer

当附加一个文件时,除非需要显式的fsync,否则RocksDB在写入文件系统之前会对文件进行内部缓冲。 这个缓冲区的最大大小可以由options.writable_file_max_buffer_size控制。 在[[Direct IO]模式下或对于没有页面缓存的文件系统,调优该参数更为关键。 对于非直接I/O模式,增大这个缓冲区只会减少write()系统调用的数量,而且不太可能更改I/O行为,因此,除非您希望这样做,否则最好将默认值保持为0以保存内存。

File Deletion

通过配置删除调度程序,可以限制删除过时DB文件的速度。这在flash设备上特别有用,可以限制由于大量删除而导致的读取延迟峰值。有关详细信息,请参见删除调度程序 (https://github.com/facebook/rocksdb/wiki/Delete-Scheduler)。

控制I/O读

fadvise

当打开一个SST文件进行读取时,用户可以通过设置选项来决定RocksDB是否会使用FADV_RANDOM调用fadvise。 advise_random_on_open = true(默认)。如果该值为false,则在打开文件时不会调用fadvise。 如果主要查询是Get()或迭代一个非常短的范围,那么将该选项设置为true通常会很好,因为在这些情况下提前读取是没有帮助的。 否则,选择。advise_random_on_open = false通常可以改进性能,提示文件系统执行底层读取。

不幸的是,对于混合工作负载没有很好的设置。有一个正在进行的项目可以解决这个问题,方法是在RocksDB中对迭代器进行预读。

Compaction inputs

压缩输入是特殊的。它们是长时间的顺序读取,因此应用与用户读取相同的fadvise提示通常不是最优的。 此外,通常情况下,压缩输入文件通常很快就会被删除,尽管没有保证。RocksDB提供了多种处理方法:

fadvise hint

RocksDB将根据options.access_hint_on_compaction_start调用fadvise到任何压缩输入文件。这可以覆盖fadvise随机设置,因为选择一个文件作为压缩输入。

Use a different file descriptor for compaction inputs

如果options.new_table_reader_for_compaction_input = true, RocksDB将对压缩输入使用不同的文件描述符。这可以避免常规数据文件的fadvise设置和压缩输入的混合。 该设置的限制是,RocksDB不仅创建一个新的文件描述符,而且再次读取索引、过滤器和其他元块并将它们存储在内存中,因此它需要额外的I/O并使用更多的内存。

readahead for compaction inputs

如果它不是0,您可以按照options.compaction_readahead_size执行它自己的readahead。 如果设置了该选项,options.new_table_reader_for_compaction_input将自动切换为true。 该设置允许用户保留options.access_hint_on_compaction_start为NONE。

直接I/O

不需要通过上面显示的文件系统提示来控制I/O,您可以在RocksDB中启用direct I/O,从而允许RocksDB使用选项usedirect_reads 和/或 use_direct_io_for_flush_and紧凑化来直接控制I/O。 如果启用了直接I/O,上面介绍的部分或全部选项将不适用。详情请参阅直接输入输出。(https://github.com/facebook/rocksdb/wiki/Direct-IO)

内存映射

options.allow_mmap_reads和options.allow_mmap_writes 使RocksDB mmap在执行读或写操作时能够将整个数据文件映射为一个整体。 这种方法的好处是减少了执行pread()和write()的文件系统调用,在许多情况下,还减少了内存复制。 如果数据库运行在ramfs上,options.allow_mmap_reads通常可以显著提高性能。它们也可以用于由块设备支持的文件系统。 然而,根据我们以前的经验,文件系统通常不能很好地维护这种内存映射,有时会导致查询速度很慢。 在这种情况下,我们建议您仅在必要时谨慎地尝试此选项。