增量检查点的“困“与“难“
本文整理于 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:40 阅读更多 →
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:40 阅读更多 →
Python阶乘计算:递归与迭代实现及优化技巧

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

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

2026/7/28 15:43:40 阅读更多 →

最新新闻

MATLAB实现牛头刨床运动学仿真与急回特性分析

MATLAB实现牛头刨床运动学仿真与急回特性分析

1. 项目概述:当机械原理遇上动态可视化 每次在机械设计课上讲到牛头刨床,学生们盯着静态结构图发呆的样子总让我想起自己当年学机械原理的困惑——那些复杂的连杆曲线和急回特性,光靠公式和二维图纸确实难以形成直观理解。三年前我开始尝试用…

2026/7/28 15:50:43 阅读更多 →
django定制后台

django定制后台

后台数据库显示 对应app下的admin.py from django.contrib import admin from article_app.models import Article # 引入数据模型引入APP的文章数据库,但是要具体定制就不用在这引入 #admin.site.register(Article)后台登录进去的标题 admin.site.site_header 三门…

2026/7/28 15:50:43 阅读更多 →
TPIC7710EVM评估模块:汽车电子EPB系统ASIC驱动芯片一站式开发指南

TPIC7710EVM评估模块:汽车电子EPB系统ASIC驱动芯片一站式开发指南

1. 项目概述与核心价值 如果你是一名汽车电子工程师,正在为新一代电子驻车制动(EPB)系统选型核心驱动芯片,或者你是一位嵌入式系统开发者,需要评估一款复杂的汽车级ASIC(专用集成电路)的驱动与控…

2026/7/28 15:50:43 阅读更多 →
JWT安全攻防实战:从算法混淆到逻辑漏洞的深度解析

JWT安全攻防实战:从算法混淆到逻辑漏洞的深度解析

1. 从靶场到实战:为什么JWT安全是Web安全工程师的必修课 如果你正在学习Web安全,或者已经是一名渗透测试工程师,那么“JWT”这个词你一定不陌生。它频繁出现在现代Web应用的登录认证流程里,也同样是CTF比赛和渗透测试中的“常客”…

2026/7/28 15:50:43 阅读更多 →
AI Agent与编程助手:Agent-Reach与Xcode集成Gemini实践指南

AI Agent与编程助手:Agent-Reach与Xcode集成Gemini实践指南

这次我们来看两个在开发者社区引起关注的技术动向:一个是名为 Agent-Reach 的开源项目,它旨在让 AI 具备“阅读”全网信息的能力;另一个是开发者们热议的,如何将 Google 的 Gemini 模型集成到苹果的 Xcode 开发环境中,…

2026/7/28 15:50:43 阅读更多 →
从图形化编程到Python海龟绘图:四色旋转方块阵实战解析

从图形化编程到Python海龟绘图:四色旋转方块阵实战解析

1. 项目概述:当图形化编程遇上Python海龟如果你接触过图形化编程,比如Scratch或者Mind,那你一定对拖拽积木、控制角色移动、绘制图案这些操作不陌生。它们直观、有趣,是很多编程启蒙课程的首选。但当我们想画一个更复杂、更炫酷的…

2026/7/28 15:49:42 阅读更多 →

日新闻

告别臃肿!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:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

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

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

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

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

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

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻