KingbaseES性能优化工具四剑客之KWR使用指南
一、KWR 简介
KingbaseES(简称KES)是一款国产企业级大型通用融合数据库产品。KES采用融合数据库架构,通过多语法体系一体化架构实现一套软件兼容Oracle、MySQL、SQL Server、PostgreSQL等多个异构数据库的语法。
使用过Oracle数据库的同学都知道,Oracle提供了很多工具辅助用户来监控性能,诊断分析数据库,其中Oracle Automatic Workload Repository (AWR)是重要的性能诊断工具之一。而KES也同样提供了类似的性能分析工具KWR。
KWR是KES自动负载信息库(Kingbase Auto Workload Repertories)的简称,它通过周期性自动记录性能统计相关的快照,分析出KES的操作系统运行环境、数据库时间组成、等待事件和TOP SQL等性能指标,为数据库性能调优提供指导。
KWR以插件的形式存在于KES产品中,目前最新版本是1.8。
备注:KingbaseES由低版本升级至V009R001C002B0014后,需尽快将KWR插件升级至1.8版本,否则自动快照和手工快照功能将无法使用,并且从1.6版本开始,KSH 合入进该插件,不在做为单独的插件使用。
二、KWR 基本原理
数据库实例运行过程中不断产生一些统计数据,比如对某个表的访问次数,数据页的内存命中次数,某个等待事件发生的次数和总时间,SQL语句的解析时间等,这些统计数据被一个叫做 KWR collector 的后台性能监控进程周期性地(默认每小时)自动采集,存储到KWR快照库里面,这些快照默认保存8天,到期后那些旧的快照被自动删除。
当出现性能问题的时候,可以通过指定时间段来查询相关快照列表,生成KWR报告,定位性能问题的根本原因。
其他性能组件比如 KDDM,基于 KWR 快照提供自动建议。
如果开启了KWR自动快照功能,会自动在kingbase库上创建sys_kwr插件。可以通过SQL语句在目标库上创建:
CREATE EXTENSION sys_kwr;
KWR依赖sys_stat_statements插件(1.11版本),该插件是内置插件,会在所有库上自动被创建。 以下是创建KWR插件后查到的信息:
三、KWR 作用
KWR通过自动采集操作系统和数据库实例的性能数据,将其存储为KWR快照,并依此来生成KWR报告为DBA性能调优提供参考,其价值包括:
- 自动采集操作系统统计信息,不需要额外的性能监控工具。
- 感知数据库运行环境,排查数据库实例外部原因造成的性能问题。
- 通过统一的DB Time模型,度量数据库关键活动耗时。
- 通过query ID将SQL执行时间、等待时间和资源消耗关联起来,进行语句级分析。
- 从多个维度(时间、IO、内存、锁、实例、库对象等)分析数据库实例的性能问题。
- 自动生成快照,便于回溯之前发生的性能问题。
- 为KDDM等自动诊断和建议提供基础数据。
四、KWR 创建及查看
KWR依赖内核统计模块采集性能统计数据,建议开启以下GUC参数,否则KWR报告里会缺失部分内容。
说明:GUC(Grand Unify Configuration)是KES的参数管理机制, KES的参数均通由此管理, 故也常常称配置参数为GUC参数。
1、配置 GUC 参数
要想使用 KWR 的报告功能,建议在 kingbase.conf 里添加以下参数:
shared_preload_libraries = 'liboracle_parser, sys_kwr, sys_stat_statements'
track_sql = on
track_instance = on
track_wait_timing = on
track_counts = on
track_io_timing = on
track_functions = 'all'
几个参数的说明如下:
- track_sql:统计SQL时间、SQL等待事件、SQL IO,默认为off,建议开启。
- track_instance:统计实例级IO、锁、关键活动,默认为off,建议开启。
- track_wait_timing:统计累积式等待事件的时间,默认为on,建议开启。
- track_counts:统计数据库活动,默认为on。
- track_io_timing:统计IO耗时,默认为off,建议开启。
- track_functions:统计用户自定义函数使用情况,默认为'none',建议'all'。
KWR依赖sys_stat_statements插件采集TOP SQL统计数据,建议开启以下GUC参数,否则会提示警告,且部分报告(Top SQL)没有内容:
sys_stat_statements.track = 'top'
- sys_stat_statements.track: 设置 sys_stat_statements.track 控制哪个语句可以被该模块跟踪, 声明 'top' 来跟踪顶级(直接通过客户端发出)的语句,'all' 跟踪嵌套的语句,'none' 禁用语句状态收集。建议使用 'top'。
KWR、KWR diff相关参数需要手动添加:
sys_kwr.enable = off
sys_kwr.topn = 20
sys_kwr.history_days = 8
sys_kwr.interval = 60
sys_kwr.language = 'chinese' -- KWR 1.3 新增参数
sys_kwr.track_objects = off
sys_kwr.track_os = on -- KWR 1.4 新增参数
sys_kwr.database = 'kingbase' -- KWR 1.8 新增参数
- sys_kwr.enable:开启kwr自动快照默认为关。
- sys_kwr.topn:显示kwr报告中排名前n条的信息,默认为20,最少为10,最多为100。
- sys_kwr.history_days:快照保留日期,默认为8天,最少1天,最多1000天。
- sys_kwr.interval:自动快照间隔,默认60分钟,最短10分钟,最长144000分钟(100天)。
- sys_kwr.language:KWR报告、KWR diff报告使用语言,默认为中文(chinese 或 chn),可选为英文(english 或eng)。
- sys_kwr.track_objects: 统计数据库对象使用情况,在sys_kwr1.7之前默认值为on,从sys_kwr1.7默认值更改为off,建议关闭。该参数需要手动添加。
- sys_kwr.track_os: 统计系统数据,默认为on,建议开启。该参数需要手动添加。
- sys_kwr.track_windows_os_info:Windows平台下是否跟踪操作系统统计信息,默认为on。开启该开关后,每次连接KWR插件所在数据库会消耗大约300毫秒来初始化Windows下的WMI库。
- sys_kwr.database:KWR 1.8新增参数,用于指定自动快照的数据库。配置该参数后,自动快照进程会连接目标数据库,并周期性创建KWR快照,同时采集包括数据库对象在内的全部性能统计指标。
- 参数为text类型,区分大小写,仅可配置一个数据库。
- 参数默认值为'kingbase',如果不设置,则系统仍然使用默认的kingbase库来创建自动快照。
说明:
- 要打开自动快照功能,需要将sys_kwr.enable设置为on。
- 任何情况下都可以执行:SELECT * FROM perf.create_snapshot(); 来手工创建快照。
- 自动快照默认在kingbase库上创建 sys_kwr 插件,可以使用GUC参数 sys_kwr.database 进行设置。
- shared_preload_libraries 配置参数用于指定在数据库服务器启动过程中应加载到内存中的共享库列表。shared_preload_libraries 里至少包含:sys_kwr, sys_stat_statements。Oracle兼容模式下还需要包含liboracle_parser,添加之后需要重启服务才能生效。
2、安装 sys_kwr 插件
CREATE EXTENSION sys_kwr;
可以使用\dx元命令查看当前数据库中已安装的扩展模块
3、重新加载参数文件
select sys_reload_conf();
4、查看参数是否生效
select name,setting,source,context,pending_restart,boot_val from sys_settings where name like 'track_%';
select name,setting,source,context,pending_restart,boot_val from sys_settings where name='sys_stat_statements.track';
select name,setting,source,context,pending_restart,boot_val from sys_settings where name like 'sys_kwr_%';
select name,setting,source,context,pending_restart,boot_val from sys_settings where name='shared_preload_libraries';
注意kingbase级别需要重启服务生效。
5、手工创建快照
创建快照,执行SQL后再次手工创建快照,就可以生成KWR报告了。
SELECT * FROM perf.create_snapshot(); -- 获得快照 1
CREATE TABLE IF NOT EXISTS t1(id int); -- 创建一个示例表
SELECT count(*) FROM t1; -- 执行一些SQL
SELECT * FROM perf.create_snapshot(); -- 获得快照 2
6、生成 KWR 报告
快照查询:
SELECT * FROM perf.kwr_snapshots;
生成全实例的TEXT版本报告
SELECT * FROM perf.kwr_report(1,2);
生成全实例的HTML版报告
SELECT * FROM perf.kwr_report(1,2, 'html');
生成指定数据库的TEXT版本报告,以test为例
SELECT * FROM perf.kwr_report(1,2, 'text','test');
生成指定数据库的HTML版报告,以test为例
备注:生成的KWR报告会自动保存到 DATA 目录下的 sys_log 子目录下。
如果想将生成KWR报告保存到指定的磁盘目录下,用kwr_report_to_file()函数,第4个参数指定文件全路径:
SELECT * FROM perf.kwr_report_to_file(1,2, 'html', '/home/kingbase/kwr1_2.html');
推荐使用HTML格式,因为它更便于阅读。
firefox /home/kingbase/kwr1_2.html
7、开启自动快照
只需要将sys_kwr.enable设置为on,就开启了自动快照功能。
后台进程 kwr collector每分钟检查最后一次快照的时间,跟当前的时间间隔是否大于sys_kwr.interval。如果大于则立刻创建新的快照,并更新最后快照时间。
如果本次自动快照没有创建成功,则在下一个检查周期(一分钟后)继续尝试创建快照。
SELECT * FROM perf.kwr_snapshots;
关闭自动快照,只需要将sys_kwr.enable设置为off。
8、查看 KWR 报告
KWR报告主要由三部分组成:
1.报告头:
这部分主要是列出数据库实例的版本、运行环境和快照信息。
2.报告摘要:
这是整个报告的精华所在,大部分的性能问题都能够从这部分报告里看到。看这部分内容的时候,如果有必要,还可以结合后面的详细报告具体分析问题。
这部分最重要的几个报告是:负载分析、实例效率百分比(目标 100%)、Top 10前台等待事件、主机环境统计(主机 CPU、IO、内存和网络)。
报告摘要部分报告列表:
- 负载分析
- 实例效率百分比(目标 100%)
- Top 10 前台等待事件
- Top 10 前台等待事件分类
- 主机 CPU
- 主机 IO
- 主机内存
- 主机网络
- IO 分析
- 内存统计
- SQL 语句数统计
3.报告主体:
报告主体提供了更加全面的性能指标,主要包括:DB Time模型、等待事件、内存统计、实例IO统计、锁活动统计、关键活动统计、SQL报文统计、TOP SQL统计、后台写统计、数据库对象统计和配置参数。
报告主体报告列表:
- CPU 统计
- 主机 CPU 详细
- 时间模型和等待事件统计
- 时间模型统计
- 前台等待事件分类
- 前台等待事件
- 后台等待事件
- 数据库执行时间
- SQL 报文执行时间
- 内存统计
- Top 10 共享内存统计
- 实例 IO 统计
- 实例 IO 按进程类型统计
- 实例 IO 按文件类型统计
- 实例 IO 按数据库名统计
- 实例 IO 按表空间统计
- 实例 IO 按数据库对象类型统计
- Top 10 读写的数据库对象统计
- 锁活动统计
- Top 10 请求次数的锁活动
- Top 10 等待时间的锁活动
- 关键活动统计
- 关键活动按执行次数统计
- 关键活动按执行时间统计
- Top SQL 统计
- 按数据库时间排序的 SQL 语句
- 按 CPU 时间排序的 SQL 语句
- 按解析时间排序的 SQL 语句
- 按计划时间排序的 SQL 语句
- 按执行时间排序的 SQL 语句
- 按执行次数排序的 SQL 语句
- 按返回元组数排序的 SQL 语句
- 按 I/O 时间排序的 SQL 语句
- 按逻辑读块数排序的 SQL 语句
- 按物理读块排序的 SQL 语句
- 按逻辑写块数排序的 SQL 语句
- 按物理写块数排序的 SQL 语句
- 按临时块数读写排序的 SQL 语句
- 按本地数据块使用排序的 SQL 语句
- 完整 SQL 列表
- 后台写统计
- 数据库统计
- 数据库对象统计
- 按顺序扫描页数排序的关系表
- 按逻辑读页数排序的关系表
- 按物理读页数排序的关系表
- 按 DML 行数排序的关系表
- 按命中率排序的关系表
- 按逻辑读页数排序的索引
- 按物理读页数排序的索引
- 按命中数排序的索引
- 存在未使用的索引
- 按执行时间排序的函数
- 按执行次数排序的函数
- 快照期间参数配置
9、快照管理
一般情况下,不需要手工管理已经生成的快照,KWR会在每次创建新的快照时,自动删除已经超过sys_kwr.history_days 天的快照数据,避免快照数据过多导致性能问题。
快照查询:
删除部分快照:
SELECT * FROM perf.drop_snapshots(1, 3);
清理全部快照:
SELECT * FROM perf.reset_snapshots();
五、总结
KWR工具很好用,详细的参数功能设置请参阅:KES V9 sys_kwr插件使用指南。注意修改配置文件前做好备份工作。