在PostgreSQL的运维监控场景中,检查点(Checkpoint)的执行频率和效率直接影响数据库的写入性能和稳定性,pg_stat_bgwriter系统视图记录了后台写入进程(Background Writer)以及检查点的所有核心运行统计信息,postgres_exporter作为Prometheus生态中常用的PostgreSQL指标导出工具,可以高效采集这些检查点统计数据用于后续监控分析。

pg_stat_bgwriter检查点相关核心字段说明
pg_stat_bgwriter视图中包含多个与检查点直接相关的统计字段,采集前需要先明确这些字段的实际含义,避免采集到无效数据:
- checkpoints_timed:由checkpoint_timeout参数触发的时间驱动检查点总次数
- checkpoints_req:由外部请求(如执行CHECKPOINT命令、WAL达到max_wal_size阈值)触发的检查点总次数
- checkpoint_write_time:所有检查点执行过程中,将数据从共享缓冲区写入磁盘的总耗时,单位为毫秒
- checkpoint_sync_time:所有检查点执行过程中,将写入的磁盘数据同步到持久存储的总耗时,单位为毫秒
- buffers_checkpoint:所有检查点执行过程中,从共享缓冲区写入磁盘的缓冲区总数量,每个缓冲区大小为8KB
postgres_exporter默认采集配置说明
postgres_exporter内置了多个采集查询规则,默认情况下已经包含pg_stat_bgwriter视图的采集逻辑,无需额外编写复杂的SQL查询。其默认的采集查询定义在内置的查询配置文件中,核心采集逻辑如下:
-- postgres_exporter默认采集pg_stat_bgwriter的SQL逻辑
SELECT
checkpoints_timed,
checkpoints_req,
checkpoint_write_time,
checkpoint_sync_time,
buffers_checkpoint,
buffers_clean,
buffers_backend,
maxwritten_clean,
buffers_backend_fsync,
stats_reset
FROM pg_stat_bgwriter;
该查询会返回pg_stat_bgwriter视图的所有字段,其中前五个字段就是检查点相关的核心统计信息,采集后postgres_exporter会将这些数据转换为Prometheus格式的指标对外暴露。
自定义配置采集检查点统计的步骤
如果默认配置无法满足需求,比如需要过滤字段或者添加自定义标签,可以按照以下步骤自定义采集配置:
1. 准备自定义查询配置文件
创建自定义的查询配置文件pg_stat_bgwriter_queries.yaml,内容如下:
pg_stat_bgwriter_checkpoint:
query: |
SELECT
checkpoints_timed,
checkpoints_req,
checkpoint_write_time,
checkpoint_sync_time,
buffers_checkpoint,
current_setting('server_version') as server_version
FROM pg_stat_bgwriter
metrics:
- checkpoints_timed:
usage: "COUNTER"
description: "Number of scheduled checkpoints that have been performed"
- checkpoints_req:
usage: "COUNTER"
description: "Number of requested checkpoints that have been performed"
- checkpoint_write_time:
usage: "COUNTER"
description: "Total time spent writing data during checkpoints in milliseconds"
- checkpoint_sync_time:
usage: "COUNTER"
description: "Total time spent syncing data during checkpoints in milliseconds"
- buffers_checkpoint:
usage: "COUNTER"
description: "Number of buffers written during checkpoints"
2. 启动postgres_exporter时指定配置文件
启动postgres_exporter时通过--extend.query-path参数指定自定义配置文件,同时配置PostgreSQL的连接信息:
# 设置PostgreSQL连接环境变量 export DATA_SOURCE_NAME="postgresql://用户名:密码@127.0.0.1:5432/数据库名?sslmode=disable" # 启动postgres_exporter并加载自定义配置 ./postgres_exporter --extend.query-path=pg_stat_bgwriter_queries.yaml --web.listen-address=:9187
3. 验证采集结果
启动后访问postgres_exporter的 metrics 接口,查看是否有对应的检查点统计指标输出:
curl http://127.0.0.1:9187/metrics | grep pg_stat_bgwriter
如果配置正确,会看到类似以下的输出:
pg_stat_bgwriter_checkpoint_checkpoints_timed 12 pg_stat_bgwriter_checkpoint_checkpoints_req 3 pg_stat_bgwriter_checkpoint_checkpoint_write_time 4562 pg_stat_bgwriter_checkpoint_checkpoint_sync_time 892 pg_stat_bgwriter_checkpoint_buffers_checkpoint 1245
采集注意事项
- postgres_exporter连接PostgreSQL的数据库用户需要具备pg_stat_bgwriter视图的查询权限,建议给监控用户授予pg_monitor角色,避免权限不足导致采集失败
- pg_stat_bgwriter的统计信息是累计值,重置统计需要执行SELECT pg_stat_reset();命令,重置后之前的检查点统计数据会被清空
- 如果PostgreSQL是集群部署,需要在每个实例上分别部署postgres_exporter采集对应实例的pg_stat_bgwriter数据,避免跨实例采集数据不准确
检查点频率过高会导致频繁的磁盘IO,影响数据库性能,通过采集的检查点统计数据可以合理调整checkpoint_timeout和max_wal_size参数,优化数据库写入性能。
postgres_exporterpg_stat_bgwriter检查点统计PostgreSQL修改时间:2026-07-07 01:15:30