rocksdb原理_手摸手学习 RocksDB 的 Write Buffer Manager
本文翻譯自 RocksDB 官方 Wiki《Write Buffer Manager》:
https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager
翻譯者:fanrui
Write buffer manager 幫助用戶控制多個 column family 和 DB 實例的 MemTable 內存消耗。通過 Write Buffer Manager,用戶可以實現:
Write buffer manager 的使用與 rate_limiter 和 sst_file_manager 類似。用戶可以創建一個 write buffer manager 對象,并將其傳遞給你希望由該對象控制 MemTable 大小的 Column Family 或 DB 選項。看?write_buffer_manager.h?的代碼注釋可以看到如何使用。
限制 MemTable 的總內存
創建 write buffer manager 對象時可以給出內存限制。RocksDB 將會盡量控制總的使用內存在限制以下。
在 5.6 及其之后的版本,如果可變的 MemTable 的總大小超過了內存限制的 90%,那么 RocksDB 的相應 Column Family 就會觸發 flush。如果實際的內存使用超過了限制,即使可變的 MemTable 使用的內存低于 90%,也會非常積極地觸發 flush。在 5.6 版本之前,如果可變的 MemTable 大小超過了限制,則會觸發 flush。
在 5.6 及其之后的版本,所有被 write buffer manager 管理的內存都會被計算在內,不僅僅是 MemTable 的內存使用。5.6 之前的版本,內存的計算僅僅按照 MemTable 的實際使用來計算的。
MemTable 使用 Block Cache 的內存
從 5.6 版本之后,用戶可以配置 MemTable 使用 Block Cache 的內存。這個配置不管是否開啟了 MemTable 內存的限制。
大多數情況,Block Cache 中 MemTable 相比 data block 僅僅占比較小的比例。所以當用戶開啟這個功能,Block Cache 的容量將會包含所有 Block Cache 和 MemTable 的內存使用。如果用戶啟用?cache_index_and_filter_blocks,那么 RocksDB 中三個主要的內存使用都會被單個上限進行限制。
下面是實現原理:每次分配給 MemTable 1MB 的內存,WriteBufferManager 將會放 1MB 的虛擬項到 Block Cache 中,這樣 Block Cache 就可以知道實際的使用大小,從而淘汰 Block 來獲取內存空間。對于 MemTable 內存使用減少的情況,WriteBufferManager 并不會立即刪除這些虛擬項,而是在內存使用量顯著降低時再緩慢地刪除這些虛擬項。這是因為 MemTable 的內存總是在自然地上下浮動,因此我們嘗試減少對 Block Cache 的干擾。
通過以下方式開啟這個功能:
- 將 Block Cache 傳遞給即將使用的 WriteBufferManager
- 將 MemTable 期望使用的最大內存傳遞給 WriteBufferManager
- 設置 Block Cache 的容量為 data block 緩存和 MemTable 的總大小
總結
以上是生活随笔為你收集整理的rocksdb原理_手摸手学习 RocksDB 的 Write Buffer Manager的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下的工具链 树莓派_7.
- 下一篇: integer加1_AP双语数学常用的术