增量检查点的“困“与“难“
本文整理于 HOW 2026 演讲内容演讲者吕海波易景科技首席研究员PG ACED北京大学企业导师。一、增量检查点的引入背景在基于PostgreSQL开发共享存储集群架构类似Oracle RAC的过程中一个现实问题浮出水面完全沿用PG原有的全量检查点机制时各节点间脏页会持续累积导致压力测试下的性能表现始终上不去。为了解决这个问题我们引入了增量检查点。增量检查点的核心思想并不复杂增加一个位于共享内存中的检查点队列ckptq按脏块变脏的顺序排列所有脏块然后以高频次、小批量的方式沿队列定期刷新脏页。相比全量检查点一次性遍历所有脏页这种方式理论上能更平滑地控制I/O负载。但真正落地实现时有两个关键问题比预想中棘手一是ckptq共享内存锁的管理机制二是增量检查点与FPW全页写之间的耦合关系。下文逐一展开。二、ckptq共享内存锁管理自旋锁竞争的隐藏成本ckptq放在共享内存中多进程并发连接脏块必然涉及锁管理。我们最初采用的是PG自带的SpinLock自旋锁但在高竞争场景下暴露出严重的性能问题。2.1 自旋锁的本质自旋锁本质上就是一个内存变量——1字节、2字节、4字节或8字节。进程A持有锁时把值从0改成1进程B发现值不为0就不停地循环检查直到值变回0。这种忙等待的目的是不让出CPU避免上下文切换和Cache污染。问题在于当多个进程同时竞争同一把自旋锁时后果远不止是CPU空转。2.2 CPU核间通信风暴假设16个核Core 0持有锁另外15个核在同时自旋等待。当Core 0要释放锁将1改为0时会发生以下连锁反应Core 0需要向其他15个核广播Invalidate消息通知它们自己L1/L2 Cache中该锁变量的副本已失效等待所有核确认后Core 0才能将变量修改为015个等待的核立即向Core 0发送Write Update消息请求获取最新的变量值CPU内部仲裁后某个核如Core 9获得修改权限再向其他15个核广播Write Invalidate消息待全部确认后Core 9将变量改为1持有锁一轮锁释放与重新获取涉及数十次核间消息广播。在16核规模下尚且如此当代CPU动辄几十乃至上百核这种开销会急剧放大。一轮轮消息同步足以让i9的性能退化到386水平。这就是所谓的锁风暴——热点竞争造成的阻塞被核间通信延迟进一步加剧。这个问题并非增量检查点独有。PG中所有使用自旋锁的地方一旦产生竞争都可能触发同样的核间通信风暴造成性能抖动。2.3 改进思路解决方案的灵感其实来自于CPU自身的缓存一致性协议和RAC的缓存融合机制。核心思路很简单为每个核分配独立的锁变量自旋时每个核只轮询自己的变量互不干扰因此无需广播消息。释放锁时持有者只需要向获得锁的目标核的私有变量发送一次修改消息完成所有权转移。这从O(n²)量级的核间通信降到了O(1)。相关学术研究可参考论文《Non-scalable locks are dangerous》——传统自旋锁在大规模多核系统中的可扩展性问题早有定论只是实践中容易被忽视。三、增量检查点与FPW页分裂问题的实测对比在PG中完全检查点和FPW是强绑定的。引入增量检查点后完全检查点的频率被大幅拉长这会对FPW保护页分裂的能力产生什么影响要回答这个问题得先搞清楚FPW到底在解决什么问题以及其他数据库是如何处理的。3.1 什么是页分裂Partial Write数据库的页如PG的8KB在操作系统层面通常由多个OS页如4KB组成。当数据库发起一个8KB的写操作时在存储层实际上是两次4KB写入。如果写入中途断电或系统崩溃可能出现前4KB写入成功、后4KB未写入的情况——这个数据库页就变成了一半新一半旧的损坏状态这就是页分裂。3.2 如何模拟页分裂长期以来页分裂问题难以验证因为真实场景下除了拔电源几乎无法复现。但通过eBPF/systemtap等内核动态跟踪工具可以拦截pwrite系统调用将写入长度参数从8KB篡改为4KB操作系统就会乖乖地只写一半——完美模拟页分裂且完全排除其他干扰因素。我们分别对Oracle、PostgreSQL和MySQL执行了相同的测试。3.3 Oracle软件层面不处理拦截pwrite后Oracle在检查点刷脏时检测到I/O错误直接崩溃。重启后开始实例恢复定位到检查点位置识别出需要恢复的脏块——然后恢复失败。测试结论很明确Oracle在软件层面并不解决页分裂问题。它既不依赖文件系统的原子写也不在代码中做特殊处理。Oracle的策略是检测到损坏后依赖备份进行介质恢复并提供了BlockRecover工具用于单块恢复。将问题转移给运维本身就是一种选择。3.4 PostgreSQL彻底解决同样流程下PG在I/O错误后并没有崩溃仅报告错误。我们用kill -9杀掉所有进程模拟意外宕机重启后PG从控制文件中读取检查点位置应用对应的WAL日志——数据完整恢复无一丢失。PG通过FPW机制在第一次修改脏页时将整个页写入WAL确保即使发生页分裂也能通过日志完整重做。代价是明显的I/O放大但换来了数据一致性的确定性。3.5 MySQLInnoDB双写的局限MySQL InnoDB使用双写机制先将页写入双写缓冲区再写入实际数据文件。测试发现如果只拦截目标表文件的写入双写可以恢复但如果拦截系统表空间如undo表空间的写入数据库启动报错无法恢复结论是双写解决了部分场景下的页分裂问题但在系统表空间受损时无能为力。在真实的断电系统表空间写入被截断场景下双写并不能保证数据库一定能起来。3.6 三库对比小结数据库方案是否真正解决页分裂Oracle依赖备份与块恢复软件层不解决MySQLDouble Write部分解决系统表空间损坏时失效PostgreSQLFull Page Write彻底解决有性能代价三个主流数据库中只有PG以性能为代价真正从软件层面解决了页分裂问题。Oracle将问题推给硬件/运维MySQL的双写在关键路径上存在盲区。回到TC架构的实际情况底层自研共享存储支持原子写因此在TC中FPW可以关闭。但如果用户没有原子写存储FPW真的是可有可无的吗这个问题没有一个标准答案有兴趣的同学不妨按照本次分享中的步骤实际模拟下页分裂深入体会下底层原理再做定论。活动播报适逢 PostgreSQL 三十周年PGConf.Asia 2026 香港站定于 11 月 17–18 日举办大会面向全球征集 PG 实战技术分享并开放商业赞助合作演讲提案征集 8 月 31 日截止。更多资讯请点击https://mp.weixin.qq.com/s/SQncqrtvUO0IZNQg_pFtYA

相关新闻

从上往下打印二叉树--剑指offer21(java实现)

从上往下打印二叉树--剑指offer21(java实现)

题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 解题思路 用两个ArrayList来实现队列的功能,当一个元素出栈时,就需要将该元素的左右子树入栈,每次出栈则将元素放到list中,最后返回 源码 import jav…

2026/7/28 15:43:38阅读更多 →
Dify OpenAI-Compatible 插件报 model_not_found:校准 Base URL 与模型 ID

Dify OpenAI-Compatible 插件报 model_not_found:校准 Base URL 与模型 ID

Dify 的 OpenAI-API-compatible 插件可以给兼容 OpenAI 接口的服务手动添加模型。真正容易出错的不是 Key,而是界面 Model Name 与 API endpoint 中的模型名称 没有对齐,保存或验证时就返回 model_not_found。 适用环境:Dify 官方 openai_ap…

2026/7/28 15:43:38阅读更多 →
Python阶乘计算:递归与迭代实现及优化技巧

Python阶乘计算:递归与迭代实现及优化技巧

1. 阶乘计算的基础概念 第一次接触阶乘这个概念是在大学离散数学课上。老师用粉笔在黑板上写下"5!"这个符号时,全班同学都露出了困惑的表情。阶乘(factorial)是数学中一个看似简单却蕴含深意的运算,它表示从1到该数所有正整数的乘积。比如5! …

2026/7/28 15:43:38阅读更多 →
Loop Engineering 落幕,Graph Engineering 崛起,生产级AI Agent的范式重构与落地真相

Loop Engineering 落幕,Graph Engineering 崛起,生产级AI Agent的范式重构与落地真相

做过大模型Agent落地的开发者,大概率都踩过同一个深坑,本地demo跑起来丝滑流畅,逻辑通顺、响应灵敏,可一旦部署到线上生产环境,立刻漏洞百出。要么模型陷入无意义的循环调用,几万Token凭空消耗却没有任何任…

2026/7/28 19:20:17阅读更多 →
如何用Escrcpy实现Android设备无线投屏的终极指南

如何用Escrcpy实现Android设备无线投屏的终极指南

如何用Escrcpy实现Android设备无线投屏的终极指南 【免费下载链接】escrcpy 优雅而强大的跨平台 Android 设备控制工具,基于 Scrcpy 的 Electron 应用,支持无线连接和多设备管理,让您的电脑成为 Android 的完美伴侣。 项目地址: https://gitcode.com/viarotel-org…

2026/7/28 19:20:17阅读更多 →
计算机毕业设计之“木成林”学生互助平台的设计与实现

计算机毕业设计之“木成林”学生互助平台的设计与实现

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括“木成林”学生互助平台的网络应用,在外国“木成林”学生互助已经是很普遍的方式,不过国内的“木成林”学生互助可能还处于起步阶段。“木成林”学生互…

2026/7/28 19:20:17阅读更多 →
gRPC接口自动化测试:从Protobuf契约到智能用例生成的工程实践

gRPC接口自动化测试:从Protobuf契约到智能用例生成的工程实践

1. 项目概述:从协议定义到自动化验证的闭环在微服务架构成为主流的今天,gRPC凭借其高性能、跨语言和强类型契约的优势,几乎成了服务间通信的事实标准。但随之而来的测试挑战也日益凸显:面对一堆.proto文件,测试同学如何…

2026/7/28 19:20:17阅读更多 →
计算机毕业设计之“力炫”健身馆网站

计算机毕业设计之“力炫”健身馆网站

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了“…

2026/7/28 19:20:17阅读更多 →
了解状态机图

了解状态机图

从第一次认识到状态机这个概念,程序设计似乎就从未离开过它,通过广大网友的技术分享,本文对状态机再做一次总结。了解什么是状态机图,它的使用场景是什么?一、什么是状态机?做产品的时候,我们总…

2026/7/28 19:18:16阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →