WDR(Workload Diagnosis Report)基于两次不同时间点系统的性能快照数据, 生成这两个时间点之间的性能表现报表,用于诊断数据库内核的性能故障。
WDR主要依赖两个组件:
vi postgresql.conf
enable_wdr_snapshot=on
enable_resource_track=on
disable_memory_protect=off
gs_guc reload
$ gs_guc reload -N all -I all -c "enable_wdr_snapshot=on"
postgres=# select name,setting from pg_settings where name like '%wdr%';
name | setting
-----------------------------+---------
enable_wdr_snapshot | on -- 开启数据库监控快照功能
wdr_snapshot_interval | 60 -- 后台Snapshot线程执行监控快照的时间间隔,默认60分钟
wdr_snapshot_query_timeout | 100 -- 快照操作相关的sql语句的执行超时时间
wdr_snapshot_retention_days | 8 -- 系统中数据库监控快照数据的保留天数
WDR Snasphot在启动后,会在用户表空间"pg_default",数据库"postgres"下新建schema “snapshot”,用于持久化WDR快照数据。
⚠️:WDR报告生成操作均在postgres数据库下操作进行
postgres=# show enable_resource_track;
enable_resource_track
----------------------
on
(1 row)
⚠️:确认开启资源实时监控功能,否则不会纪录SQL相关信息,导致导出的WDR报告SQL信息缺失
⚠️:配置为0表示不启用unique sql信息收集功能,会导致导出的WDR报告SQL信息缺失
postgres=# show disable_memory_protect;
disable_memory_protect
----------------------
off
(1 row)
节点内存的变化信息没采集到信息,memory protect关闭会导致无法查询dbe_perf.global_memory_node_detail视图。 而WDR的内存统计数据(snapshot.snap_global_memory_node_detail)则来源于该视图。
记录当前系统中存储的WDR快照信息
postgres=# \d snapshot.snapshot
Table "snapshot.snapshot"
Column | Type | Modifiers
-------------+--------------------------+-----------
snapshot_id | bigint | not null -- WDR快照序列号
start_ts | timestamp with time zone | -- WDR快照的开始时间
end_ts | timestamp with time zone | -- WDR快照的结束时间
记录所有表的WDR快照信息
postgres=# \d snapshot.tables_snap_timestamp
Table "snapshot.tables_snap_timestamp"
Column | Type | Modifiers
-------------+--------------------------+-----------
snapshot_id | bigint | not null -- WDR快照序列号
db_name | text | -- WDR snapshot对应的database
tablename | text | -- WDR snasphot对应的table
start_ts | timestamp with time zone | -- WDR快照的开始时间
end_ts | timestamp with time zone | -- WDR快照的结束时间
WDR的数据表保存在snapshot这个schema下以snap_开头的表,其数据来源于dbe_perf这个schema内的视图
postgres=# select relname from pg_class where relname like '%snap_%';
----------------------------------------------------------------------------------------------------------------
snapshot.tables_snap_timestamp -- 记录所有存储的WDR快照中数据库、表对象、数据采集的开始、结束时间
snapshot.snapshot -- 记录当前系统中存储的WDR快照数据的索引信息、开始、结束时间
snapshot.snapshot_pkey -- snapshot.snapshot表的primary key
snapshot.snap_seq -- 序列
snapshot.snap_global_os_runtime -- 操作系统运行状态信息
snapshot.snap_global_os_threads -- 线程状态信息
snapshot.snap_global_instance_time -- 各种时间消耗信息(时间类型见instance_time视图)
snapshot.snap_summary_workload_sql_count -- 各数据库主节点的workload上的SQL数量分布
snapshot.snap_summary_workload_sql_elapse_time -- 数据库主节点上workload(业务)负载的SQL耗时信息
snapshot.snap_global_workload_transaction -- 各节点上的workload的负载信息
snapshot.snap_summary_workload_transaction -- 汇总的负载事务信息
snapshot.snap_global_thread_wait_status -- 工作线程以及辅助线程的阻塞等待情况
snapshot.snap_global_memory_node_detail -- 节点的内存使用情况
snapshot.snap_global_shared_memory_detail -- 共享内存上下文的使用情况
snapshot.snap_global_stat_db_cu -- 数据库的CU命中情况,可以通过gs_stat_reset()进行清零
snapshot.snap_global_stat_database -- 数据库的统计信息
snapshot.snap_summary_stat_database -- 汇总的数据库统计信息
snapshot.snap_global_stat_database_conflicts -- 数据库冲突状态的统计信息
snapshot.snap_summary_stat_database_conflicts -- 汇总的数据库冲突状态的统计信息
snapshot.snap_global_stat_bad_block -- 表、索引等文件的读取失败信息
snapshot.snap_summary_stat_bad_block -- 汇总的表、索引等文件的读取失败信息
snapshot.snap_global_file_redo_iostat -- Redo(WAL)相关统计信息
snapshot.snap_summary_file_redo_iostat -- 汇总的Redo(WAL)相关统计信息
snapshot.snap_global_rel_iostat -- 数据对象IO统计信息
snapshot.snap_summary_rel_iostat -- 汇总的数据对象IO统计信息
snapshot.snap_global_file_iostat -- 数据文件IO统计信息
snapshot.snap_summary_file_iostat -- 汇总的数据文件IO统计信息
snapshot.snap_global_replication_slots -- 复制节点的信息
snapshot.snap_global_bgwriter_stat -- 后端写进程活动的统计信息
snapshot.snap_global_replication_stat -- 日志同步状态信息
snapshot.snap_global_transactions_running_xacts -- 各节点运行事务的信息
snapshot.snap_summary_transactions_running_xacts -- 汇总各节点运行事务的信息
snapshot.snap_global_transactions_prepared_xacts -- 当前准备好进行两阶段提交的事务的信息
snapshot.snap_summary_transactions_prepared_xacts -- 汇总的当前准备好进行两阶段提交的事务的信息
snapshot.snap_summary_statement -- SQL语句的全量信息
snapshot.snap_global_statement_count -- 当前时刻执行的DML/DDL/DQL/DCL语句统计信息
snapshot.snap_summary_statement_count -- 汇总的当前时刻执行的DML/DDL/DQL/DCL语句统计信息
snapshot.snap_global_config_settings -- 数据库运行时参数信息
snapshot.snap_global_wait_events -- event等待相关统计信息
snapshot.snap_summary_user_login -- 用户登录和退出次数的相关信息
snapshot.snap_global_ckpt_status -- 实例的检查点信息和各类日志刷页情况
snapshot.snap_global_double_write_status -- 实例的双写文件的情况
snapshot.snap_global_pagewriter_status -- 实例的刷页信息和检查点信息
snapshot.snap_global_redo_status -- 实例的日志回放情况
snapshot.snap_global_rto_status -- 极致RTO状态信息
snapshot.snap_global_recovery_status -- 主机和备机的日志流控信息
snapshot.snap_global_threadpool_status -- 节点上的线程池中工作线程及会话的状态信息
snapshot.snap_statement_responsetime_percentile -- SQL响应时间P80、P95分布信息
snapshot.snap_global_statio_all_indexes -- 数据库中的每个索引行、显示特定索引的I/O的统计
snapshot.snap_summary_statio_all_indexes -- 汇总的数据库中的每个索引行、显示特定索引的I/O的统计
snapshot.snap_global_statio_all_sequences -- 数据库中每个序列的每一行、显示特定序列关于I/O的统计
snapshot.snap_summary_statio_all_sequences -- 汇总的数据库中每个序列的每一行、显示特定序列关于I/O的统计
snapshot.snap_global_statio_all_tables -- 数据库中每个表(包括TOAST表)的I/O的统计
snapshot.snap_summary_statio_all_tables -- 汇总的数据库中每个表(包括TOAST表)的I/O的统计
snapshot.snap_global_stat_all_indexes -- 数据库中的每个索引行,显示访问特定索引的统计
snapshot.snap_summary_stat_all_indexes -- 汇总的数据库中的每个索引行,显示访问特定索引的统计
snapshot.snap_summary_stat_user_functions -- 汇总的数据库节点用户自定义函数的相关统计信息
snapshot.snap_global_stat_user_functions -- 用户所创建的函数的状态的统计信息
snapshot.snap_global_stat_all_tables -- 每个表的一行(包括TOAST表)的统计信息
snapshot.snap_summary_stat_all_tables -- 汇总的每个表的一行(包括TOAST表)的统计信息
snapshot.snap_class_vital_info -- 校验相同的表或者索引的Oid是否一致
snapshot.snap_global_record_reset_time -- 重置(重启,主备倒换,数据库删除)openGauss统计信息时间
snapshot.snap_summary_statio_indexes_name -- 表snap_summary_statio_all_indexes的索引
snapshot.snap_summary_statio_tables_name -- 表snap_summary_statio_all_tables的索引
snapshot.snap_summary_stat_indexes_name -- 表snap_summary_stat_all_indexes的索引
snapshot.snap_class_info_name -- 表snap_class_vital_info的索引
(66 rows)
----------------------------------------------------------------------------------------------------------------
-- 当开启enable_wdr_snapshot参数时,数据库默认每小时自动执行一次snapshot操作。
-- 当然特定情况下,也可以手动使用函数创建snapshot,如:select create_wdr_snapshot();
postgres=# select * from snapshot.snapshot;
snapshot_id | start_ts | end_ts
-------------+-------------------------------+-------------------------------
1 | 2022-07-12 05:59:09.337877+08 | 2022-07-12 05:59:10.249162+08
2 | 2022-07-12 06:59:10.3209+08 | 2022-07-12 06:59:11.229808+08
3 | 2022-07-12 07:59:10.426882+08 | 2022-07-12 07:59:11.340277+08
4 | 2022-07-12 08:59:10.534251+08 | 2022-07-12 08:59:11.447762+08
5 | 2022-07-12 09:59:11.448225+08 | 2022-07-12 09:59:26.121124+08
postgres=# select * from pg_node_env;
node_name | host | process | port | installpath | datapath | log_directory
-----------+--------------+---------+-------+--------------+-------------------+---------------------------------
node1 | 192.168.56.101 | 9442 | 26000 | /gaussdb/app | /gaussdb/data/db1 | /gaussdb/log/omm/pg_log/node1
postgres=# \a \t \o /gaussdb/WDR_20220712.html
参数说明如下:
postgres=# select generate_wdr_report(1,2,'all','node','node1');
函数说明:generate_wdr_report()
-- 语法
select generate_wdr_report(begin_snap_id bigint, end_snap_id bigint, report_type cstring, report_scope cstring, node_name cstring);
-- 选项:
begin_snap_id:查询时间段开始的snapshot的id(表snapshot.snaoshot中的snapshot_id)
end_snap_id: 查询时间段结束snapshot的id。默认end_snap_id大于begin_snap_id(表snapshot.snaoshot中的snapshot_id)
report_type: 指定生成report的类型。例如,summary/detail/all,其中:summary[汇总数据]/detail[明细数据]/all[包含summary和detail]
report_scope: 指定生成report的范围,可以为cluster或者node,其中:cluster是数据库级别的信息,node是节点级别的信息。
node_name: 当report_scope指定为node时,需要把该参数指定为对应节点的名称。当report_scope为cluster时,该值可以省略或者指定为空或NULL。node[节点名称]、cluster[省略/空/NULL]
⚠️:用于生成报告的两个快照应满足以下条件:
postgres=# \o \a \t
相关学习内容:
云数据库 GaussDB (for openGauss)文档:
https://support.huaweicloud.com/devg-opengauss/opengauss_devg_1266.html
参考文章:
https://www.modb.pro/db/59697