十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PostgreSQL笔记58: 性能监控工具全景——从内核指标到操作系统诊断

PostgreSQL笔记58: 性能监控工具全景——从内核指标到操作系统诊断 纲要pg_stat_statements—— 官方内核级 SQL 语句执行统计启用配置与扩展安装核心视图字段与衍生指标QPS、平均耗时、缓存命中率管理函数与重置统计第三方性能监控与分析平台pganalyze—— 企业级全栈监控与自动调优建议pgBadger—— 基于日志的高性能报告生成器命令行实时监控工具pgCenter—— PostgreSQL 版top支持进程级 I/O 与等待事件pgactivity—— 进程级详细监控含读写 IOPS 与内存pgtop—— 轻量级进程监控类top交互执行计划可视化工具pev—— 执行计划树形图dalibo—— 图形化执行计划分析pgMustard—— 智能优化建议与计划解析配置参数自动调优工具PGConfigurator—— 基于负载与硬件的自适应参数推荐pgtune—— 简易参数配置生成器扩展监控插件pg_stat_kcache—— SQL 级 CPU 与内存消耗统计pg_stat_monitor—— 增强版查询性能监控pg_sampler—— 历史 SQL 执行采样system_stats—— 数据库内直接访问操作系统指标操作系统层诊断命令集top/htop—— 系统资源总览mpstat—— CPU 多核统计perf—— 性能剖析与指令级分析sar—— 系统活动全能报告vmstat—— 虚拟内存与进程状态dstat—— 综合统计CPU、磁盘、网络、换页等iostat/iotop—— 磁盘 I/O 监控blktrace—— I/O 栈各阶段耗时追踪nload/nmon—— 网络流量监控内核插件pg_stat_statements— 性能诊断的基石pg_stat_statements是 PostgreSQL 官方 contrib 模块中最重要的性能追踪工具。它记录服务器上所有执行过的 SQL 语句的计划和执行统计信息是多数第三方监控工具的数据来源。启用与配置该模块需要预加载共享库因此必须修改postgresql.conf并重启数据库# postgresql.conf shared_preload_libraries pg_stat_statements compute_query_id on # 启用查询标识 pg_stat_statements.track top # 跟踪顶层语句 pg_stat_statements.track_utility on # 跟踪工具命令如 VACUUM pg_stat_statements.track_planning on # 跟踪计划生成耗时 pg_stat_statements.max 10000 # 存储的最大语句数重启后在目标数据库中执行扩展创建命令CREATEEXTENSION pg_stat_statements;核心视图字段解析视图pg_stat_statements为每个(userid, dbid, queryid, top_level)组合提供一行统计。关键字段如下字段类型说明callsbigint执行总次数total_exec_timedouble precision总执行时间毫秒min_exec_timedouble precision最短执行时间max_exec_timedouble precision最长执行时间mean_exec_timedouble precision平均执行时间rowsbigint处理或影响的总行数shared_blks_hitbigint共享缓冲区命中次数shared_blks_readbigint从磁盘读取的共享块数shared_blks_dirtiedbigint脏化的共享块数shared_blks_writtenbigint写入磁盘的共享块数temp_blks_readbigint临时文件读取块数temp_blks_writtenbigint临时文件写入块数blk_read_timedouble precision块读取耗时需track_io_timing启用blk_write_timedouble precision块写入耗时需track_io_timing启用wal_recordsbigint产生的 WAL 记录数wal_fpibigint产生的 WAL 全页镜像数wal_bytesnumeric产生的 WAL 总字节数衍生指标与常用分析 SQL利用累积统计可计算 QPS、平均耗时、缓存命中率等关键性能指标-- 1. QPS每秒查询数基于自服务器启动以来的总调用数SELECTsum(calls)/(EXTRACT(epochFROMnow()-pg_postmaster_start_time()))ASqpsFROMpg_stat_statements;-- 2. 按总耗时降序排列找出负载最高的 Top 20 查询SELECTquery,calls,total_exec_time,mean_exec_time,rows,100.0*total_exec_time/sum(total_exec_time)OVER()ASload_percentFROMpg_stat_statementsORDERBYtotal_exec_timeDESCLIMIT20;-- 3. 缓存命中率低于 90% 的查询可能存在 I/O 瓶颈SELECTquery,calls,shared_blks_hit,shared_blks_read,100.0*shared_blks_hit/NULLIF(shared_blks_hitshared_blks_read,0)AShit_ratioFROMpg_stat_statementsWHEREshared_blks_hitshared_blks_read0AND100.0*shared_blks_hit/(shared_blks_hitshared_blks_read)90ORDERBYshared_blks_readDESC;-- 4. 临时文件使用量最大的查询可能导致性能问题SELECTquery,calls,temp_blks_read,temp_blks_writtenFROMpg_stat_statementsORDERBY(temp_blks_readtemp_blks_written)DESCLIMIT10;管理函数-- 重置所有统计SELECTpg_stat_statements_reset();-- 通过函数直接获取可控制是否返回查询文本SELECT*FROMpg_stat_statements(true);权限说明普通用户只能看到自己执行的语句超级用户或具有pg_read_all_stats角色的用户可查看所有语句。第三方监控平台pganalyze — 企业级全栈监控pganalyze是一款面向 PostgreSQL 的专业性能监控产品提供云服务和本地部署两种形态。其数据采集器基于 Go 实现收集pg_stat_statements、pg_stat_activity、pg_stat_database以及操作系统指标CPU、内存、磁盘。核心功能包括查询性能分析自动聚合相似 SQL计算执行时间、调用频率、缓存命中率等Query Advisor基于执行计划与统计信息自动识别全表扫描、索引缺失等问题并给出优化建议集群级统一看板支持多数据库、多实例的集中监控历史数据归档最长可保留 60 天历史便于趋势分析pgBadger — 日志分析报告生成器pgBadger是由 Gilles Daroldora2pg作者开发的 Perl 日志分析工具能以极高速度解析 PostgreSQL 日志并生成 HTML5 报表。# 安装源码方式gitclone https://github.com/darold/pgbadger.gitcdpgbadger perl Makefile.PLmakesudomakeinstall# 生成报告pgbadger-oreport.html /var/log/postgresql/postgresql-*.log# 分析最近 7 天日志pgbadger-q$(find/var/log/postgresql/-mtime-7-namepostgresql-*.log)-oweekly_report.html报表包含慢查询分布、高频查询、锁等待、连接统计、错误日志、临时文件使用、检查点等丰富图表所有图表均可缩放并导出为 PNG。命令行实时监控工具pgCenter — PostgreSQL 版 toppgCenter使用 Go 编写提供类似top的交互界面可实时查看 PostgreSQL 进程状态。# 通过 Docker 运行dockerpull lesovsky/pgcenter:latestdockerrun-it--rmlesovsky/pgcenter:latest pgcentertop-h127.0.0.1-Upostgres-dpostgres-p5432# 直接安装运行pgcentertop-h127.0.0.1-Upostgres-dpostgrespgCenter支持快捷键切换视图如ShiftS显示每进程系统统计含 CPU 利用率、I/O 吞吐量、I/O 等待时间并可查看配置文件与日志文件无需退出监控界面。pgactivity — 进程级详细监控pgactivity提供比pgCenter更详细的进程级信息包括每秒读写 IOPS、内存占用、等待事件如transactionid等待、会话总数及工作进程分类。# 通过 pip 安装pipinstallpgactivity# 运行pgactivity-hlocalhost-Upostgres-dpostgrespgtop — 轻量级进程监控pgtop是最简洁的 PostgreSQL 进程监控工具交互方式与系统top一致# 安装通常由系统包管理器提供# 例如 Ubuntu: sudo apt-get install pgtoppgtop-hlocalhost-Upostgres支持快捷键c显示完整命令m按内存排序e切换内存单位。执行计划可视化工具传统EXPLAIN输出冗长且难以直观分析以下工具将执行计划图形化降低分析门槛。pev — 树形图可视化pevPostgreSQL Explain Visualizer将EXPLAIN (ANALYZE, BUFFERS)的输出渲染为树形图清晰展示每个节点的实际行数、耗时和缓冲区命中情况。# 在线使用或本地部署# 访问 https://tatiyants.com/pev 粘贴计划文本即可dalibo — 图形化执行计划分析dalibo由 Dalibo 公司开发同样提供树形计划可视化并额外标注高成本节点支持计划对比。pgMustard — 智能优化建议pgMustard不仅可视化执行计划还内置了基于 PostgreSQL 内部知识的分析引擎能够针对每个节点给出具体的优化提示例如建议创建缺失的索引并给出候选列组合检测低效的排序或哈希操作提示统计信息过时# 访问 https://www.pgmustard.com 上传计划文本配置参数自动调优工具PGConfigurator — 基于负载的自适应推荐PGConfigurator亦称pgconfigurator是一款交互式 Web 工具根据用户输入的硬件配置内存、CPU 核心数、磁盘类型和工作负载特征OLTP、混合负载、分析型生成推荐的postgresql.conf参数值。# 在线使用地址# https://pgconfigurator.cybertec.at/可指定的参数包括内存相关shared_buffers、effective_cache_size、work_mem、maintenance_work_mem并发相关max_connections、max_parallel_workers存储相关checkpoint_completion_target、wal_buffers、commit_delay日志与监控log_min_duration_statement、track_io_timingpgtune — 简易配置生成器pgtune是一款更轻量的命令行工具只需提供数据库类型如 OLTP、数据仓库、内存大小和 CPU 核心数即可快速生成一组参数建议。# 安装通常通过包管理器# 例如 Ubuntu: sudo apt-get install pgtunepgtune-ipostgresql.conf-opostgresql-tuned.conf--typeOLTP--memory32GB--cpus8与PGConfigurator相比pgtune生成的参数较少但适合快速初始配置。扩展监控插件pg_stat_kcache — SQL 级 CPU 与内存统计原生pg_stat_statements仅提供 I/O 与时间统计不包含 CPU 和内存消耗。pg_stat_kcache扩展可补充这些指标记录每个查询的 CPU 时间、系统调用次数、页面错误数、内存占用等。-- 加载扩展需预加载shared_preload_librariespg_stat_statements, pg_stat_kcacheCREATEEXTENSION pg_stat_kcache;-- 查询消耗 CPU 最多的 SQLSELECTs.query,k.cpu_time,k.user_time,k.system_time,k.minflt,k.majfltFROMpg_stat_statements sJOINpg_stat_kcache kONs.queryidk.queryidORDERBYk.cpu_timeDESCLIMIT10;pg_stat_monitor — 增强版查询监控pg_stat_monitor是pg_stat_statements的增强分支由 Percona 维护提供更细粒度的统计维度例如按时间桶聚合可统计每分钟的 QPS 变化计划与执行阶段分别计时包含查询标签如应用名称、用户-- 加载扩展CREATEEXTENSION pg_stat_monitor;-- 查看按分钟统计的查询负载SELECTbucket,query,calls,total_timeFROMpg_stat_monitorORDERBYbucketDESC;pg_sampler — 历史 SQL 采样pg_sampler定期采样pg_stat_activity并存储历史快照便于事后回溯当时正在运行的查询。它类似于 Oracle 的ASHActive Session History功能。system_stats — 数据库内访问操作系统指标system_stats扩展将操作系统级指标如 CPU 负载、内存使用、磁盘空间封装为数据库函数允许没有 SSH 权限的数据库用户直接查询服务器状态。CREATEEXTENSION system_stats;-- 查看 CPU 信息SELECT*FROMpg_cpu_info();-- 查看内存使用SELECT*FROMpg_memory_info();-- 查看磁盘空间SELECT*FROMpg_disk_info();操作系统层诊断命令集数据库性能问题常常根植于操作系统层面以下工具是 DBA 必备的诊断利器。CPU 相关top/htop实时显示进程 CPU 与内存占用htop提供彩色和交互式界面。mpstat -P ALL显示每个 CPU 核心的使用率识别单核瓶颈。perfLinux 最强大的性能剖析工具可采样 CPU 事件并生成火焰图。# 采样 10 秒查看 CPU 热点perf record-a-g--sleep10perf report# 统计单个命令的 CPU 指令数perfstat-ecycles,instructions,cache-misses pgbench-c10-T10内存相关vmstat 1实时显示进程、内存、换页、块 I/O、中断、上下文切换等。sar -r内存利用率历史报告。dstat全能统计工具可同时显示 CPU、磁盘、网络、换页等。dstat-c-d-n-m--top-io --top-mem磁盘 I/O 相关iostat -x 1显示每个磁盘的利用率、吞吐量、平均请求大小和等待时间。iotop按进程显示 I/O 读写速率可快速找出造成 I/O 瓶颈的 PostgreSQL 进程。blktrace追踪 I/O 请求在块设备层的完整生命周期从提交到完成各阶段耗时用于深度分析 I/O 延迟。# 追踪 sda 设备 10 秒blktrace-d/dev/sda-w10# 分析结果blkparse-isda.blktrace网络相关nload实时显示网络入/出流量。nmon全能监控工具可按cCPU、m内存、d磁盘、n网络切换视图。sar -n DEV 1网络接口流量统计。API 速览本节汇总博客中提到的所有核心扩展与工具的函数接口。pg_stat_statements 核心函数函数签名说明pg_stat_statements_resetpg_stat_statements_reset() → void清空所有统计计数pg_stat_statementspg_stat_statements(showtext boolean) → setof record直接返回统计视图showtext控制是否输出查询文本pg_stat_kcache 核心视图视图主要字段说明pg_stat_kcachequeryid,cpu_time,user_time,system_time,minflt,majflt每个查询的 CPU 与页面错误统计pg_stat_kcache_detail更细粒度的系统调用计数高级诊断system_stats 核心函数函数返回类型说明pg_cpu_info()setof recordCPU 型号、核心数、频率pg_memory_info()setof record总内存、可用内存、交换使用pg_disk_info()setof record每个挂载点的总容量、已用、可用pg_load_avg()setof record1、5、15 分钟负载平均值pg_network_info()setof record网络接口 IP、速率、收发包统计Demo 简单示例本 Demo 演示如何在一个 PostgreSQL 实例中启用pg_stat_statements执行典型查询负载然后通过 SQL 分析性能瓶颈。环境准备使用 Node.js pg驱动mkdirpg-monitor-democdpg-monitor-demonpminit-ynpminstallpg配置 PostgreSQL确保postgresql.conf已包含上述shared_preload_libraries并重启。创建数据库与扩展使用psql或 Node.js 脚本-- 手动执行或通过脚本CREATEDATABASEdemo;\c demoCREATEEXTENSIONIFNOTEXISTSpg_stat_statements;CREATEEXTENSIONIFNOTEXISTSpg_stat_kcache;-- 可选Node.js 脚本demo.jsconst{Client}require(pg);constclientnewClient({host:localhost,port:5432,database:demo,user:postgres,password:yourpassword});asyncfunctionrun(){awaitclient.connect();// 1. 创建测试表并插入数据awaitclient.query(CREATE TABLE IF NOT EXISTS orders ( id SERIAL PRIMARY KEY, customer_id INT, amount DECIMAL(10,2), created_at TIMESTAMP DEFAULT NOW() ););// 插入 10000 条随机数据awaitclient.query(INSERT INTO orders (customer_id, amount) SELECT (random() * 1000)::int, (random() * 1000)::decimal FROM generate_series(1, 10000););// 2. 执行几条查询模拟负载for(leti0;i100;i){awaitclient.query(SELECT * FROM orders WHERE customer_id $1,[i%100]);awaitclient.query(SELECT COUNT(*) FROM orders WHERE amount $1,[500]);}// 3. 查询 pg_stat_statements 分析负载constresawaitclient.query(SELECT query, calls, total_exec_time, mean_exec_time, shared_blks_hit shared_blks_read AS total_blocks, round(100.0 * shared_blks_hit / NULLIF(shared_blks_hit shared_blks_read, 0), 2) AS hit_ratio FROM pg_stat_statements WHERE query NOT LIKE %pg_stat_statements% ORDER BY total_exec_time DESC LIMIT 5;);console.table(res.rows);// 4. 重置统计可选// await client.query(SELECT pg_stat_statements_reset());awaitclient.end();}run().catch(console.error);运行说明nodedemo.js代码说明使用pg驱动连接 PostgreSQL执行建表、数据插入和查询负载。最后查询pg_stat_statements获取按总耗时排序的 Top 5 查询并计算缓存命中率。该 Demo 演示了如何利用内核扩展实时定位性能瓶颈适用于开发环境验证。技术点总结pg_stat_statements的启用与基本查询。通过累积统计计算缓存命中率识别 I/O 密集型查询。Node.js 与 PostgreSQL 的集成示例。项目难点与解决方案核心难点性能监控数据源分散内核扩展、日志、操作系统命令各成体系缺乏统一视图导致问题定位效率低。解决方案以pg_stat_statements为核心数据源构建统一查询接口。结合pg_stat_kcache和system_stats将 CPU/内存/OS 指标整合到数据库中通过 SQL 联合查询获得全景。使用pgBadger定期生成基线报告便于历史对比。广度覆盖 SQL 统计、执行计划、参数调优、操作系统诊断形成完整的性能观测闭环。深度深入内核级别的等待事件分析、I/O 栈追踪blktrace以及 CPU 指令级剖析perf能够定位微小的性能退化。复杂度涉及多个扩展的配置与协作需要理解 PostgreSQL 内部统计机制和操作系统的性能计数器对 DBA 的综合能力要求较高。官方文档PostgreSQL 官方文档pg_stat_statementsMonitoring Database ActivityEXPLAINSystem Statistics Functions参考链接pgCenter GitHubpgactivity GitHubpgtune GitHubpgBadger GitHubpganalyze 官方pgMustard 官方PGConfigurator 在线工具系统性能分析参考Linux总结本文系统梳理了 PostgreSQL 性能监控的完整工具链从内核级pg_stat_statements的精细统计到pgCenter、pgactivity等实时命令行工具再到pgBadger的历史日志分析以及PGConfigurator的智能调优推荐。同时文章深入介绍了pg_stat_kcache和system_stats等扩展如何补全 CPU、内存和操作系统指标并给出了操作系统层面perf、blktrace等高级诊断工具的应用场景。结合完整的 Demo 示例读者可以快速搭建自己的性能监控体系实现从 SQL 到硬件栈的全链路问题定位。
返回列表