
聊个真实场景。上周我帮人排查一个生产环境的PostgreSQL实例CPU冲到99%应用超时一片可慢查询日志干净得可怕——连一条超过一秒的SQL都没有。最后靠监控工具把“锁等待”和“空闲事务”翻出来才定位到根因。这类案例这几年我见过太多次也让我在选型PostgreSQL监控工具时越来越挑剔。2026年监控工具最值钱的能力不是面板多漂亮、指标多齐全而是能不能把数据库内部的真实状态翻译成人话。这篇文章我从生产环境实测过的十余个方案里挑出10个最值得上手的PostgreSQL监控工具逐个讲清楚定位、部署、适用场景以及文档里永远不会写的那些坑。1. 写在这份清单前面2026年的PostgreSQL监控到底在盯什么1.1 慢查询不是万能的你还需要等待事件很多团队一谈数据库监控第一反应就是开慢查询日志、盯CPU使用率。这条路在低并发时代够用但在2026年几乎必然翻车。原因很简单一条SQL执行慢可能是它本身写得烂也可能是它在等锁、等IO、等WAL刷盘。慢查询日志只记录执行总耗时CPU监控只看得到主机负载二者都回答不了一个更关键的问题——这条SQL到底在等什么。PostgreSQL从9.6开始引入wait_event机制把进程内核态和用户态等待细分成几十种类型比如Lock、IO、BufFileRead、WALWrite。监控工具如果能按时间窗口统计这些等待事件的分布你就能直接看出数据库当前最缺的是CPU、磁盘还是锁资源。我遇到的那个CPU 99%案例本质上是一堆高频短查询堆积在同一个行锁上每条查询耗时都不长慢查询日志自然不报警。这种场景没有等待事件监控排查难度会是地狱级别。1.2 读懂PG自带的“仪表盘”再谈外部工具PostgreSQL自带的统计系统其实已经非常能打监控工具大多数时候只是在帮你反复查询这些视图并美化展示。几个必懂的底层入口pg_stat_database每个数据库维度的事务、提交回滚、死锁、临时文件、缓存命中情况。pg_stat_activity当前所有连接、查询、状态、等待事件是定位阻塞和长事务的第一现场。pg_stat_statementsSQL级统计调用次数、总耗时、平均耗时、行数、共享读命中等需要提前加载扩展。pg_stat_replication主备复制状态和延迟是HA方案里必须盯的指标。pg_stat_bgwriter / pg_stat_iocheckpoint、缓冲区写入、IO计数判断写入压力和刷脏效率。外部工具的价值在于三点按时采集形成趋势、跨实例汇总比较、把原始数字变成告警和可视化解读。但请记住一个判断标准——如果某个工具连pg_stat_statements都不会帮你开或者连wait_event都不采集那它的数据库监控深度基本停留在2015年以前。1.3 一套监控栈要覆盖的三个层面我的经验里任何一套合格的PG监控方案都必须同时覆盖三个层面系统层CPU、内存、磁盘IO、网络流量这是数据库跑在哪辆车上。 数据库层连接数、复制延迟、checkpoint频率、vacuum进度、死锁发生、WAL增长。 SQL层慢查询分布、语句调用频率、执行计划变化、锁等待时间。三层缺一不可。只看系统层你会把锁等待误判成CPU瓶颈只看数据库层你看不到硬件资源消耗的源头只看SQL层你会漏掉复制延迟和脏页刷盘引发的整体抖动。后文所有工具的介绍我都默认你带着这三层标尺去对照。2. 十个工具背后的三条技术路线先看懂再选2.1 黑盒派只看系统指标与外部健康检查黑盒派工具不太关心数据库内部是怎么工作的它们采集CPU、内存、连接数、复制状态、QPS这类“从外面看得见”的指标通过阈值和趋势判断健康度。典型代表是Zabbix、Nagios以及各家云厂商的基础监控。这类方案的优点是不侵入、易部署、对版本升级兼容好缺点是出了问题只能告诉你“哪里不舒服”说不清“为什么不舒服”。如果你手上有老旧的IT运维体系Zabbix加PostgreSQL官方模板照样能跑但不要指望它帮你解慢SQL。它更适合当一个纯健康检查层负责“节点还活着吗”这类基础问题。2.2 白盒派深入统计视图、等待事件与执行计划白盒派是2026年数据库监控的主流。它们直接读取pg_stat_statements、pg_stat_activity和等待事件甚至自动跑EXPLAIN分析执行计划把“慢SQL产生的原因”拆开揉碎。PMM、pganalyze、pgwatch3都属于这个阵营Datadog DBM在白盒化上也做得非常深。白盒派的代价同样明确需要数据库开扩展、采集器要消耗额外连接和CPU、对PG大版本兼容要持续跟踪。但换来的是从“发现故障”到“定位根因”的完整能力。我个人观点是核心生产库至少应该保留一个白盒观察窗口否则遇到锁等待、vacuum风暴这类经典问题会非常被动。2.3 SaaS托管与AI辅助2026年的新分工最近一两年监控工具开始AI化。Datadog的异常检测和Watchdogpganalyze的AI索引建议与执行计划解读都是把过去DBA经验固化成自动分析。2026年的卖点不再是“我能采集多少指标”而是“我能自动告诉你下一步该看哪”。选SaaS方案你要多考虑两件事数据会离开你的管控范围SQL文本里可能带敏感业务信息费用按实例数和查询量线性上涨账单经常超出预期。内网合规要求高的环境优先考虑自托管方案比如PMM或pgwatch3功能并不输给SaaS只是需要自己维护。3. 2026年值得上手的10个PostgreSQL监控工具逐项拆解3.1 先给一张一图流总览工具开源/商业部署方式最适合的团队postgres_exporter Prometheus Grafana开源自建自托管已有Prometheus体系的团队pgwatch3开源自建Docker/源码多实例集中监控、DBA运维Percona PMM开源自建Docker需要专业数据库看板与SQL分析pganalyze商业SaaS/自托管SQL级深度优化、执行计划分析pgMonitor开源自建Python/K8s使用Crunchy Operator或K8s部署PgHero开源免费单容器小团队快速体检、开发环境Datadog DBM商业SaaSAgent预算充足的全栈可观测团队New Relic商业SaaSAgent已重度使用NR APM的团队AWS RDS监控云托管零部署AWS RDS/Aurora PostgreSQL用户Azure Monitor云托管零部署Azure Database for PostgreSQL用户3.2 postgres_exporter Prometheus Grafana开源自建的黄金底座这一套方案本质上是用开源组件拼出来的监控栈postgres_exporter负责把PG统计视图变成Prometheus指标Prometheus负责存储和告警Grafana负责可视化。它最大的优势是灵活和生态任何一个你想采集的指标都可以通过自定义查询加进去任何一个你不需要的指标也可以禁掉。注意两个坑。第一postgres_exporter默认采集很多PG内部指标如果你不做裁剪直接上生产Prometheus的存储增长会非常快三个月后就得跟磁盘空间搏斗。第二默认指标集并不包含pg_stat_statements里的SQL明细想看清楚每条SQL的耗时分布你得自己写查询配置。我的建议是这套组合适合当全公司统一的监控底层但不是开箱即吃的“PG专业监控面板”。3.3 pgwatch3为多实例而生的开源监控方案pgwatch3由Cybertec团队开源2026年已经相当成熟。它专门解决一个核心痛点如果你有几十个PG实例分布在开发、测试、生产环境怎么统一监控。它支持自动发现集群里的新实例内置了从基础到全量的多档指标集底层用TimescaleDB保存历史数据并直接配套Grafana仪表板。我在一组约30个实例的环境里跑过pgwatch3最舒服的是它针对PG做了大量细粒度指标比如复制延迟、vacuum进度、膨胀估算都有现成面板。但用之前一定要算好存储TimescaleDB默认保留周期和压缩策略必须调否则历史数据会快速膨胀。它的全量指标集对数据库本身有一定负载压力小规格实例建议只用Basic档。3.4 Percona PMM把pg_stat_statements变成可读的看板Percona Monitoring and Management是免费开源的数据库监控平台PostgreSQL是它的一等公民。PMM包含几个杀手级模块PostgreSQL Overview面板、Query Analytics(QAN)、以及复制监控和连接池监控。QAN能基于pg_stat_statements把SQL按调用次数、总耗时、响应时间分布做排行配合wait_event能很快找出“最伤库的十条查询”。部署上PMM服务端一个Docker容器就能起客户端用pmm-agent采集。我提醒一句PMM服务端比较吃内存2C8G算入门配置如果监控的实例多建议给它单独一台机器。另外PMM建议结合Percona自家的pg_stat_monitor扩展使用能获得更细的查询指纹和计划统计效果比单独用pg_stat_statements强不少。3.5 pganalyze从执行计划出发的SQL级体检医生pganalyze是商业产品走“SQL性能分析”的深度路线不是普通看板。它长期采集执行计划和统计信息自动标记哪些SQL的执行计划发生了劣化哪些索引长时间未被使用哪些表在膨胀并给出具体的优化建议。对“为什么这条SQL这周慢了3倍”这类问题pganalyze的回答效率远高于手工翻执行计划。它提供SaaS和自托管两种方式自托管支持Docker和Kubernetes。如果业务库SQL文本包含敏感信息又坚持用SaaS需要提前跟合规或安全团队对齐。价格不算便宜但性价比依然很高——一个DBA若每月能靠它少排查两次线上问题成本早就回来了。3.6 pgMonitorCrunchy Data的长青之选pgMonitor是Crunchy Data团队维护的开源监控方案历史很长2026年依然活跃。它最适合的场景是Kubernetes环境尤其是配合Crunchy Postgres Operator使用。pgMonitor能自动感知集群拓扑知道谁是主库谁是备库复制延迟和节点状态告警可以直接用。Grafana仪表板和Prometheus告警规则都是现成的。如果你不是K8s重度用户部署这套方案需要自己处理Python运行环境和采集容器性价比不如pgwatch3。反过来如果生产库已经跑在K8s Operator体系里pgMonitor的集群拓扑感知能力几乎没有替代品。3.7 PgHero小团队也能快速上手的轻量体检工具PgHero是我很乐意向“被监控焦虑困扰”的朋友推荐的工具。它本质上是一个只读的Web体检面板一条Docker命令就能起来然后立刻告诉你有没有慢查询、哪些索引该建、哪些表膨胀了、连接数是不是快打满。对开发环境和小团队来说这几乎是最低的监控入门成本。它也有限制历史趋势能力很弱不适合做长期基线也不适合跨实例统一管理。我更愿意把PgHero定位成“急诊医生”或“安装完成后的体检仪”而不是重症监护室。想要一周一个月的变化曲线还是得靠前文那套Prometheus组合。3.8 Datadog DBMSaaS里的深度SQL采样代表Datadog Database Monitoring是目前商业SaaS里对PostgreSQL白盒化做得最深的选手之一。它的采集粒度很细能做到按秒级采样活跃SQL自动关联执行计划标注锁等待和阻塞链并和APM链路打通。业务上你可以从“某个用户请求变慢”一路追到“某条SQL触发全表扫描”这种全链路排查体验很舒服。代价有二agent常驻内存通常要几百MB小规格机器要掂量费用按实例和查询规模计费查询密集的库月账单可能超出预算。如果公司本来就在用Datadog做基础设施和链路监控加一个PG实例只是顺便的事如果纯粹为PG引一整套Datadog先算账再动手。3.9 New Relic泛基础监控阵营的PG支持New Relic是另一个商业SaaS选项APM和Infrastructure覆盖很广PostgreSQL监控属于其中一块。它的定位更像“全栈可观测性里的数据库模块”支持慢查询、连接、复制和基本SQL级统计配合NR自己的告警体系可以玩得很溜。但实话实说论PG执行计划和索引建议的深度New Relic不如pganalyze论按SQL热力图的呈现细腻度也不如PMM的QAN。如果你的团队已经把APM、日志、告警都统一到New Relic用它统一管PG是合理的如果还没有没必要因为它名气大就强行引入。3.10 AWS RDS监控云托管环境里“现成”的深度能力把PostgreSQL跑在AWS RDS或Aurora上云厂商自带的监控能力往往被严重低估。CloudWatch提供基础指标Enhanced Monitoring提供单进程级的操作系统指标Performance Insights则把平均活跃会话按等待事件、SQL、主机三个维度拆解直接告诉你瓶颈出在哪一环。这套组合对RDS用户来说几乎零部署成本强烈建议先把它用足。这里有个容易被忽略的点Performance Insights的免费周期只有7天长周期保留要付费。很多团队平时不看故障时才想回溯结果历史早就没了。我的建议是至少为生产实例购买一周以上的保留期并把“单实例最大AAS超过vCPU数”设为一条固定告警。3.11 Azure Monitor for PostgreSQL云上PG的另一种打法Azure Database for PostgreSQL的监控思路和AWS类似核心是Azure Monitor。通过诊断设置把PostgreSQL日志和指标导到Log Analytics再用Workbook定制面板用KQL写查询灵活度反而比很多商业工具还高。比如你可以用KQL把wait_event分布拉出来按时间聚合快速定位某小时的锁等待高峰。坑在于Azure侧默认只打开基础资源指标很多PG内部统计视图对应的指标需要你手动在诊断设置里打开否则控制台里就是一片空白。Azure没有像AWS Performance Insights那样开箱即用的“会话可视化”功能所以需要一点KQL基础否则会比较吃力。云厂商工具和开源白盒方案搭配使用是我比较推荐的做法。4. 自建监控栈部署实录从零到能用的关键步骤4.1 先开前置条件pg_stat_statements track_io_timing不管用哪套开源工具你大概率都需要先给PG开启pg_stat_statements扩展。修改postgresql.conf然后重启实例shared_preload_libraries pg_stat_statements pg_stat_statements.track top pg_stat_statements.max 10000 track_io_timing on重启后创建扩展CREATE EXTENSION IF NOT EXISTS pg_stat_statements;track_io_timing值得特别说一句它让PG在统计SQL耗时时能区分出多少时间花在磁盘IO上。很多慢SQL排查到最后发现瓶颈在存储层没有这个开关就只能靠猜。注意开启后每次IO计时会带来微小开销高并发OLTP场景建议先在测试环境压一遍。4.2 postgres_exporter Prometheus Grafana的Docker化部署用Docker起postgres_exporter核心是环境变量里的数据库连接串docker run -d --name pg-exporter \ -e DATA_SOURCE_NAMEpostgresql://monitor:password192.168.1.10:5432/postgres?sslmodedisable \ -p 9187:9187 \ quay.io/prometheuscommunity/postgres-exporter:latest然后给Prometheus加一个抓取任务scrape_configs: - job_name: postgres static_configs: - targets: [192.168.1.10:9187]Grafana里导入社区现成的PostgreSQL Dashboard一套最基础的监控栈就跑起来了。第一次用的人往往会发现指标很多但不知该看哪个我的建议是优先盯pg_stat_database的缓存命中率、连接数、deadlock数量和复制延迟这四类指标其他指标等熟悉了再逐项加。4.3 PMM服务端与客户端注册PMM的部署更简单服务端一个容器搞定docker run -d --name pmm-server \ -p 80:80 -p 443:443 \ percona/pmm-server:2客户端装好后注册进server然后添加PostgreSQL监控pmm-agent setup --server-addresshttp://192.168.1.100:80 --server-insecure-tls pmm-admin add postgresql --usernamemonitor --passwordxxx pg-production注意pmm-admin添加实例时官方会建议创建专用的监控账号。不要直接把超级用户密码丢给监控采集器用PG10内置的pg_monitor角色给监控账号赋予只读权限即可这样采集器看不到表数据也避免密码泄露时被直接提权。4.4 部署中最容易翻车的三个位置第一连接串里的sslmode。postgres_exporter和pmm-agent在不同版本下对TLS要求不一致贴一段配置到处报错十有八九是sslmode没写对查日志时先看这个。第二历史数据存储预算。Prometheus默认只保留15天TimescaleDB默认保留策略也偏保守但很多人不改导致想看三个月趋势时无数据可用。监控数据的价值随时间递增至少预留90天历史是个合理起步。第三采集权限过大。我见过不少团队图省事直接把postgres超级用户给采集器用一旦采集器被入侵等于数据库裸奔。统一用pg_monitor只读角色成本为零收益很大。5. 光有监控不够指标阈值、告警策略与误报处理5.1 一张表看懂核心指标与阈值指标监控位置建议阈值/信号说明缓存命中率pg_stat_database低于99%持续10分钟不一定代表性能差但要关注是否有大量随机读取连接数pg_stat_database超过max_connections的80%注意先区分连接池外的真实连接复制延迟pg_stat_replication超过30秒持续1分钟大事务后有追赶期需要结合上下文判断死锁数pg_stat_database大于0持续超过5分钟通常伴随业务日志需定位死锁SQL临时文件量pg_stat_databasetemp_bytes持续增长大概率是排序/哈希溢出work_mem等待事件pg_stat_activityLock类等待占比明显升高需要结合阻塞链分析autovacuum进度pg_stat_progress_vacuum表长期未vacuum死元组膨胀会拖慢查询并放大磁盘占用5.2 告警规则怎么写才不半夜炸群我见过太多团队把阈值设得过于敏感半夜每十分钟响一次三天后全部静默真出事时没人看。设计告警的几条原则我自己一直遵守。第一观察周期至少两个采集点比如Prometheus里用last_over_time(指标[10m])与阈值比较避免瞬时抖动触发。第二区分“立即处理”和“趋势关注”连接数打满、主从断开、复制延迟超过1分钟属于立即处理缓存命中率下降、死元组增长属于趋势关注不需要凌晨秒call。第三不同规格实例用不同阈值一台2C4G的小库和一台64C512G的大库80%连接数含义完全不同统一阈值等于无效告警。用PromQL写一条连接数告警示例avg_over_time(pg_stat_database_numbackends[10m]) 0.8 * max_connections这类写法能滤掉90%的瞬时毛刺值得作为所有告警规则的模板。5.3 三个容易误报的信号信号一autovacuum期间的CPU和IO尖峰。不少不懂PG内部机制的人会把vacuum误判成异常负载实际上它是正常的垃圾回收过程。识别方法很简单看到pg_stat_progress_vacuum里正在跑的进程同时CPU升高先等它跑完再结合表膨胀率判断是否需要人工干预。信号二主从切换或大事务后的复制延迟追赶。备库延迟在恢复期间快速拉升又快速回落属于正常的追平过程。真正的风险是延迟持续高位且不回落那通常意味着备库硬件能力不足或WAL堆积需要检查replay lag而非瞬时值。信号三连接数瞬间打满。很多时候是应用端连接池初始化或重连风暴数据库本身没毛病。我的习惯是给连接数告警加一个“持续超过5分钟”的条件把SQL节点抖动过滤掉否则半夜睡得正香容易被误报吵醒。6. 怎么选给不同团队一个可落地的决策参考6.1 按场景与成本选型你的现状推荐方案理由个人学习、开发环境想快速体检PgHero一条命令跑起来简单直接团队已有PrometheusGrafanapostgres_exporter成本最低融入现有体系几十个PG实例需要统一管理pgwatch3自动发现、分级指标、专为PG设计生产核心库需要SQL级深度定位pganalyze 或 PMM白盒视角直接定位根因业务跑在AWS RDS/AuroraRDS自带Performance Insights零部署先把云厂商能力用足预算充足团队用SaaS全家桶Datadog DBM全链路排查体验最好K8s里跑PG用Crunchy OperatorpgMonitor集群拓扑感知无可替代数据不能出内网合规要求高PMM 或 pgwatch3全部自托管数据不出本地6.2 我的组合建议与长期使用体会如果非让我给一个“通用答案”我目前生产环境的默认组合是底层用Prometheus加postgres_exporter保留90天历史充当全公司统一的监控基线核心业务库额外接入PMM或pganalyze负责SQL级深度和等待事件分析云上托管实例则优先开启云厂商自带能力。这并不冲突它们是分层协作的关系。这些年踩过不少坑最大的体会是监控工具不是装得越多越好而是要让指标有历史、告警有上下文、SQL有执行计划。数据只有积累成趋势才有价值告警只有连带上文才有人认真看。希望这份清单能帮你少走一些弯路。