ud_profile

前提条件

  • 已经安装 plpgsqldblink 扩展

相关配置

配置 unvdbsvr.conf 文件

  • ud_profile 配置

track_activities = on        # 监控活动查询
track_counts = on           # 收集统计信息
track_io_timing = on        # I/O 时间监控
track_wal_io_timing = on    # WAL I/O 监控
track_functions = all       # 函数调用跟踪(或者 track_functions = pl)

以上参数建议打开,其中 track_activitiestrack_counts 默认是打开的。track_activities 允许监控当前被任意服务器进程执行的命令。track_counts 控制是否收集关于表和索引访问的统计信息。track_io_timing 启用对块读写次数的监控。参数 track_functions 启用对用户定义函数使用的跟踪。

  • pg_stat_statements配置

shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = 'top'
pg_stat_statements.save = off

pg_stat_statements.max 是跟踪语句的最大数目(即 pg_stat_statements 视图中行的最大数量)。如果语句超过这个数量,最少被执行的语句的信息将会被丢弃。此参数的设置太低可能会导致在抽取样本之前会清除某些语句的统计信息。建议设置大一些,当前参数我们设置的10000,足够使用。

pg_stat_statements.track 指定 top 可以跟踪顶层语句(直接由客户端发出的语句),指定 all 还可以跟踪嵌套的语句(例如在函数中调用的语句),指定 none 则禁用语句统计信息收集。默认值是 top。如果你设置的是 all,可能会影响报告中 %Totalfields 字段的精确值。

安装扩展

安装相关扩展

CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE SCHEMA profile;
CREATE EXTENSION ud_profile SCHEMA profile;

验证安装

unvdb=# select *from pg_extension;
  oid  |      extname       | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+--------------------+----------+--------------+----------------+------------+-----------+--------------
 13642 | plpgsql            |       10 |           11 | f              | 1.0        |           |
 16384 | dblink             |       10 |         2200 | t              | 1.2        |           |
 16430 | pg_stat_statements |       10 |         2200 | t              | 1.10       |           |
 17596 | ud_profile         |       10 |        16461 | f              | 4.10       |           |
(4 rows)

创建快照生成报告

创建快照

执行 take_sample()函数创建快照,执行完之后可以调用 show_samples()函数查看生成的快照。

unvdb=# select *from profile.take_sample();
 server | result |   elapsed
--------+--------+-------------
 local  | OK     | 00:00:01.15
(1 row)

unvdb=# select profile.show_samples();
           show_samples
-----------------------------------
 (1,"2025-11-26 09:38:34+08",f,,,)
(1 row)

-- 可以间隔时间久一点多采集一些数据
unvdb=# select *from profile.take_sample();
 server | result |   elapsed
--------+--------+-------------
 local  | OK     | 00:00:00.91
(1 row)

unvdb=# select profile.show_samples();
            show_samples
------------------------------------
 (1,"2025-11-26 09:38:34+08",f,,,)
 (2,"2025-11-26 11:28:02+08",f,,,)
 (3,"2025-11-26 11:30:02+08",f,,,)
 (4,"2025-11-26 11:47:02+08",f,,,)
 (5,"2025-11-26 11:48:01+08",f,,,)
 (6,"2025-11-26 11:49:02+08",f,,,)
 (7,"2025-11-26 12:00:01+08",f,,,)
 (8,"2025-11-26 12:30:02+08",f,,,)
 (9,"2025-11-26 13:00:02+08",f,,,)
 (10,"2025-11-26 13:30:02+08",f,,,)
 (11,"2025-11-26 14:00:01+08",f,,,)
 (12,"2025-11-26 14:18:01+08",f,,,)
(12 rows)

采集报告

使用 get_report()函数生成任意两个时间段内的AWR报告。

# 生成从样本ID 10 到样本ID 12 时间段的性能报告,并将报告保存为 awr_report_unvdb_10_12.html
$ ud_sql -Aqt -c "select profile.get_report(10,12)" --output awr_report_unvdb_10_12.html

$ ls
awr_report_unvdb_10_12.html # 用浏览器打开该文件分析报告

使用get_diffreport() 函数生成对比报告。

# 比较样本 ID 1 到 2 和 样本 ID 10 到 12 这两个时间段的性能变化和差异
$ ud_sql -Aqt -c "select profile.get_diffreport(1, 2, 10, 12)" --output awr_diffreport_unvdb.html
$ ls
awr_diffreport_unvdb.html