LWLock: WALInsert
等待将 WAL 数据插入内存 buffer。
PostgreSQL 等待事件档案
类别LWLock
事件
WALInsert
版本PG 13-18
证据3 个源码位置
官方描述译文
等待将 WAL 数据插入内存 buffer。
| PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 |
|---|---|---|---|---|---|
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
触发机制
后端在共享 WAL 缓冲区中预留空间并复制 WAL 记录时,必须持有一个 WAL insertion lock。并发 WAL 生产者很多、插入临界区变长时,会在此排队。
正常还是麻烦?
- 正常: 并发写入与提交突发期间的瞬时等待很正常。
- 需要调查: 前台会话反复堆积说明 WAL 插入已成为串行点,常伴随极高写并发、全页镜像或缓冲区换页过慢。
诊断 SQL
正在等待 LWLock/WALInsert 的会话
当前 LWLock 等待分布
这些会话的锁与关系上下文
处置建议
- 按 WAL 生成量与调用频率排序语句。
- 检查检查点/全页镜像时机与并发写会话数量。
- 批量合并微小写入、减少无效索引抖动,并处理 WAL 写延迟。
源码证据
- PostgreSQL 18.6 · src/backend/access/transam/xlog.c:1399 —
WALInsert - PostgreSQL 18.6 · src/backend/storage/lmgr/lwlock.c:739 —
pgstat_report_wait_start - PostgreSQL 18.6 · src/backend/utils/activity/wait_event_names.txt:372 —
WALInsert
关联控制项与信号
- GUC: [guc:wal_buffers] · [guc:full_page_writes] · [guc:checkpoint_timeout]
- 指标: [metric:waiting_sessions] · [metric:wait_event_share] · [metric:wal_bytes] · [metric:wal_fpi] · [metric:statement_wal_bytes]
典型事故模式
扇出任务在检查点后立即发起大量单行提交,全页镜像与写并发共同让 WAL 插入成为瓶颈。