跳转至

写缓冲管理器帮助用户控制多个列族及 DB 实例中的 memtables 的总的内存使用。通过这个,用户可以实现:

  • 尝试限制多个列族和 DB 实例总的 memtable 使用量到一定的阈值下。
  • 允许 memtable 使用块缓存

写缓冲管理器跟 rate_limiter 和 sst_file_manager 很相似。用户创建一个写缓冲管理器对象,然后把他传递给所有你希望控制总内存空间的列族和 DB。参考 write_buffer_manager.h 中的注释来了解如何使用。

限制 memtalbe 的总内存

一个内存显示量会在创建写缓冲管理器的时候被给出。RocksDB 会尝试把总内存使用量控制在这个限制之下。

在 5.6 以及更高的版本,当你在导入数据的时候,如果总的可变 memtable 的大小超过限制的 90%,对应列族的 DB 会触发一次落盘。如果实际的内存已经超过限制,即使总的可变 memtable 大小少于限制的 90%,也会触发一次激进的落盘操作。在 5.6 版本之前,如果总的可变 memtable 超过限制,触发一次落盘。

在 5.6 以及更高的版本,所有在同一个管理器分配的内存都被计算入内,即使这些内存不是被 memtable 使用。在更早的版本,内存的计算是按照 memtable 实际使用的量来计算的。

允许 memtable 使用块缓存

从 5.6 版本之后,用户可以配置 RocksDB 来消费 memtable 使用的内存,给块缓存使用。这个不管是否打开 memtable 内存限制,都会发生。

在大多数情况下,块缓存中实际使用的块,与块缓存中的数据块比起来,只是非常小的一个比例,所以当用户打开这个功能,块缓存容量会同时被块缓存和 memtable 使用。如果用户同时还打开了 cache_index_and_filter_blocks,那么 RocksDB 中三个主要的内存使用都会被一个容量覆盖。

这里解释它是怎么实现的。没分配给 memtable 1MB 的内存,WriteBufferManager 会放一个假的 1MB 项到块缓存,这样块缓存就可以正确地追踪实际使用的大小,然后淘汰块来获取必要的空间。对于 memtable 缩减的时候使用的空间,WriteBufferManager 不会立即删除假的缓存块,他会在内存使用量显著下降的时候,缓慢地移除他们。这是因为 memtable 的内存使用总是在浮动的,我们不希望经常去打扰块缓存。

打开这个功能的方法:

  • 把你希望使用的块缓存传递给你即将使用的 WriteBufferManager。
  • 还是要把你希望 memtable 使用的最大内存传递给 WriteBufferManager。
  • 把数据块缓存和 memtable 内存的总大小,设置为块缓存的容量