PG AWR工具推介说明

最近上线了一套PG,在日常运维的过程中发现了一个小问题。当我们知道某个时间点CPU达到80%的,想分析一下此时间段系统出于什么问题会异常,往往缺乏手段。在Oracle中,我们可以通过AWR报告来发现问题。听说PG也有类似AWR的工具,于是我们开始了找工具之旅。


pg_profile,这款工具是个战斗民族写的。我们之所以选择这款工具是因为它足够简单,和OracleAWR报告工作方式很像。而且它最大的优点是用纯粹pl/pgsql编写,勿需使用任何外部库或者软件。


接下来我们看下怎么安装和配置pg_profile,并通过报告分析问题。


一、数据库配置

首先需要配置数据库相关StatisticsCollector参数,具体配置参数如下:

track_activities = on

track_counts = on

track_io_timing = on

track_functions = all/p1


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


打开上述4个参数之后,还需要配置pg_stat_statements

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


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


上面参数修改稍为简单,因为基本上都是默认打开的。只有少数没开,打开也不需要重启。


二、下载安装pg_profile


1.下载安装文件上传到服务器。

在服务器解压文件,并存放到PG安装目录的extension文件夹下

tar xzf pg_profile-<version>.tar.gz --directory $(pg_config --sharedir)/extension


2.安装扩展

这里有两种方式安装,一种是公共模式安装,这种安装方式最简单。第二种是独立Schema安装,这种安装将在自己创建的Schema中建自己的表,视图,序列和函数,可以和其他用户有效的进行隔离。我选择了第二种安装方式。

postgres=# CREATE EXTENSION dblink;

postgres=# CREATE EXTENSIONpg_stat_statements;

postgres=# CREATE SCHEMA profile;

postgres=# CREATE EXTENSION pg_profileSCHEMA profile;


默认pg_profile需要使用dblink和pg_stat_statements扩展包,这两个属于系统自带插件,可选插件是pg_stat_kcache

还可以安装pg_stat_kcache数据,提供有关语句CPU使用率和文件系统负载的信息,因为是生产环境,我这里没有单独编译安装这个插件。


三、创建快照和生产报告

接下来我们可以执行函数创建快照。

postgres=# SELECT profile.snapshot();

snapshot      

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

(local,OK,00:00:01.08)


执行完成之后,可以通过profile.show_samples()函数,查看生成的快照。

postgres=# select profile.show_samples();

show_samples          

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

(1,"2020-10-15 16:46:37+08",,,)

(2,"2020-10-15 16:47:12+08",,,)

(3,"2020-10-15 16:47:24+08",,,)

(4,"2020-10-15 17:11:43+08",,,)

(5,"2020-10-15 17:16:26+08",,,)

(6,"2020-10-15 17:32:27+08",,,)

(7,"2020-10-15 17:57:29+08",,,)

(8,"2020-10-16 10:40:17+08",,,)

(9,"2020-10-16 11:00:55+08",,,)

(9 rows)


当前总共有9个快照,执行profile.get_report命令,取2个时间段就可以生成AWR报告了。如果要生产对比报告,可以执行profile.get_diffreport命令。

psql -qtc "select profile.get_report(8,9)"  --output awr_report_postgres_8_9.html


如果要每半个小时生成快照,需要把脚本放在contab下执行。

*/30 * * * *  psql -c 'SELECT profile.snapshot()' > /tmp/pg_awr.log  2>&1


四、浏览报告

报告输出如下所示,这里我修改了一下存储过程,稍微把标题改动了一下。大家有兴趣也可以自行修改想要的标题还有样式。


PG AWR工具推介说明


报告总共有6个部分:


第一部分是服务器统计。包含了数据库在此快照期间的统计信息,例如事务数、内存命中率、元组的操作统计等、数据库的调用次数等、数据库聚簇的统计信息,表空间的增长等等。


PG AWR工具推介说明


第二部分是我们熟悉的TopSQL。包括了执行时长、执行次数、执行消耗I/O、执行消耗的逻辑读等topN的排序,还包含了完整的SQL语句。

PG AWR工具推介说明


第三部分是Schema的对象信息。包含了Top对象的信息,类似于OracleAWR报告的segmentstatistics部分,从这里我们可以轻松定位DML最频繁的表、增长最快的表等等。

PG AWR工具推介说明

PG AWR工具推介说明


第四部分是用户函数统计。可以看到我们自建的to_char使用次数最多。

PG AWR工具推介说明


第五部分是Vacuum相关统计

PG AWR工具推介说明


第六部分是报告快照期间的参数设置

PG AWR工具推介说明


五、如何定制自己想要的指标

pg_profile的介绍就到这里,相对于Oracle的awr报告还是有一定的差距的。但是好在开源软件可以自行进行增强。当前执行快照的函数是take_sample(),当执行该函数的时候,会采集相关信息存入我们创建的schema的相关表中,如下图所示:

PG AWR工具推介说明


如果要增加新的指标,只需要创建相关表,增加与之相关的insert语句采集就可以了。

PG AWR工具推介说明

而get_report函数,则是生成html报告的函数,在这里需要把我们新增的一些指标给显示出来。


参考文档:

http://postgres.cn/docs/12/monitoring-stats.html

http://postgres.cn/docs/12/pgstatstatements.html

https://github.com/zubkov-andrei/pg_profile


上一篇:如何使用 Rust 来构建微服务?


下一篇:postgresql 安装和配置