暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

金仓 KES 性能优化工具 KWR 入门

原创 Lucifer三思而后行 2025-02-07
947

大家好,这里是公众号 DBA学习之路,致力于分享数据库领域相关知识。

目录

前言

数据库性能是应用系统高效运行的基石,因此性能调优至关重要。比如在 Oracle 数据库中,DBAers 通常使用 AWR、ASH、ADDM 等性能优化工具进行分析与优化数据库。

在金仓数据库 KingbaseES 中也为用户提供了对应的优化工具(三剑客):

  • KWR(Kingbase Auto Workload Repertories)
  • KSH
  • KDDM

通过以上性能优化工具,可以轻松驾驭性能调优。本文主要讲一下 KWR 工具的使用!

KWR 介绍

SYS_KWR 是 KingbaseES 自动负载信息库(Kingbase Auto Workload Repertories)的简称,它通过周期性自动记录性能统计相关的快照,分析出 KingbaseES 的操作系统运行环境、数据库时间组成、等待事件和 TOP SQL 等性能指标,为数据库性能调优提供指导。

KWR 以插件的形式存在于 KingbaseES 产品中,目前最新版本是 1.8。

📢 注意:KingbaseES 由低版本升级至 V009R001C002B0014 后,需尽快将 KWR 插件升级至 1.8 版本,否则
自动快照和手工快照功能将无法使用。

KWR 的基本原理:数据库实例运行过程中不断产生一些统计数据,比如对某个表的访问次数,数据页的内存命中次数,某个等待事件发生的次数和总时间,SQL 语句的解析时间等,这些统计数据被一个叫做 KWR collector 的后台性能监控进程周期性地(默认每小时)自动采集,存储到 KWR 快照库里面,这些快照默认保存 8 天,到期后那些旧的快照被自动删除。

当出现性能问题的时候,可以通过指定时间段来查询相关快照列表,生成 KWR 报告,定位性能问题的根本原因。

KWR 通过自动采集操作系统和数据库实例的性能数据,将其存储为 KWR 快照,并依此来生成 KWR 报告为
DBA 性能调优提供参考,其价值包括:

  • 自动采集操作系统统计信息,不需要额外的性能监控工具。
  • 感知数据库运行环境,排查数据库实例外部原因造成的性能问题。
  • 通过统一的 DB Time 模型,度量数据库关键活动耗时。
  • 通过 query ID 将 SQL 执行时间、等待时间和资源消耗关联起来,进行语句级分析。
  • 从多个维度(时间、IO、内存、锁、实例、库对象等)分析数据库实例的性能问题。
  • 自动生成快照,便于回溯之前发生的性能问题。
  • 为 KDDM 等自动诊断和建议提供基础数据。

开启 KWR

开启 KWR 插件需要配置 kingbase.conf 文件,打开统计开关:

[kingbase@kesv9:/data]$ vi /data/kingbase.conf ## 添加如下参数 ## shared_preload_libraries 里至少包含:sys_kwr, sys_stat_statements shared_preload_libraries = 'liboracle_parser, sys_kwr, sys_stat_statements' ## 配置 GUC 参数,KWR 依赖内核统计模块采集性能统计数据,建议开启以下 GUC 参数,否则 KWR 报告里会缺失部分内容 ## 统计 SQL 时间、SQL 等待事件、SQL IO,默认为 off,建议开启 track_sql = on ## 统计实例级 IO、锁、关键活动,默认为 off,建议开启 track_instance = on ## 统计累积式等待事件的时间,默认为 on,建议开启 track_wait_timing = on ## 统计数据库活动,默认为 on track_counts = on ## 统计 IO 耗时,默认为 off,建议开启 track_io_timing = on ## 统计用户自定义函数使用情况,默认为’none’,建议’all’ track_functions = 'all' ## 设置 sys_stat_statements.track 控制哪个语句可以被该模块跟踪,声明’top’ 来跟踪顶级(直接通过客户端发出)的语句,’all’ 跟踪嵌套的语句,’none’ 禁用语句状态收集,建议使用’top’ sys_stat_statements.track = 'top' ## 统计数据库对象使用情况,在 sys_kwr1.7 之前默认值为 on,从 sys_kwr1.7 默认值更改为 off,建议关闭。该参数需要手动添加 ## sys_kwr.track_objects = off ## 统计系统数据,默认为 on,建议开启。该参数需要手动添加 sys_kwr.track_os = on ## 开启 kwr 自动快照,默认为关 sys_kwr.enable = on ## 显示 kwr 报告中排名前 n 条的信息,默认为 20,最少为 10,最多为 100 sys_kwr.topn = 10 ## 快照保留日期,默认为 8 天,最少 1 天,最多 1000 天 sys_kwr.history_days = 15 ## 自动快照间隔,默认 60 分钟,最短 10 分钟,最长 144000 分钟(100 天) sys_kwr.interval = 30 ## KWR 报告、KWR diff 报告使用语言,默认为中文(chinese 或 chn),可选为英文 (english 或 eng) sys_kwr.language = chinese ## Windows 平台下是否跟踪操作系统统计信息,默认为 on。开启该开关后,每次连接 KWR 插件所在数据库会消耗大约 300 毫秒来初始化 Windows 下的 WMI 库。 sys_kwr.track_windows_os_info = off ## KWR 1.8 新增参数,用于指定自动快照的数据库。配置该参数后,自动快照进程会连接目标数据库,并周期性创建 KWR 快照,同时采集包括数据库对象在内的全部性能统计指标。 ## 参数为 text 类型,区分大小写,仅可配置一个数据库。 ## 参数默认值为’kingbase’,如果不设置,则系统仍然使用默认的 kingbase 库来创建自动快照。 sys_kwr.database = 'kingbase'

重启数据库服务器:

[kingbase@kesv9:/data]$ sys_ctl restart 等待服务器进程关闭 .... 完成 服务器进程已经关闭 等待服务器进程启动 ....2025-02-07 10:40:47.773 CST [3428] LOG: config the real archive_command string as soon as possible to archive WAL files 2025-02-07 10:40:47.803 CST [3428] LOG: sepapower extension initialized 2025-02-07 10:40:47.809 CST [3428] LOG: starting KingbaseES V009R001C002B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit 2025-02-07 10:40:47.809 CST [3428] LOG: listening on IPv4 address "0.0.0.0", port 54321 2025-02-07 10:40:47.809 CST [3428] LOG: listening on IPv6 address "::", port 54321 2025-02-07 10:40:47.811 CST [3428] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321" 2025-02-07 10:40:47.955 CST [3428] LOG: redirecting log output to logging collector process 2025-02-07 10:40:47.955 CST [3428] HINT: Future log output will appear in directory "sys_log". 完成 服务器进程已经启动

使用 KWR

通过 KSQL 连接,创建 KWR 插件,创建快照,执行 SQL 后再次创建快照:

[kingbase@kesv9:/data]$ ksql test system -- 创建 kwr 插件 test=# CREATE EXTENSION sys_kwr; -- 获得快照 1 test=# SELECT * FROM perf.create_snapshot(); -- 创建一个示例表 test=# CREATE TABLE IF NOT EXISTS t1(id int); -- 执行一些 SQL test=# INSERT INTO t1 values(1),(2),(3); test=# SELECT count(*) FROM t1; -- 获得快照 2 test=# SELECT * FROM perf.create_snapshot(); -- 查看快照 test=# SELECT * FROM perf.kwr_snapshots;

生成全实例的 TEXT 版本 KWR 报告:

test=# SELECT * FROM perf.kwr_report(1,2); -- 生成指定数据库的 TEXT 版本报告,以 kingbase 为例: -- test=# SELECT * FROM perf.kwr_report(1,9, 'text','kingbase');

部分内容显示效果如下:

生成全实例的 HTML 版报告:

test=# SELECT * FROM perf.kwr_report(1,2, 'html'); -- 可以使用以下 SQL 函数将生成的 html 文件保存到指定文件路径 -- test=# SELECT * FROM perf.kwr_report_to_file(1,2, 'html', '/home/kingbase/kwr.html'); -- 生成指定数据库的 HTML 版报告,以 kingbase 为例 -- test=# SELECT * FROM perf.kwr_report(1,9, 'html', 'kingbase');

📢 注意:生成的 KWR 报告会自动保存到 DATA 目录下的 sys_log 子目录下。

推荐使用 HTML 格式,因为它更便于阅读:

查看 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 行数排序的关系表
    • 按命中率排序的关系表
    • 按逻辑读页数排序的索引
    • 按物理读页数排序的索引
    • 按命中数排序的索引
    • 存在未使用的索引
    • 按执行时间排序的函数
    • 按执行次数排序的函数

写在最后

金仓数据库 KWR 大概就介绍到这了,算是一个入门,后续更多细节需要自行探索!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论