PostgreSQL 17+ 关键基础监控指标详解
目录1.核心点1.1.致命级☆☆☆☆☆—— 立即导致实例不可用需设置紧急告警SLA响应目标1.2.严重级☆☆☆☆—— 性能严重劣化间接导致不可用SLA响应目标1.3.警告级☆☆☆—— 需关注并分析根因防止演变为严重问题SLA响应目标2.操作系统层指标OS-Level2.1.CPU使用率2.2.内存使用率2.3.磁盘使用率2.4.磁盘 IOPS2.5.磁盘吞吐量3.PostgreSQL 连接层指标3.1.连接数使用率3.2.空闲连接占比3.3.idle in transaction 连接4.事务与 MVCC 指标致命级4.1 事务 ID 年龄Transaction ID Wraparound4.2 Dead Tuples 比例表膨胀4.3 Autovacuum 运行状态5.WAL 与复制指标5.1 WAL 生成速率5.2 复制延迟5.3 复制槽状态5.4 Checkpoint 频率与耗时6.锁与等待事件指标6.1 锁等待6.2 等待事件分布7.查询性能指标7.1 长事务7.2 慢查询7.3 临时文件使用8.缓存与 Buffer 指标8.1 Buffer Cache 命中率8.2 索引命中率1.核心点一文详解postgres数据库需要关注的指标将指标按致命→严重→警告三级分类重新组织便于分层制定告警策略和响应SLA。PostgreSQL 监控指标三级分类体系1.1.致命级☆☆☆☆☆—— 立即导致实例不可用需设置紧急告警SLA响应目标指标致命条件后果推荐阈值磁盘使用率100%WAL无法写入触发PANIC: could not write to file实例立即崩溃≥95%紧急告警内存使用率OOM阈值Linux OOM Killer强制终止PostgreSQL进程可用内存事务ID年龄20亿接近2^31数据库进入只读保护模式拒绝所有写操作15亿紧急告警连接数使用率100%新连接被拒返回FATAL: too many connections≥95%紧急告警复制槽WAL保留持续增长至磁盘满非活跃复制槽无限保留WAL间接导致磁盘100%崩溃WAL保留10GB严重50GB致命1.2.严重级☆☆☆☆—— 性能严重劣化间接导致不可用SLA响应目标指标严重条件后果推荐阈值CPU使用率95%持续查询超时、连接堆积、慢查询连锁反应90%严重持续10分钟IOPS使用率90%I/O等待飙升查询延迟大幅增加达到实例规格上限80%复制延迟1GB主从数据不一致故障切换时可能丢失事务延迟300秒或1GBDead tuples比例50%表膨胀导致全表扫描变慢、磁盘空间浪费50%且死元组绝对量10万长事务2小时阻塞VACUUM清理加速XID年龄增长引发表膨胀事务运行2小时Swap使用1GB性能急剧下降OOM的前兆信号Swap使用1GB且持续增长1.3.警告级☆☆☆—— 需关注并分析根因防止演变为严重问题SLA响应目标指标警告条件后果推荐阈值Buffer命中率缓存不足导致磁盘I/O压力增大查询性能下降空闲连接占比60%连接资源浪费间接增加连接耗尽风险60%且总连接数max_connections×50%Checkpoint频率间隔频繁checkpoint引发I/O抖动性能周期性下降间隔临时文件1GB/查询排序/哈希溢出磁盘消耗空间并增加I/O单查询1GB警告WAL生成速率突增3倍以上磁盘空间消耗加速归档可能跟不上相对基线突增3倍锁等待30秒可能形成阻塞链导致事务堆积等待30秒会话5个idle in transaction5分钟持有锁阻塞其他操作阻止VACUUM持续时间5分钟2.操作系统层指标OS-Level2.1.CPU使用率指标CPU 总使用率风险CPU 持续高位会导致查询超时、连接堆积、新连接被拒、实例无响应。建议告警阈值警告CPU 80% 且持续 3 分钟严重CPU 95% 且持续 1 分钟PG 快速排查指令查活动会话与高耗 SQLSELECT pid, usename, state, query_start, now() - query_start AS duration, query FROM pg_stat_activity WHERE state active ORDER BY duration DESC;检查锁等待SELECT * FROM pg_locks WHERE NOT granted;查看慢查询日志 / 使用 EXPLAIN ANALYZE 优化高耗查询。2.2.内存使用率指标实例可用内存占总内存的比例风险可用内存耗尽会触发 Linux OOM Killer 杀掉 PostgreSQL 进程导致实例 crash 并重启影响可用性和数据连接稳定性。建议告警阈值警告内存使用率 85%严重内存使用率 95%关键 PostgreSQL 参数需与实例内存容量对齐shared_buffers建议约等于总内存的 25%work_mem按并发排序/复杂查询设置过大累加会耗尽内存maintenance_work_memVACUUM/CREATE INDEX 等操作使用effective_cache_size用于估算查询计划中的可用文件系统缓存PG 快速排查命令查看配置SHOW shared_buffers; SHOW work_mem; SHOW maintenance_work_mem; SHOW effective_cache_size;bgwriter/缓存命中SELECT * FROM pg_stat_bgwriter;检查活动会话内存消耗重点并发大查询/排序/哈希参照 pg_stat_activity 查询执行计划EXPLAIN ANALYZE。系统层面free -m / vmstat / ps aux --sort-rss 查占用进程。2.3.磁盘使用率指标PGDATA 与 WAL 所在磁盘的使用率风险磁盘使用率 100% 时PostgreSQL 无法写 WAL → 触发 PANIC: could not write to file → 实例立即 crash不可用。建议告警阈值警告 80%严重 90%紧急 95%常见“磁盘杀手”WAL 堆积逻辑复制槽/物理复制未推进WAL 无法回收临时文件未清理复杂排序 / 哈希 / 大查询产生大量 temp file表膨胀dead tuples 未及时 VACUUM / AUTOVACUUM 不充分大事务长事务产生大量 WAL 且阻止 VACUUMPG 内部排查库级体积SELECT pg_size_pretty(pg_database_size(dbname));表 / 索引体积示例SELECT relname, pg_size_pretty(pg_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_relation_size(relid) DESC LIMIT 20;WAL 目录大小服务器上du -sh $PGDATA/pg_wal2.4.磁盘 IOPS指标磁盘每秒读写操作次数异常影响IOPS 达上限 → I/O 等待升高 → 查询延迟激增 → checkpoint 超时 → 连接积压 → 实例不可用告警参考使用率 80%基于预置 IOPS 或 gp3 基线 3000 IOPS关联指标ReadLatency / WriteLatency秒DiskQueueDepth 10 → 队列堆积风险-- 查看各 backend 类型的 I/O 统计 SELECT * FROM pg_stat_io; -- 查看等待 checkpoint 的进程 SELECT pid, state, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event_type IO;2.5.磁盘吞吐量指标磁盘每秒读写数据量ReadThroughput / WriteThroughput单位 MB/s 或 Bytes/Second异常影响吞吐量饱和 → 大查询 / VACUUM / 备份阻塞 → 性能严重下降告警参考使用率 80%基于存储类型上限如 gp3 基线 125 MB/s3.PostgreSQL 连接层指标3.1.连接数使用率指标定义当前活跃会话数占max_connections配置值的百分比。故障机制连接数达到上限后PostgreSQL拒绝新建连接并返回FATAL: too many connections错误导致应用服务不可用。告警阈值建议分级告警70%警告、85%严重、95%紧急。诊断方法获取当前连接数SELECT count(*) FROM pg_stat_activity;查看最大连接数限制SHOW max_connections;资源消耗基线PostgreSQL 17默认max_connections100每个空闲连接约消耗5-10MB共享内存。3.2.空闲连接占比指标定义pg_stat_activity中state idle的连接数占总连接数的比例。故障机制大量空闲连接持续占用内存与连接槽位间接导致有效连接数耗尽触发too many connections错误。告警阈值建议复合条件告警——空闲连接占比 60% 且总连接数超过max_connections的50%。诊断方法SELECT state, count(*) FROM pg_stat_activity GROUP BY state;按状态统计连接分布。治理建议部署PgBouncer连接池复用连接降低空闲开销设置idle_in_transaction_session_timeout参数自动终止事务内空闲连接3.3.idle in transaction 连接指标定义pg_stat_activity中state idle in transaction的连接数即已开启事务但未提交或回滚的会话。故障机制此类连接长期悬空会持有锁资源阻塞并发DDL/DML操作同时阻碍VACUUM回收死元组导致表膨胀最终可能耗尽磁盘空间。告警阈值建议基于持续时间分级告警——超过5分钟警告超过30分钟严重。诊断方法执行以下SQL定位长事务悬空连接SELECT pid, now() - xact_start AS duration, query FROM pg_stat_activity WHERE state idle in transaction AND now() - xact_start interval 5 minutes;治理参数PG 17设置idle_in_transaction_session_timeout 3000005分钟自动终止超过阈值的悬空事务连接。4.事务与 MVCC 指标致命级4.1 事务 ID 年龄Transaction ID Wraparound指标定义数据库中最老未冻结事务IDdatfrozenxid与当前事务ID的差值。故障机制XID年龄接近2^31约21亿时PostgreSQL强制进入只读保护模式拒绝所有写操作需手动执行VACUUM FREEZE恢复。告警阈值建议分级告警——超过5亿警告、10亿严重、15亿紧急。诊断方法库级SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY 2 DESC;表级SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkindr ORDER BY 2 DESC LIMIT 20;根因分析VACUUM被长事务阻塞、autovacuum配置不当、大表VACUUM超时。PG 17增强改进VACUUM并行处理能力pg_stat_progress_vacuum提供更细粒度进度信息。4.2 Dead Tuples 比例表膨胀指标定义死元组数占总元组数活元组死元组的百分比。故障机制死元组堆积导致表膨胀造成全表扫描性能下降、磁盘空间浪费严重时耗尽存储。告警阈值死元组占比超过20%警告、超过50%严重同时过滤死元组绝对量10000。诊断方法查询pg_stat_user_tables计算n_dead_tup / (n_live_tupn_dead_tup)按占比降序输出。根因分析autovacuum清理速度跟不上更新频率或被长事务阻塞。4.3 Autovacuum 运行状态指标定义当前正在运行的autovacuum worker进程数量及队列积压情况。故障机制autovacuum worker持续满载时清理能力达到上限导致死元组堆积、表膨胀并增加XID回卷风险。告警阈值autovacuum worker数量持续30分钟达到autovacuum_max_workers上限。诊断方法执行监控活跃worker数。SELECT count(*) FROM pg_stat_activity WHERE backend_type autovacuum worker;关键参数autovacuum_max_workers默认3最大并发worker数autovacuum_naptime默认1min扫描库的间隔autovacuum_vacuum_threshold默认50触发VACUUM的最小死元组数autovacuum_vacuum_scale_factor默认0.2触发VACUUM的死元组比例系数5.WAL 与复制指标5.1 WAL 生成速率指标定义单位时间内生成的预写日志WAL数据量。故障机制WAL生成速率突增会导致磁盘快速耗尽若归档速度跟不上将触发磁盘满并导致实例崩溃。告警阈值WAL生成速率较基线突增3倍以上触发告警。诊断方法传统方式定期采样pg_current_wal_lsn()计算差值PG 17直接查询pg_stat_wal视图获取累计统计根因分析大事务批量写入、高频DML操作、临时表大量使用。5.2 复制延迟指标定义主库与从库之间WAL复制的延迟量字节或时间。故障机制延迟过大导致从库数据滞后故障切换时可能丢失数据同时复制槽会阻止WAL清理引发主库磁盘满。告警阈值建议复合告警——延迟超过100MB或60秒警告超过1GB或300秒严重。诊断方法查询pg_stat_replication计算sent_lsn与replay_lsn差值SELECT client_addr, pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lag_bytes FROM pg_stat_replication;5.3 复制槽状态指标定义复制槽活跃状态及保留的WAL数据量。故障机制非活跃复制槽会无限期保留WAL文件导致磁盘空间耗尽、实例崩溃。告警阈值非活跃复制槽存在超过1小时警告WAL保留量超过10GB严重。诊断方法查询pg_replication_slots计算保留WAL量SELECT slot_name, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS retained_bytes FROM pg_replication_slots;PG 17增强支持max_slot_wal_keep_size参数限制复制槽WAL保留上限防止磁盘耗尽。5.4 Checkpoint 频率与耗时指标定义checkpoint执行的时间间隔与单次完成耗时。故障机制checkpoint过于频繁引发I/O风暴导致性能抖动单次耗时过长会增加崩溃恢复时间。告警阈值checkpoint间隔小于5分钟过于频繁警告单次耗时超过checkpoint_timeout的50%警告。监控视图PG 17使用pg_stat_checkpointer独立视图PG 17从pg_stat_bgwriter分离。关键参数调优checkpoint_timeout默认5mincheckpoint最大间隔max_wal_size默认1GB触发checkpoint的WAL上限checkpoint_completion_target默认0.9平滑写入目标建议0.7-0.96.锁与等待事件指标6.1 锁等待指标定义正在等待获取锁的会话数量及其等待时长。故障机制锁等待链过长可能引发死锁导致事务回滚长时间锁等待会造成连接堆积间接耗尽连接池。告警阈值锁等待超过30秒的会话数大于5个触发警告任一锁等待超过5分钟触发严重告警。诊断方法通过pg_locks与pg_stat_activity关联查询阻塞链SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid, blocked_activity.query AS blocked_query FROM pg_locks blocked_locks JOIN pg_locks blocking_locks ON blocking_locks.locktype blocked_locks.locktype AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.pid ! blocked_locks.pid JOIN pg_stat_activity blocked_activity ON blocked_activity.pid blocked_locks.pid WHERE NOT blocked_locks.granted;关键参数PG 17lock_timeout建议设置30秒超时自动取消语句deadlock_timeout默认1秒死锁检测周期6.2 等待事件分布指标定义各类等待事件Lock、LWLock、IO、BufferPin等的占比分布。故障机制IO等待过多表明磁盘带宽瓶颈LWLock等待过多反映内部缓冲区或锁管理器的激烈争用。告警阈值任一等待事件类型占比超过50%且持续5分钟触发告警。诊断方法按等待事件类型聚合统计SELECT wait_event_type, wait_event, count(*) FROM pg_stat_activity WHERE state active AND wait_event IS NOT NULL GROUP BY wait_event_type, wait_event ORDER BY count DESC;7.查询性能指标7.1 长事务指标定义事务运行时间超过预设阈值的会话。故障机制长事务阻止VACUUM清理死元组导致表膨胀、XID年龄增长加速最终可能触发事务ID回卷或磁盘耗尽。告警阈值事务运行超过30分钟警告超过2小时严重。诊断方法定位运行超过阈值的事务SELECT pid, now() - xact_start AS xact_duration, now() - query_start AS query_duration, state, query FROM pg_stat_activity WHERE xact_start IS NOT NULL AND now() - xact_start interval 30 minutes ORDER BY xact_duration DESC;7.2 慢查询指标定义执行时间超过阈值的SQL语句。故障机制慢查询持续堆积会耗尽CPU/IO资源导致连接积压最终实例不可用。告警阈值单条查询超过10秒警告超过60秒严重。诊断工具PG 17使用pg_stat_statements视图分析PG 17增强内存使用和嵌套语句追踪SELECT query, calls, mean_exec_time, total_exec_time FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 20;关键参数设置log_min_duration_statement 1000毫秒记录超过1秒的查询。7.3 临时文件使用指标定义排序、哈希等内存操作溢出到磁盘产生的临时文件大小。故障机制大量临时文件生成会快速消耗磁盘空间导致磁盘满实例崩溃。告警阈值单查询临时文件超过1GB警告累计临时文件超过10GB严重。诊断方法查询数据库级临时文件统计SELECT datname, temp_files, temp_bytes FROM pg_stat_database WHERE temp_bytes 0;关键参数调优work_mem增大可减少磁盘溢出注意并发连接总内存temp_file_limitPG 17限制单会话临时文件最大尺寸8.缓存与 Buffer 指标8.1 Buffer Cache 命中率指标定义数据页从shared_buffers共享缓冲区中命中的比例。故障机制命中率过低导致大量磁盘IO查询性能下降并引发IO瓶颈。告警阈值命中率低于95%警告低于90%严重。诊断方法全局级计算pg_stat_database中缓存命中比例SELECT sum(blks_hit) / greatest(sum(blks_hit blks_read), 1) * 100 AS cache_hit_ratio FROM pg_stat_database;表级定位低命中率的表SELECT relname, round(heap_blks_hit::numeric / greatest(heap_blks_hit heap_blks_read, 1) * 100, 2) AS hit_ratio FROM pg_statio_user_tables ORDER BY heap_blks_read DESC LIMIT 20;8.2 索引命中率指标定义索引扫描次数占总扫描次数索引扫描顺序扫描的比例。故障机制索引命中率低意味着大量全表扫描增加CPU和IO压力。告警阈值OLTP场景下建议低于90%触发告警。诊断方法定位索引命中率低的表SELECT relname, seq_scan, idx_scan, round(idx_scan::numeric / greatest(idx_scan seq_scan, 1) * 100, 2) AS idx_hit_ratio FROM pg_stat_user_tables WHERE seq_scan idx_scan 100 ORDER BY idx_hit_ratio ASC LIMIT 20;