【WiredTiger 内核】Reconciliation:内存页到 on-disk image
内容提要
WiredTiger的reconciliation将内存页转为磁盘格式,触发于脏页驱逐和检查点。用户表保留最新已提交更新,旧版本写入History Store。行存储叶页按序遍历,依leaf_page_max和split_pct分裂为多页镜像。History Store页reconcile时移除全局可见墓碑。Eviction为腾缓存,Checkpoint为一致快照,两者分工明确。
延伸解读
分裂阈值与磁盘页大小
reconcile 时,内存页内容按序拷入缓冲,当填充量达到 leaf_page_max 与 split_pct 的乘积时,记录分裂点并切出一页镜像。若内容不足一页则只写一页。split_pct 决定了磁盘页的填充率,影响空间利用率和后续读取的局部性。理解这一机制有助于调优页大小相关参数,但具体数值需结合工作负载实测。
用户表与 History Store 的分工
reconcile 用户表脏页时,只保留最新已提交更新在用户页镜像,更旧但未过时的版本写入 History Store。这保证了用户表页面的精简,同时通过 HS 保留历史版本以支持 MVCC 和回滚。prepared 更新在 evict 时写在用户表页上,HS 不含 prepared 更新,提交或回滚后再调整 HS 条目。
Eviction 与 Checkpoint 的差异
Eviction 和 Checkpoint 都会触发 reconcile,但目的不同:Eviction 为腾出缓存空间,可能写用户表和 HS;Checkpoint 为生成一致快照,按用户表→HS→元数据顺序 reconcile,且可跳过已被 eviction 写干净的页。理解二者差异有助于分析缓存压力和持久化行为。
Q&A
WiredTiger中reconciliation是什么?
Reconciliation是将内存页转换为磁盘格式(on-disk format)的一组页镜像的过程。它主要触发于脏页驱逐(eviction)和检查点(checkpoint),目的是将内存中的脏页写成可持久化、可驱逐的形态。
WiredTiger中reconciliation的触发条件有哪些?
Reconciliation主要由两个场景触发:一是脏页驱逐(dirty eviction),用于腾出缓存空间,将脏页写入存储后释放内存;二是检查点(checkpoint),用于生成一致性的快照,将脏页reconcile成干净的页版本。此外,还有其他内部路径,具体取决于版本和源码调用点。
WiredTiger在reconcile用户表时如何处理更新链?
在reconcile用户表的脏页时,WiredTiger会检查更新链(update chain),选出最新已提交的更新作为磁盘上的值,而更旧的未过时更新则写入History Store。例如,链上U1@70→U2@80→U3@90→U4@100(均已提交)时,用户页保留U4,U1–U3进入History Store,且U1的stop等于U2的start。
WiredTiger中row-store leaf页的reconcile是如何遍历和分裂的?
Row-store leaf页的reconcile会创建一个缓冲,按顺序遍历内存页中的内容,包括读盘时的WT_ROW数组、insert list和update list。遍历时先看insert list头部,再交替处理盘上键值及其更新与下一条insert。当缓冲内容超过leaf_page_max * split_pct时,会记录split boundary,并在该处切出一页镜像,剩余内容继续按split_pct切分,直到所有键值处理完毕。
WiredTiger中History Store页的reconcile有什么特殊之处?
History Store页的reconcile会生成去掉全局可见墓碑(globally visible tombstone)后的新镜像,只保留oldest reader或application oldest timestamp仍需要的历史。这是History Store文件收缩的机制入口之一,与checkpoint删除只含全局可见墓碑的页相衔接。
WiredTiger中reconciliation与eviction和checkpoint的分工是什么?
Eviction路径中,reconcile为离开缓存服务,脏路径会写用户表并可能写History Store;Checkpoint路径中,reconcile为一致持久化点服务,遍历脏页并reconcile,先用户表后History Store(因为用户表reconcile会向History Store追加写)。Checkpoint对eviction已提前写干净的页可以跳过,即使该写出更新对checkpoint事务未必可见。