【WiredTiger 内核】Eviction:脏页必须先 reconcile
内容提要
WiredTiger的Eviction机制通过server线程近似LRU选页,worker线程执行驱逐,区分clean(直接释放)和dirty(需reconcile,最新值进用户表,旧版进History Store)。配置target/trigger控制后台或应用线程参与驱逐,dirty超限时应用线程被迫协助。Eviction也是checkpoint前置减压阀,HS页同样参与驱逐。
延伸解读
脏页驱逐的代价
脏页不能直接释放,必须经过reconcile:最新值写入用户表,旧版本进入History Store。这意味着驱逐不只是内存管理,还涉及磁盘写入和HS增长。调大cache或放宽dirty_trigger只能推迟矛盾,不能消除reconcile的成本。更新密集时,应用线程可能被迫参与驱逐,导致延迟尖刺。
应用线程参与驱逐的触发条件
当cache用量超过eviction_trigger,或dirty比例超过eviction_dirty_trigger,或updates字节量超过eviction_updates_trigger时,应用线程在继续读写前会被要求先完成部分驱逐工作。这是正确性/稳定性机制,不是可选优化。若出现延迟尖刺,应检查dirty比例和eviction统计,而非单纯增加cacheSizeGB。
Eviction与Checkpoint的协作
Checkpoint开始前会先借eviction把dirty压到目标比例,以利用多线程eviction缩短checkpoint临界区。因此eviction不只是内存满时的后台GC,也是checkpoint的前置减压阀。理解这一衔接有助于把握WiredTiger在持久化与内存管理之间的平衡。
Q&A
WiredTiger的Eviction机制中,脏页(dirty page)被驱逐时会发生什么?
脏页被驱逐时必须先进行reconciliation:丢弃过时内容,最新值写入用户表(data store),更旧的值写入History Store。
WiredTiger的Eviction server和worker线程分别负责什么?
Eviction server遍历各树,按近似LRU排序选择候选页并推入队列;worker线程从队列取页并执行驱逐。也可以配置为只有server,此时server自己找页并驱逐。
WiredTiger中eviction_target和eviction_trigger有什么区别?
eviction_target是总体cache用量目标,达到后worker积极驱逐;eviction_trigger是总体用量触发线,达到后应用线程开始参与驱逐。target必须低于trigger。
在什么情况下应用线程会被迫参与WiredTiger的驱逐工作?
当cache用量超过eviction_trigger,或dirty占比超过eviction_dirty_trigger,或updates字节量超过eviction_updates_trigger时,应用线程在继续读写前会被要求先完成部分驱逐工作。
WiredTiger的Eviction与Checkpoint有什么关系?
Eviction是Checkpoint的前置减压阀:在checkpoint事务开始前,会先借eviction把dirty压到目标比例,以利用多线程eviction缩短checkpoint临界区。
WiredTiger中History Store的页面是如何被驱逐的?
History Store自身的页也占用cache并参与驱逐。用户表dirty eviction时reconcile可能写入HS,增加HS脏页;HS页随后也需被reconcile/evict,才能让cache真正降下来。