前言
今年6月30号华为公司开源了openGauss数据库。作为新的国产数据库,当前熟悉openGauss数据库的人还比较少,文档内容也不够丰富,相关生态也是在起步阶段。
虽然openGauss是基于PostgreSQL早期版本的内核,但是华为在这个数据库里做了大量优化和新功能开发。所以相对于原生PostgreSQL,华为openGauss更适合商业化使用。
使用商业数据库Oracle的用户肯定很熟悉AWR报告这种性能采集和分析工具。用户可以挑选时间段来生成整个系统的运行报表,从而增加对数据库的洞察力。而openGauss也提供了与此类似的WDR工具。
性能快照
openGauss的WDR报告工具实现方式和Oracle差不多,也是通过定时采集数据库当前的性能数据并保存在数据库中,然后通过计算两次快照之间的性能数据增量,生成html格式的网页版报告。因此第一步是采集快照。
快照来源
相对于原生PG,openGauss内部增加了schema是DBE_PERF的性能视图。DBE_PERF Schema内视图主要用来诊断性能问题,也是WDR Snapshot的数据来源。数据库安装后,默认只有初始用户和监控管理员具有模式dbe_perf的权限。
创建快照后,WDR的快照数据会存放在SNAPSHOT模式下面。其中snapshot.snapshot表中记录了每一次生成snapshot的信息。
WDR快照相关参数
首先学习一下数据库内部和WDR相关的参数。
enable_wdr_snapshot
参数说明:是否开启数据库监控快照功能。
该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。
取值范围:布尔型
on:打开数据库监控快照功能。
off:关闭数据库监控快照功能。
默认值:off
wdr_snapshot_retention_days
参数说明:系统中数据库监控快照数据的保留天数,超过设置的值之后,系统每隔wdr_snapshot_interval时间间隔,清理snapshot_id最小的快照数据。
该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。
取值范围:整型,1~8。
默认值:8
wdr_snapshot_query_timeout
参数说明:系统执行数据库监控快照操作时,设置快照操作相关的sql语句的执行超时时间。如果语句超过设置的时间没有执行完并返回结果,则本次快照操作失败。
该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。
取值范围:整型,100~INT_MAX(秒)。
默认值:100s
wdr_snapshot_interval
参数说明:后台线程Snapshot自动对数据库监控数据执行快照操作的时间间隔。
该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。
取值范围:整型,10~60(分钟)。
默认值:1h
参数里面enable_wdr_snapshot是总开关,无论是自动采集还是手工采集性能快照,都需要把这个参数打开。wdr_snapshot_interval是自动采集周期,建议按照最频繁的方式设置10分钟一次。
开启性能快照
首先设置enable_wdr_snapshot:
gs_guc reload -Nall -I all -c "enable_wdr_snapshot=on"
查看snapshot表:
gs_guc reload -Nall -I all -c "select * from snapshot.snapshot"
查看高斯的日志,发现报错:
2020-07-13 13:55:23.160,"dn_6001_6002","omm","postgres",140370675496704,"localhost",5f0bd7ab.5017,1506,"",2020-07-1311:40:27 HKT,5/0,0,3940649673949197,"BACKEND",LOG,00000,"WDRsnapshot start",,,,,,,,,"dn_6001"
2020-07-1313:55:24.759,"dn_6001_6002","omm","postgres",140370675496704,"localhost",5f0bd7ab.5017,1507,"",2020-07-1311:40:27HKT,5/270,87796,3940649673949197,"BACKEND",ERROR,0A000,"unsupportedview for memory protection feature is disabled.",,,,,"SQL statement ""INSERTINTO snapshot.snap_memory_node_detail(snapshot_id,""snap_nodename"" , ""snap_memorytype"", ""snap_memorymbytes"" ) select 168,""nodename"" , ""memorytype"" ,""memorymbytes"" fromdbe_perf.memory_node_detail""",,,,"dn_6001"
2020-07-13 13:55:24.759,"dn_6001_6002","omm","postgres",140370675496704,"localhost",5f0bd7ab.5017,1508,"",2020-07-1311:40:27HKT,5/270,87796,3940649673949197,"BACKEND",WARNING,01000,"WDRsnapshot failed",,,,,,,,,"dn_6001
验证确实源表有问题:
[omm@gsnode1 ~]$gsql -d postgres -p 26000 -c"select * from dbe_perf.memory_node_detail"
ERROR: unsupported view for memory protectionfeature is disabled.
这个问题看起来和memory protection有关系。把参数enable_memory_limit打开:
[omm@gsnode1 ~]$gs_guc set -N all -I all -c "enable_memory_limit=on"
Begin to performgs_guc for all datanodes.
Total instances: 2.Failed instances: 0.
Success to performgs_guc!
然而发现参数没有生效。查看高斯的文档发现:
enable_memory_limit
参数说明:启用逻辑内存管理模块。
该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。
取值范围:布尔型
· on表示启用逻辑内存管理模块。
· off表示不启用逻辑内存管理模块。
默认值:on
须知:若max_process_memory-sharedbuffer-cstore buffers少于2G,openGauss强制把enable_memory_limit设置为off。
看来是内存不够的问题,我通过设置max_process_memory-sharedbuffer-cstore buffers超过2GB也是不行的,于是我调整了下面这些参数:
gs_guc set -N all -I all -c "max_process_memory=4GB"
gs_guc set -N all -I all -c "shared_buffers=256MB"
gs_guc set -N all -I all -c "cstore_buffers=128MB"
gs_guc set -N all -I all -c"bulk_write_ring_size=128MB"
gs_guc set -N all -I all -c"cstore_backwrite_max_threshold=128MB"
重启实例后,enable_memory_limit终于设置成功。
手动采集性能快照
除了系统会按照wdr_snapshot_interval设置的周期去生成wdr的snapshot数据,用户还可以手工发起snapshot采集:
[omm@gsnode1 db1]$gsql -d postgres -p 26000 -c"select create_wdr_snapshot()"
create_wdr_snapshot
-----------------------------------------
WDR snapshot request has been submitted
(1 row)
如果没有激活WDR参数,手工也是没法创建报告的。
[omm@gsnode1 db1]$gsql -d postgres -p 26000 -c"select create_wdr_snapshot()"
WARNING: GUC parameter 'enable_wdr_snapshot' is off
CONTEXT: referenced column: create_wdr_snapshot
create_wdr_snapshot
----------------------------------------
WDR snapshot request can't be executed
(1 row)
生成WDR报告
要生成WDR的报告,需要选择起始的snapshot id,这样数据依据两次snapshot的差异生成报告。Snapshot信息存储在snapshot.snapshot里面:
[omm@gsnode1db1]$ gsql -d postgres -p 26000 -c "select * fromsnapshot.snapshot"
\ snapshot_id| start_ts | end_ts
-------------+-------------------------------+-------------------------------
280 | 2020-07-13 15:17:41.268708+08 |2020-07-13 15:17:43.277783+08
281 | 2020-07-13 15:22:01.889681+08 |2020-07-13 15:22:03.803941+08
(2 rows)
获取到snapshot的id后,使用generate_wdr_report来导出报告。
generate_wdr_report(begin_snap_idOid, end_snap_id Oid, int report_type, int report_scope, int node_name)
描述:基于两个snapshot生成系统诊断报告。
返回值类型:record
generate_wdr_report参数说明
参数 | 说明 | 取值范围 |
begin_snap_id | 生成某段时间内性能诊断报告的开始snapshotid。 | - |
end_snap_id | 结束snapshot的id,默认end_snap_id大于begin_snap_id。 | - |
report_type | 指定生成report的类型。 |
|
report_scope | 指定生成report的范围。 | node:openGauss中的节点。 |
node_name | 在“report_scope”指定为“node”时,需要把该参数指定为对应节点的名称。 | - |
生成报告:
gsql -d postgres -p26000 -q -c "selectgenerate_wdr_report(280,281,'all','cluster',null)" -t -o wdr_report.html
注意,这个函数前两个参数比较简单,是起始snapshot id。第三个参数是字符串类型,第四个参数我只有设置为‘cluster‘才成功,其他都没有设置成功。
后语
整个测试过程中还是遇到了不少问题。一方面是在启用WDR报告的时候发现enable_memory_limit缺少资源的问题。另一方面是生成WDR报告的generate_wdr_report用法很痛苦,官方文档说明有错误。不过最终这些问题都算是解决了。
生产中如果启用WDR报告,还需要关注下每次采集时的性能影响,SNAPSHOT下的表占用空间增长情况,最后调整合适的采集周期和清理策略。




