尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PostgreSQL性能监控:TPS与QPS指标解析与实践

PostgreSQL性能监控:TPS与QPS指标解析与实践 1. PostgreSQL性能监控的核心指标解析在数据库运维和性能调优工作中TPSTransactions Per Second和QPSQueries Per Second是两个最基础也最重要的性能指标。对于PostgreSQL这样的关系型数据库准确监控这两个数值就像给汽车安装转速表和时速表——没有它们你根本不知道引擎当前的真实负载状态。TPS反映的是数据库每秒处理的事务数量一个典型的事务可能包含多个SQL操作。而QPS则更细粒度地统计每秒执行的查询语句数量。两者的关系可以类比为TPS是批发交易QPS是零售交易。在OLTP系统中TPS通常维持在几十到几百之间而QPS则可能达到几千甚至上万。关键提示在PostgreSQL中一个事务可能包含多个查询所以TPS值通常会显著低于QPS值。当两者比例异常时比如TPS很低但QPS很高往往意味着存在长事务或者未合理使用事务块的问题。2. 原生监控方案使用pg_stat_statements2.1 扩展安装与配置PostgreSQL自带的pg_stat_statements扩展是监控QPS的利器。启用它只需要三步修改postgresql.conf配置文件shared_preload_libraries pg_stat_statements pg_stat_statements.track all pg_stat_statements.max 10000重启PostgreSQL服务后在目标数据库中创建扩展CREATE EXTENSION pg_stat_statements;查询实时QPS数据SELECT calls AS qps, total_exec_time / 1000 AS total_seconds, mean_exec_time AS avg_ms FROM pg_stat_statements ORDER BY calls DESC LIMIT 10;2.2 指标解读与优化这个查询结果会显示calls该SQL语句被调用的总次数可用于计算QPStotal_exec_time总执行时间毫秒mean_exec_time平均执行时间毫秒实战经验我们曾经发现一个看似简单的SELECT语句QPS异常高平均执行时间却只有0.2ms。最终定位到是应用层没有使用连接池导致频繁创建新连接执行相同查询。加上PgBouncer连接池后整体QPS下降了80%而吞吐量反而提升。3. TPS监控的三种实现方式3.1 基于pg_stat_database视图PostgreSQL的pg_stat_database视图提供了事务统计的基础数据SELECT datname, xact_commit xact_rollback AS total_transactions, xact_commit, xact_rollback FROM pg_stat_database;计算TPS的公式为当前TPS (当前total_transactions - 上次查询的total_transactions) / 时间间隔(秒)3.2 使用pg_stat_activity实时监控对于需要更细粒度监控的场景可以结合pg_stat_activitySELECT count(*) FILTER (WHERE state active) AS active_transactions, count(*) FILTER (WHERE state idle in transaction) AS idle_transactions FROM pg_stat_activity;3.3 外部工具采集方案在企业级监控中通常会采用TelegrafPrometheusGrafana的组合配置Telegraf收集PostgreSQL指标[[inputs.postgresql_extensible]] address hostlocalhost usermonitor passwordxxx sslmodedisable [[inputs.postgresql_extensible.query]] sqlSELECT sum(xact_commitxact_rollback) FROM pg_stat_database measurementpostgresql tags[dbproduction]Prometheus配置抓取规则scrape_configs: - job_name: postgresql static_configs: - targets: [telegraf:9273]4. 高级监控场景实现4.1 读写比例分析通过pg_stat_database可以分析读写负载SELECT datname, tup_inserted AS inserts, tup_updated AS updates, tup_deleted AS deletes, tup_fetched AS reads FROM pg_stat_database;计算读写比例写比例 (inserts updates deletes) / (inserts updates deletes reads)4.2 慢查询实时捕获配置log_min_duration_statement记录慢查询log_min_duration_statement 100 # 记录执行超过100ms的查询 log_statement none配合pgBadger工具可以生成直观的分析报告。5. 生产环境监控实践要点5.1 监控指标基线建立建议采集以下指标建立性能基线正常时段的TPS/QPS范围高峰时段的峰值和持续时间不同业务场景下的读写比例关键表的CRUD操作频率5.2 告警阈值设置根据基线数据设置合理告警# Prometheus告警规则示例 groups: - name: postgresql rules: - alert: HighTPS expr: rate(pg_stat_database_xact_commit[1m]) 500 for: 5m labels: severity: warning annotations: summary: High TPS on {{ $labels.datname }}5.3 性能瓶颈诊断流程当TPS/QPS异常时建议按以下顺序排查检查系统资源CPU、内存、IO分析锁等待情况pg_locks视图检查是否有长时间运行的事务分析最频繁执行的SQLpg_stat_statements检查索引使用情况pg_stat_user_indexes6. 可视化监控面板配置6.1 Grafana基础面板推荐监控指标包括当前TPS/QPS实时曲线事务成功率commit/rollback比例查询延迟百分位P50/P95/P99活跃连接数趋势锁等待数量6.2 关键Perfomance指标-- 查询缓存命中率 SELECT sum(blks_hit) / (sum(blks_hit) sum(blks_read)) AS cache_hit_ratio FROM pg_stat_database; -- 索引使用效率 SELECT schemaname, relname, indexrelname, idx_scan FROM pg_stat_user_indexes;7. 常见问题排查手册7.1 TPS突然下降可能原因锁竞争加剧 - 检查pg_locks视图磁盘IO瓶颈 - 监控await和%util内存不足 - 检查shared_buffers使用情况长事务阻塞 - 查询pg_stat_activity中的长事务7.2 QPS异常高但TPS低典型场景自动提交模式下大量单条语句操作连接池配置不当导致短连接风暴N1查询问题解决方案-- 查找重复执行的相似查询 SELECT query, calls FROM pg_stat_statements ORDER BY calls DESC LIMIT 10;8. 生产环境优化建议合理设置work_mem# 对于复杂排序操作较多的场景 work_mem 8MB调整维护工作负载-- 在低峰期执行VACUUM SET maintenance_work_mem 1GB; VACUUM (VERBOSE, ANALYZE) large_table;监控连接池使用# 对于PgBouncer SHOW POOLS; SHOW STATS;在多年的PostgreSQL运维中我发现最有效的性能优化往往来自于对TPS/QPS指标的长期监控和分析。建议至少保留30天的历史数据这样才能准确识别业务周期模式和在问题发生前发现异常趋势。
返回列表