??Write buffer mnager幫助開(kāi)發(fā)者管理列族或者DB instance的內(nèi)存表的內(nèi)存使用。
- 管理內(nèi)存表的內(nèi)存占用在閾值內(nèi)
- 內(nèi)存表的內(nèi)存占用轉(zhuǎn)移到block cache
??Write buffer manager與rate_limiter和sst_file_manager類似。用戶創(chuàng)建一個(gè)write buffer manager對(duì)象,傳入 column family或者DBs的配置中。可以參考write_buffer_manager.h的注釋部分來(lái)學(xué)習(xí)如何使用。
Limit total memory of memtables
??在創(chuàng)建write buffer manager對(duì)象時(shí),內(nèi)存限制的閾值就已經(jīng)確定好了。RocksDB會(huì)按照這個(gè)閾值去管理整體的內(nèi)存占用。
??在5.6或者更高版本中,如果整體內(nèi)存表使用超過(guò)了閾值的90%,就會(huì)觸發(fā)正在寫(xiě)入的某一個(gè)column family的數(shù)據(jù)執(zhí)行flush動(dòng)作。如果DB instance實(shí)際內(nèi)存占用超過(guò)了閾值,即使全部的內(nèi)存表占用低于90%,那也會(huì)觸發(fā)更加激進(jìn)的flush動(dòng)作。在5.6版本以前,只有在內(nèi)存表內(nèi)存占用的total超過(guò)閾值時(shí)才會(huì)觸發(fā)flush。
??在5.6版本及更新版本中,內(nèi)存是按照arena分配的total內(nèi)存計(jì)數(shù)的,即使這些內(nèi)存不是被內(nèi)存表使用。在5.6之前版本中,內(nèi)存使用是按照內(nèi)存表實(shí)際使用的內(nèi)存
Cost memory used in memtable to block cache
??從5.6版本之后,用戶可以將內(nèi)存表的內(nèi)存使用的占用轉(zhuǎn)移到block cache。不管是否打開(kāi)內(nèi)存表的內(nèi)存占用,都可以這樣操作。
??大部分情況下,block cache中實(shí)際使用的blocks遠(yuǎn)比block cache中的數(shù)據(jù)少很多,所以如果用戶打開(kāi)了這個(gè)feature后,block cache的容量會(huì)覆蓋掉block cache和內(nèi)存表的內(nèi)存占用。如果用戶打開(kāi)了cache_index_and_filter_blocks的話,這三種內(nèi)存占用都在block cache中。
??具體實(shí)現(xiàn)如下,針對(duì)內(nèi)存表分配的每一個(gè)1M內(nèi)存,WriteBufferManager都會(huì)在block cache中put一個(gè)dummy 1M的entry,這樣block cache就可以正確的計(jì)算內(nèi)部占用,而且可以在需要時(shí)淘汰掉一些block以便騰出內(nèi)存空間。如果內(nèi)存表的內(nèi)存占用降低了,WriteBufferManager也不會(huì)立馬三除掉dummmy blocks,而是在后續(xù)慢慢地釋放掉。這是因?yàn)閮?nèi)存表空間占用的up and down太正常不過(guò)了,RocksDB不需要對(duì)此太過(guò)敏感。
- 把使用的block cache傳遞給WriteBufferManager
- 把WriteBufferManager的參數(shù)傳入RocksDB內(nèi)存表占用的最大內(nèi)存
- 把block cache的容量設(shè)置為 data blocks和memtables的內(nèi)存占用總和