pg_profile(资源监控)

pg_profilePolarDB PostgreSQL版支持的一款第三方插件,能够统计目标数据库中资源密集型活动,来分析和优化数据库。此扩展基于PostgreSQL的统计视图和部分社区插件,完全由PL/pgSQL编写,无需任何外部库或软件。配合pg_cron插件可以实现资源密集活动的定期采集和监控。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.10.18.0及以上)。

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本号:

SELECT version();

注意事项

  • 采集数据需要使用到pg_stat_statementspg_stat_kcache插件,请确保它们已被添加到被采样数据库的shared_preload_libraries参数中(默认加载)。

    说明

    修改shared_preload_libraries参数方法请参见设置集群参数。修改该参数后集群将会重启,请在修改参数前做好业务安排,谨慎操作。

  • 在被采样的数据库中,必须创建pg_stat_statements插件。此外,可以选择创建pg_stat_kcache插件,以收集更多信息。

  • 存储采样信息将会占用磁盘空间,该插件有自动清理机制,请注意数据保存。

  • 一次采样较为耗时,无需频繁采样,推荐频率为每小时1~2次。

使用方法

说明

由于使用dblink的安全限制,profile数据库和server数据库仅可以创建在同一个PolarDB PostgreSQL版集群中。

以下将分别创建server数据库和profile数据库。

在采样时,profile数据库会向server数据库发出采样请求,server数据库收到请求后将自身的统计结果返回到profile数据库并存储在表中。这样就可以从profile数据库获取其他数据库的统计信息。

Server数据库

创建server数据库:

CREATE DATABASE server;

连接server数据库并创建统计信息插件:

\c server
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pg_stat_kcache;

Profile数据库

创建profile数据库:

CREATE DATABASE profile;

连接profile数据库并创建插件:

\c profile
CREATE EXTENSION IF NOT EXISTS pg_profile CASCADE;

创建采样连接

SELECT create_server(
   'server',
   'dbname=server channel_name=localhost user=<server数据库的高权限账号> password=<账号对应的密码>'
);

参数说明如下:

参数

示例值

说明

server

server

连接名,用户自定义。

dbname

server

数据库名。

channel_name

localhost

连接信息,当前仅支持localhost。

user

test_user

server数据库所在集群的高权限账号。

password

T123456!

账号对应的密码。

示例结果如下:

                                    show_servers
-------------------------------------------------------------------------------------
 (server,"dbname=server channel_name=localhost user=test_user password=****",t,)
(1 row)

修改采样连接信息

SELECT set_server_connstr(
   'server',
   'dbname=server channel_name=localhost user=<profile数据库的高权限账号> password=<账号对应的密码>'
);

参数说明如下:

参数

示例值

说明

server

server

连接名,无需修改。

dbname

server

数据库名。

channel_name

localhost

连接信息,固定为localhost。

user

test_user

server数据库所在集群的高权限账号。

password

T123456!

账号对应的密码。

初次数据采集

SELECT take_sample();

示例结果如下:

      take_sample
-------------------------
 (server,OK,00:00:02.81)
(1 row)

压测被采样库后再次采集

通过pgbench工具对被采样的server数据库进行压测:

pgbench -s 100 -i server -U test_user -h pc-****.pg.rds.aliyuncs.com -p 5432

参数说明如下:

参数

示例值

说明

-s

100

100表示在pgbench_accounts表中创建10,000,000行数据。

-i

server

待进行测试的数据库。

-U

test_user

server数据库所在集群的高权限账号。

-h

pc-****.pg.rds.aliyuncs.com

server数据库所在集群的连接地址。

-p

5432

集群端口,可根据控制台值具体填写。

连接到profile数据库再次进行数据采集:

SELECT take_sample();

查看采集数据:

SELECT * FROM show_samples('server');

示例结果如下:

sample |      sample_time       | sizes_collected | dbstats_reset | bgwrstats_reset | archstats_reset
--------+------------------------+-----------------+---------------+-----------------+-----------------
      1 | 2024-02-23 07:29:53+00 | t               |               |                 |
      2 | 2024-02-23 08:11:39+00 | t               |               |                 |

将采集结果生成报告

可以通过以下两种方式将采集结果导出到本地。

  • 方式一:通过客户端工具psql的交互式命令行,执行如下SQL,得到输出文件。

    \o report_1_2.html
    SELECT get_report('server',1,2);
  • 方式二:通过命令行使psql直接将结果输出到文件中。

    psql -Aqtc "SELECT get_report('server',1,2)" \
       -o report_server_1_2.html -d profile \
       -h <profile数据库所在集群的连接地址> \
       -p <数据库集群所在端口> \
       -U <profile数据库所在集群的高权限账号>