【WiredTiger 内核】Eviction:脏页必须先 reconcile

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

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真正降下来。

🏷️

标签

➡️

继续阅读