最佳实践

Halo数据库性能诊断工具--HWR

D
DBA 团队
2023年10月17日

HWR 可以帮助我们找出 Halo 数据库中大多数资源消耗活动,并可以生成类似 Oracle AWR 的分析报告。

HWR 扩展是基于 Halo 的标准统计视图。它在指定时间生成快照,并提供 HTML 格式来解释快照之间的统计数据。假设几个小时前报告数据库性能下降,定期采样快照可以帮助查找过去时间段内最耗资源的活动。我们可以在两个快照之间生成一个报告,查看数据库的负载配置文件,从而定位性能问题发生的时间窗口。

HWR 是用纯 PL/pgSQL 编写的,不需要任何外部库或软件,只需 Halo 数据库运行在 Oracle 兼容模式下。通过调用 take_sample() 函数获取快照样本。建议使用 cron 定期调度该任务。

每次获取样本时,都会调用 pg_stat_statements_reset(),以避免因达到 pg_stat_statements.max 而丢失 SQL 语句统计信息。

1、前置条件

设置 postgresql.conf 文件中的参数:

ini
database_compat_mode = 'oracle'
track_activities = on
track_counts = on
track_io_timing = on
track_wal_io_timing = on  # Since Halo 14
track_functions = all
pg_stat_statements.max = 1000
pg_stat_statements.track = 'top'

并在数据库中创建 Oracle 扩展:

sql
psql
# CREATE EXTENSION aux_oracle CASCADE;

2、HWR 的安装

步骤1:创建扩展

sql
psql
# CREATE SCHEMA hwr;
# CREATE EXTENSION hwr SCHEMA hwr CASCADE;
# \dx

所有 HWR 对象都将创建在 hwr 模式下。

在 postgresql.conf 中配置:

ini
shared_preload_libraries = 'pg_stat_statements'  # (change requires restart)

步骤2:准备脚本 hwr_take_sample.sh

以 halo 用户操作:

bash
cd $HALO_HOME/admin/hwr
cp hwr_take_sample.sh.sample hwr_take_sample.sh

修改 hwr_take_sample.sh 中的 HALO_HOME、PGHOST 等环境变量(根据实际路径配置),例如:

bash
export HALO_HOME=/u01/app/halo/product/dbms/14
export LD_LIBRARY_PATH=$HALO_HOME/lib
export PATH=$HALO_HOME/bin:$PATH
export PGHOST=/var/run/halo
psql -c 'SELECT hwr.take_sample()'

授权脚本:

bash
chmod 750 hwr_take_sample.sh

步骤3:为用户 halo 启用 crontab

若未启用,以 root 用户执行:

bash
echo halo >> /etc/cron.allow

步骤4:将 hwr_take_sample.sh 添加到 crontab

bash
# 编辑 crontab
crontab -e

# 查看 crontab
crontab -l

例如每小时执行一次:

bash
0 * * * * /u01/app/halo/product/dbms/14/admin/hwr/hwr_take_sample.sh > /u01/app/halo/product/dbms/14/admin/hwr/hwr_take_sample.sh.log 2>&1

可根据需求调整采集频率。

3、如何使用 HWR

设置扩展参数

在 postgresql.conf 中定义以下 HWR 参数(默认值):

ini
# 报告中每个表格显示的 Top N 对象数量(影响样本大小)
hwr.topn = 20

# 样本保留天数,超期样本在下次 take_sample() 时自动清理
hwr.max_sample_age = 7

# 是否记录详细的采样耗时
hwr.track_sample_timings = off

# 报告中查询文本的最大长度(不影响采集,仅截断显示)
hwr.max_query_length = 20000

样品(Snapshot)

每个采样包含自上一个采样以来的数据库工作负载统计信息。

核心函数:

• take_sample():收集所有已启用服务器的样本,顺序执行。

该函数返回一个表:

text
server   | result | elapsed
---------|--------|--------
server_name | "OK" 或错误信息 | 耗时(interval)

示例:

sql
halo0root=# SELECT * FROM hwr.take_sample();
 server   | result | elapsed  
----------+--------+----------
 HaloTest | OK     | 00:00:00.37
(1 行记录)

查看已有样本:

sql
halo0root=# SELECT * FROM hwr.samples;
 server_id | sample_id | sample_time       
-----------+-----------+---------------------
 1         | 49        | 2023-07-27 09:40:01+08
 1         | 50        | 2023-07-27 09:45:01+08
 ...

show_samples([server name,] [days integer]) 函数用于列出指定服务器最近若干天的样本:

sql
halo0root=# SELECT hwr.show_samples('HaloTest', 1);
 show_samples
-------------------------------------
 (117,"2023-08-01 18:00:02+08",t,,,) 
 (118,"2023-08-01 18:05:02+08",t,,,) 
 ...

返回字段说明:

• sample:样本 ID • sample_time:采集时间 • sizes_collected:是否收集了关系大小 • dbstats_reset / clustats_reset / archstats_reset:统计重置时间戳(通常为空)

采集建议:

至少需要 2 个样本才能生成报告。通常每小时采集 1~2 次即可。可使用 cron 调度,例如每 5 分钟:

bash
*/5 * * * * psql -c 'SELECT hwr.take_sample()' > /dev/null 2>&1

但更推荐通过监控系统调用 take_sample() 并检查返回结果,以便及时发现异常。

实例数据保留

HWR 支持自动清理过期样本,保留策略由 hwr.max_sample_age 控制(单位:天)。旧样本将在下次 take_sample() 调用时被删除。

4、报告

HWR 报告以 HTML 格式生成,支持多种调用方式:

• get_report([server], start_id, end_id [, description, with_growth]):按样本 ID 生成报告 • get_report([server], time_range tstzrange [, ...]):按时间范围生成覆盖该区间的最短样本间隔报告 • get_report([server], baseline varchar(25) [, ...]):基于命名基线生成报告 • get_report_latest([server]):为最新两个样本生成报告

参数说明:

• server:服务器名(省略则为本地) • with_growth:是否扩展区间并显示增长趋势(默认 false) • description:附加到报告中的描述文本

常用生成方式:

1. 使用内置脚本:

bash
psql -f $HALO_HOME/admin/hwr/hwrrpt.sql

2. 直接调用函数生成 HTML 文件:

bash
# 按样本 ID
psql -Aqtc "SELECT hwr.get_report(126,129)" -o report_126_129.html

# 按时间范围
psql -Aqtc "SELECT hwr.get_report(tstzrange('2023-08-01 18:00:02+08','2023-08-02 09:20:02+08'))" -o report_range.html

# 最近 24 小时
psql -Aqtc "SELECT hwr.get_report(tstzrange(now() - interval '1 day', now()))" -o last24h_report.html

生成的 HTML 报告可用任意 Web 浏览器打开查看。


最新文章

安全公告
2025年04月11日

羲和(Halo)数据库关键补丁更新公告 - 2025年4月

安全公告
2024年06月20日

羲和(Halo)数据库关键补丁更新公告 - 2024年6月

安全公告
2023年12月18日

羲和(Halo)数据库关键补丁更新公告 - 2023年12月