Postgres bgwriter统计疑问:为何极少清理RAM中的脏缓冲区?
PostgreSQL bgwriter统计异常问题解答
核心数据含义解析
buffers_checkpoint为0是正常现象:这个指标统计的是检查点执行阶段直接写入的脏缓冲区数量。如果bgwriter已经提前把大部分脏页写回磁盘,检查点就不需要再额外写入脏页,所以该值为0完全合理,和checkpoints_timed统计的1GB检查点总数据量不冲突——这1GB数据其实已经被bgwriter提前完成了写回。
bgwriter工作逻辑说明
你的bgwriter采用默认配置:
bgwriter_delay = 200ms bgwriter_lru_max_pages = 100 bgwriter_lru_multiplier = 2
bgwriter的核心目标是提前释放内存中的脏页,避免检查点阶段突发大量IO,但它的写入量是保守控制的:
- 每次间隔200ms扫描LRU列表
- 最多写入100个脏页,且写入量是“预计未来短时间内需要的空闲页数量”的2倍
如果系统脏页生成速度慢,或者内存足够容纳所有脏页,bgwriter自然不会频繁大量写数据,偶尔工作是符合预期的。
是否需要担忧?
不需要担忧,只要系统没有出现以下异常症状,就说明状态正常:
- 业务高峰期日志中频繁出现
checkpoint starting,且伴随磁盘IO突增 - 会话出现
waiting for checkpoint等待事件 - 通过
SELECT pg_stat_get_dirty_buffer_percent();查询到脏页占比持续超过70%
验证方法
可以执行以下查询确认bgwriter的工作状态:
SELECT buffers_clean, buffers_backend, buffers_checkpoint FROM pg_stat_bgwriter;
如果buffers_clean数值持续增长,说明bgwriter确实在正常工作,只是写入量不大。同时观察pg_stat_activity中是否有大量IO等待的会话,或pg_stat_database的blk_write_time是否异常波动。
内容的提问来源于stack exchange,提问作者MiXaiL
相关产品推荐
相关产品推荐

