控:TPS與QPS指標(biāo)解析與實踐)
1. PostgreSQL性能監(jiān)控的核心指標(biāo)解析在數(shù)據(jù)庫運維和性能調(diào)優(yōu)工作中TPSTransactions Per Second和QPSQueries Per Second是兩個最基礎(chǔ)也最重要的性能指標(biāo)。對于PostgreSQL這樣的關(guān)系型數(shù)據(jù)庫準(zhǔn)確監(jiān)控這兩個數(shù)值就像給汽車安裝轉(zhuǎn)速表和時速表——沒有它們你根本不知道引擎當(dāng)前的真實負(fù)載狀態(tài)。TPS反映的是數(shù)據(jù)庫每秒處理的事務(wù)數(shù)量一個典型的事務(wù)可能包含多個SQL操作。而QPS則更細(xì)粒度地統(tǒng)計每秒執(zhí)行的查詢語句數(shù)量。兩者的關(guān)系可以類比為TPS是批發(fā)交易QPS是零售交易。在OLTP系統(tǒng)中TPS通常維持在幾十到幾百之間而QPS則可能達(dá)到幾千甚至上萬。關(guān)鍵提示在PostgreSQL中一個事務(wù)可能包含多個查詢所以TPS值通常會顯著低于QPS值。當(dāng)兩者比例異常時比如TPS很低但QPS很高往往意味著存在長事務(wù)或者未合理使用事務(wù)塊的問題。2. 原生監(jiān)控方案使用pg_stat_statements2.1 擴(kuò)展安裝與配置PostgreSQL自帶的pg_stat_statements擴(kuò)展是監(jiān)控QPS的利器。啟用它只需要三步修改postgresql.conf配置文件shared_preload_libraries pg_stat_statements pg_stat_statements.track all pg_stat_statements.max 10000重啟PostgreSQL服務(wù)后在目標(biāo)數(shù)據(jù)庫中創(chuàng)建擴(kuò)展CREATE EXTENSION pg_stat_statements;查詢實時QPS數(shù)據(jù)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 指標(biāo)解讀與優(yōu)化這個查詢結(jié)果會顯示calls該SQL語句被調(diào)用的總次數(shù)可用于計算QPStotal_exec_time總執(zhí)行時間毫秒mean_exec_time平均執(zhí)行時間毫秒實戰(zhàn)經(jīng)驗我們曾經(jīng)發(fā)現(xiàn)一個看似簡單的SELECT語句QPS異常高平均執(zhí)行時間卻只有0.2ms。最終定位到是應(yīng)用層沒有使用連接池導(dǎo)致頻繁創(chuàng)建新連接執(zhí)行相同查詢。加上PgBouncer連接池后整體QPS下降了80%而吞吐量反而提升。3. TPS監(jiān)控的三種實現(xiàn)方式3.1 基于pg_stat_database視圖PostgreSQL的pg_stat_database視圖提供了事務(wù)統(tǒng)計的基礎(chǔ)數(shù)據(jù)SELECT datname, xact_commit xact_rollback AS total_transactions, xact_commit, xact_rollback FROM pg_stat_database;計算TPS的公式為當(dāng)前TPS (當(dāng)前total_transactions - 上次查詢的total_transactions) / 時間間隔(秒)3.2 使用pg_stat_activity實時監(jiān)控對于需要更細(xì)粒度監(jiān)控的場景可以結(jié)合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 外部工具采集方案在企業(yè)級監(jiān)控中通常會采用TelegrafPrometheusGrafana的組合配置Telegraf收集PostgreSQL指標(biāo)[[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配置抓取規(guī)則scrape_configs: - job_name: postgresql static_configs: - targets: [telegraf:9273]4. 高級監(jiān)控場景實現(xiàn)4.1 讀寫比例分析通過pg_stat_database可以分析讀寫負(fù)載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 # 記錄執(zhí)行超過100ms的查詢 log_statement none配合pgBadger工具可以生成直觀的分析報告。5. 生產(chǎn)環(huán)境監(jiān)控實踐要點5.1 監(jiān)控指標(biāo)基線建立建議采集以下指標(biāo)建立性能基線正常時段的TPS/QPS范圍高峰時段的峰值和持續(xù)時間不同業(yè)務(wù)場景下的讀寫比例關(guān)鍵表的CRUD操作頻率5.2 告警閾值設(shè)置根據(jù)基線數(shù)據(jù)設(shè)置合理告警# Prometheus告警規(guī)則示例 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 性能瓶頸診斷流程當(dāng)TPS/QPS異常時建議按以下順序排查檢查系統(tǒng)資源CPU、內(nèi)存、IO分析鎖等待情況pg_locks視圖檢查是否有長時間運行的事務(wù)分析最頻繁執(zhí)行的SQLpg_stat_statements檢查索引使用情況pg_stat_user_indexes6. 可視化監(jiān)控面板配置6.1 Grafana基礎(chǔ)面板推薦監(jiān)控指標(biāo)包括當(dāng)前TPS/QPS實時曲線事務(wù)成功率commit/rollback比例查詢延遲百分位P50/P95/P99活躍連接數(shù)趨勢鎖等待數(shù)量6.2 關(guān)鍵Perfomance指標(biāo)-- 查詢緩存命中率 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瓶頸 - 監(jiān)控await和%util內(nèi)存不足 - 檢查shared_buffers使用情況長事務(wù)阻塞 - 查詢pg_stat_activity中的長事務(wù)7.2 QPS異常高但TPS低典型場景自動提交模式下大量單條語句操作連接池配置不當(dāng)導(dǎo)致短連接風(fēng)暴N1查詢問題解決方案-- 查找重復(fù)執(zhí)行的相似查詢 SELECT query, calls FROM pg_stat_statements ORDER BY calls DESC LIMIT 10;8. 生產(chǎn)環(huán)境優(yōu)化建議合理設(shè)置work_mem# 對于復(fù)雜排序操作較多的場景 work_mem 8MB調(diào)整維護(hù)工作負(fù)載-- 在低峰期執(zhí)行VACUUM SET maintenance_work_mem 1GB; VACUUM (VERBOSE, ANALYZE) large_table;監(jiān)控連接池使用# 對于PgBouncer SHOW POOLS; SHOW STATS;在多年的PostgreSQL運維中我發(fā)現(xiàn)最有效的性能優(yōu)化往往來自于對TPS/QPS指標(biāo)的長期監(jiān)控和分析。建議至少保留30天的歷史數(shù)據(jù)這樣才能準(zhǔn)確識別業(yè)務(wù)周期模式和在問題發(fā)生前發(fā)現(xiàn)異常趨勢。