pg-AWR工具(pg_profile)
目录什么是pg_profile
- 在postgres中,当遇到问题时,可能需要回顾不止一件事情来分析数据库或者整个集群,包括索引,I/O,CPU等
- pg_profile扩展是基于postgres的标准统计视图。它类似于Oracle AWR架构,和Oracle一样,它在指定时间生成快照,并切提供html格式来解释快照之间的统计数据
配置postgresql.conf
- pg_profile配置
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启用对用户定义函数使用的跟踪。
- 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字段的精确值。
上面参数修改稍为简单,因为基本上都是默认打开的。只有少数没开,打开也不需要重启。
下载并安装pg_profile
1、安装比较简单,可以直接将压缩包解压放入postgres的extension扩展目录下面即可
tar xzf pg_profile--0.3.4.tar.gz --directory $(pg_config --sharedir)/extension
2、安装扩展
这里有两种方式安装,一种是公共模式安装,这种安装方式最简单。第二种是独立Schema安装,这种安装将在自己创建的Schema中建自己的表,视图,序列和函数,可以和其他用户有效的进行隔离。
postgres=# CREATE EXTENSION dblink;
postgres=# CREATE EXTENSION pg_stat_statements;
postgres=# CREATE SCHEMA profile;
postgres=# CREATE EXTENSION pg_profile SCHEMA profile;
默认pg_profile需要使用dblink和pg_stat_statements扩展包,这两个属于系统自带插件,可选插件是pg_stat_kcache
还可以安装pg_stat_kcache数据,提供有关语句CPU使用率和文件系统负载的信息
创建快照生成报告
执行函数创建快照
postgres=# select * from take_sample();
server | result | elapsed
--------+--------+-------------
local | OK | 00:00:02.98
(1 row)
--也可以调用snapshot()来生成快照,pg_profile 0.1.2开始snapshot()函数重命名为take_sample()
执行完之后可以调用show_samples()函数,查看生成的快照
postgres=# select show_samples();
show_samples
---------------------------------
(1,"2021-11-09 11:47:01+08",,,)
(2,"2021-11-09 14:18:40+08",,,)
(3,"2021-11-10 13:56:55+08",,,)
(4,"2021-11-10 13:58:55+08",,,)
(5,"2021-11-10 14:15:58+08",,,)
(6,"2021-11-10 14:38:38+08",,,)
(7,"2021-11-10 15:50:53+08",,,)
(8,"2021-11-10 15:52:34+08",,,)
(9,"2021-11-10 16:37:18+08",,,)
(9 rows)
总共9个快照,执行get_report命令,任意两个时间段就可以生成AWR报告,如果要生产对比报告,可以使用get_diffreport命令
psql -qtc "select profile.get_report(1,2)" --output awr_report_postgres_1_2.html
每半个小时生成快照的方法:
*/30 * * * * psql -c 'SELECT profile.snapshot()' > tmp/pg_awr.log 2>&1
浏览报告
- 报告总共有六个部分
- 第一部分是服务器统计,包含了整个数据库再此快照期间的统计信息,例如事务数,内存名中率,元组的操作统计数据,以及数据库调用次数数据库聚簇的统计信息,表空间增长等等
- 第二部分是TopSQL,包括执行时长,次数,执行消耗的io,以及逻辑读等topN的排序,还包括完整的sql,根据Query ID可以查看具体的SQL。这里根据rows和executions都是10208可能是同一个事务生成
- 第三部分是Schema的对象统计,包含了Top对象的信息,类似OracleAWR报告的segmentstatistics部分,从这里我们可以定位到DML最频繁的表,增长最快的表等等
- 第四部分是函数的统计,可以看到调用的次数以及消耗的时间
- 第五部分是vacuum相关的统计
- 第六部分是报告快照期间的参数设置
总结
- 这个工具结合了pg_stat_statement可以分析具体的sql,最大的作用是用来抓取数据库异常的这段时间的详细数据,用于辅助分析数据库问题