暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

原创 贾桂军 2023-10-17
12754

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

HWR扩展是基于Halo的标准统计视图。它在指定时间生成快照,并且提供html格式来解释快照之间的统计数据。假设几个小时前报告数据库性能下降,定期采样快照可以帮助查找过去时间大多数资源密集型活动。我们可以在两个示例之间生成一个报告,查看数据库的负载配置文件以限制性能问题周期。

它是用纯pl/ pgsql编写的,不需要任何外部库或软件,只需要Halo数据库在Oracle模式下运行。通过调用take_sample()函数获取示例。我们需要使用 cron来安排作业。

每次获取样本时,都会调用pg_stat_statements_reset(),来保证不会因为达到pg_stat_statements.max而丢失语句。

 

 

1前置条件

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

database_compat_mode = 'oracle'

track_activities = on

track_counts = on

track_io_timing = on

track_wal_io_timing = on      # Since Hao 14

track_functions = all

pg_stat_statements.max=1000

pg_stat_statements.track = 'top'

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

psql

# create extension aux_oracle cascade;

2、HWR的安装

步骤1 创建扩展

psql

# create schema hwr;

# create extension hwr schema hwr cascade;

# \dx

 

所有对象都将在HWR中创建。

在postgresql.conf中配置参数:

shared_preload_libraries = 'pg_stat_statements' # (change requires restart)

 

步骤2 准备脚本hwr_take_sample.sh

Halo用户下操作:

$ cd $HALO_HOME/admin/hwr

$ cp hwr_take_sample.sh.sample hwr_take_sample.sh

 

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

例如:

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()'

授权:

$ chmod 750 hwr_take_sample.sh

 

步骤3 为用户Halo启用crontab

如果未为用户Halo启用 cron,以 root 用户身份运行以下命令

 

$ echo halo >> /etc/cron.allow

 

步骤4 将hwr_take_sample.sh添加到crontab

编辑用户的crontab:

 

$ crontab -e

 

列出用户的crontab

 

$ crontab -l

 

例如每小时:

 

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.topn = 20

要在每个排序的报告表中报告的顶级对象(语句、关系等)的数量。此外,此参数会影响样本的大小。我们希望在报表中显示的对象越多,则需要在样本中保留的对象就越多。

 

hwr.max_sample_age = 7

样本的保留时间(以天为单位)。样本、老化 hwr.max_sample_age 天数等将在下次take_sample()调用时自动删除。

 

hwr.track_sample_timings = off

当此参数打开时,HWR 将跟踪详细的采样计时。

 

hwr.max_query_length = 20000

报表的查询长度限制。报表中的所有查询都将截断到此长度。此设置不影响查询文本的收集。在示例期间收集完整的查询文本,因此可以获得。

 

样品

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

示例函数:

take_sample() 函数将收集所有已启用服务器的示例。服务器样本将逐个顺序采集。函数返回一个表:

 

server      name,

result      text,

elapsed     interval

 

server 是服务器名称。

result 是取样的结果。如果连续采集样本,则可为"OK",并且在异常情况下将包含错误文本。

elapsed是为服务器获取样本所经过的时间,此类返回使得使用 SQL 查询控制样本创建变得容易。

 

函数show_samples([server name,] [days integer])  返回一个表,其中包含服务器(如果省略服务器,则假定为本地服务器)的最后几天的现有样本(如果省略则为所有现有样本):

 

sample             integer,

sample_time       timestamp (0) with time zone,

sizes_collected   boolean,

dbstats_reset     timestamp (0) with time zone,

clustats_reset    timestamp (0) with time zone,

archstats_reset   timestamp (0) with time zone

 

sample 是示例标识符。

ample_time是采集此样本的时间。

如果在此示例中收集了所有关系大小,则设置sizes_collected。

dbstats_reset,clustats_reset和archstats_reset通常为空,但会包含pg_stat_database,pg_stat_bgwriter和pg_stat_archiver统计信息重置时间戳,因为以前的示例样本收集函数也支持服务器存储库,它将删除有关保留策略的过时样本和基线。

 

采集样品

我们必须至少创建2个样本,才能在第1个样本和第2个样本之间生成第一个报表。所有已启用服务器的示例都是通过调用 take_sample() 函数来获取的。不需要频繁创建样本。通常基本频率是每小时一个或两个样本。您可以使用类似 cron 的工具来计划示例创建。例如,5分钟周期:

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

 

但是,此类调用不会对take_sample() 函数结果进行错误检查。考虑更智能地使用take_sample()函数,为您的监控系统提供结果。

对于成功采集样本的所有服务器,函数将返回"OK",并为出现故障的服务器显示错误文本:

 

halo0root=# select * from hwr.take_sample();

  server  | result |   elapsed   

----------+--------+-------------

 HaloTest | OK     | 00:00:00.37

(1 行记录)

 

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

         1 |        51 | 2023-07-27 09:50:02+08

         1 |        52 | 2023-07-27 09:55:01+08

         1 |        53 | 2023-07-27 10:00:02+08

(5 行记录)

 

实例数据保留

我们无法永久存储示例数据,因此我们有一个保留策略,可以在三个级别上定义保留期:

在 postgresql.conf 文件中设置参数 hwr.max_sample_age。这是一个常见的保留,如果没有定义其他保留,则它是有效的。

一般的,使用 show_samples() 函数获取存储库中现有样本的列表。此功能将显示检测到的统计信息重置时间。

 

halo0root=# select hwr.show_samples('HaloTest',1); #1天

            show_samples             

-------------------------------------

 (117,"2023-08-01 18:00:02+08",t,,,)

 (118,"2023-08-01 18:05:02+08",t,,,)

 (119,"2023-08-01 18:10:02+08",t,,,)

 (120,"2023-08-01 18:15:02+08",t,,,)

 (121,"2023-08-01 18:20:01+08",t,,,)

 (122,"2023-08-01 18:25:02+08",t,,,)

 (123,"2023-08-01 18:30:01+08",t,,,)

 (124,"2023-08-02 09:05:01+08",t,,,)

 (125,"2023-08-02 09:06:23+08",t,,,)

(9 行记录)

 

4、报告

报告函数以 HTML 标记形式生成。

 

定期报告功能

get_report([server name,] start_id integer, end_id integer [, description text [, with_growth boolean]])  通过示例标识符生成报告。

get_report([server name,] time_range tstzrange [, description text [, with_growth boolean]]) 生成最短采样间隔的报告,涵盖提供time_range。

get_report([server name], baseline varchar(25) [, description text [, with_growth boolean]])  使用基线作为采样间隔生成报告。

get_report_latest([server name])  为两个最新示例生成报告。

 

函数参数:

Ø server  - 服务器名称。  如果省略,则假定为本地服务器。

Ø start_id - 间隔开始示例标识符。

Ø end_id - 间隔结束样本标识符。

Ø time_range - 时间范围(tstzrange 型)。

Ø baseline - 基线名称。

Ø with_growth - 一个标志,请求间隔扩展到最近的边界,并提供相关增长数据。默认值为假。

Ø description - 文本备忘录,它将作为报告描述包含在报告中。

 

通常 ,您可以使用以下命令手动生成HWR报告。

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

 

举个列子:

 


 

我们还可以根据自己的要求直接生成具有报告功能的报告。报告生成示例:

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

 

现在,我们可以使用任何 Web 浏览器查看报告文件了。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
5
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论