讲师中心 微信公众号
AI工具推荐 视频效率加速

SQL wal_buffers 与 checkpoint_segments 的 WAL 写性能组合调优

星杰小哥_3667

星杰小哥_3667

发布时间:2026-02-18 12:47:02

|

341人浏览过

|

来源于php中文网

原创

wal_buffers太小会导致WAL写放大,因高并发下频繁触发WALBufferWriteLock等待并提前刷出未满页,增加I/O次数;需与max_wal_size协同调优,避免单独调整引发新问题。

sql wal_buffers 与 checkpoint_segments 的 wal 写性能组合调优

wal_buffers 太小会导致 WAL 写放大

PostgreSQL 在事务提交时,会先把 WAL 日志写入内存缓冲区 wal_buffers,等刷盘或检查点触发时再批量落盘。如果这个值太小(比如默认的 16MB),高并发写入下容易频繁触发 WALBufferWriteLock 等待,甚至被迫提前刷出未满的页——这会把一次大块写拆成多次小写,显著增加 I/O 次数。

实操建议:

  • 对 OLTP 场景,wal_buffers 至少设为 shared_buffers 的 1/32,但不低于 16MB;若 shared_buffers 是 2GB,可设为 64MB
  • 不要盲目设到几百 MB:过大会占用大量共享内存,且不会加速单次刷盘,反而可能拖慢 checkpoint 时的同步开销
  • 修改后必须重启实例才生效(不是 reload)

checkpoint_segments 已被废弃,该看 max_wal_size

9.5 之后 checkpoint_segments 就没了,继续在配置里写它不会报错但完全无效。真正控制 WAL 文件生成节奏的是 max_wal_size 和 min_wal_size。它决定 PostgreSQL 在两次 checkpoint 之间最多允许积累多少 WAL 数据——设得太小,就会频繁触发 checkpoint,导致后台进程狂刷脏页 + WAL 落盘,CPU 和 I/O 双高。

实操建议:

  • 观察 pg_stat_bgwriter.checkpoints_timed 和 checkpoints_req:如果后者占比长期 > 10%,说明 max_wal_size 太小,WAL 积压逼迫系统“被动 checkpoint”
  • OLTP 场景下,max_wal_size 建议设为物理内存的 1%~2%,但不低于 1GB;例如 64GB 内存,可设为 2GB
  • min_wal_size 设为 max_wal_size 的 1/4~1/2 即可,避免空闲期 WAL 文件反复创建销毁

wal_buffers 和 max_wal_size 不是独立调优项

这两个参数实际是协同影响 WAL 写路径的吞吐与稳定性:wal_buffers 影响“写入端”的缓冲效率,max_wal_size 影响“刷盘端”的节奏和压力。单独调大一个,另一方没跟上,效果会打折扣甚至引发新问题。

常见错误现象:

  • 调大了 wal_buffers 却没调 max_wal_size → WAL 缓冲积压更快,checkpoint 更频繁,bgwriter 压力不降反升
  • 只调大 max_wal_size 但 wal_buffers 还是 16MB → 高并发下 WAL 写入锁争抢依旧严重,TPS 上不去
  • 两者都调大后没监控 pg_stat_replication 的 write_lag 和 flush_lag → 主从延迟悄然拉大,尤其在备库 I/O 较弱时

别忽略 wal_writer_delay 和 synchronous_commit

wal_buffers 和 max_wal_size 是骨架,但 WAL 写行为还受两个运行时机制调控:wal_writer_delay 控制 WAL writer 进程刷缓冲区的频率;synchronous_commit 决定事务是否必须等 WAL 落盘才返回成功。它们不改配置文件,却直接影响你看到的写延迟和吞吐。

实操建议:

  • wal_writer_delay 默认 200ms,对高吞吐写入可降到 50~100ms,减少缓冲区堆积;但太低(如 10ms)会让 writer 进程 CPU 占用飙升
  • 若业务能容忍短时间主从不一致,把 synchronous_commit = off 可大幅降低单事务延迟,但要注意崩溃可能丢失最多 1 个 WAL segment 的数据
  • 调整这两项无需重启,SET LOCAL 或修改 postgresql.conf 后 pg_reload_conf() 即可

最常被忽略的是:wal_buffers 大小会影响每个 WAL record 的对齐方式,而某些 SSD 对非对齐写特别敏感;max_wal_size 设置不当会直接让 checkpoint 成为 I/O 瓶颈。调参前务必用 pg_stat_bgwriter 和 pg_stat_database 看真实 WAL 生成速率和 checkpoint 频率,而不是凭经验拍脑袋。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4563

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

951

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1189

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6521

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3303

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6500

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8901

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1210

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn