性能诊断的目的是找出影响性能目标的关键因素、给出性能调优的方向
遇到性能问题,首先会对问题进行诊断,一般从操作系统资源情况及数据库资源情况进行分析,定位问题原因
在数据库层面,相比我们所熟知的Oracle,KES也提供了超级实用的性能优化工具
1.1 性能优化工具三剑客
1.1 SYS_KWR: 自动负载信息库(Kingbase Auto Workload Repertories)
通过周期性自动记录性能统计相关的快照,分析出KingbaseES的操作系统运行环境、数据库时间组成、等待事件和TOP SQL等性能指标,为数据库性能调优提供指导。
PS:后续简称KWR
1.2 SYS_KSH:明细会话历史(Kingbase Session History)和相应的报告工具
sys_ksh 以每秒采样的方式进行会话和数据收集,并将采集数据放入内存的 Ringbuf 队列中,采集的数据主要包括:会话、应用、等待事件、命令类型、QueryId 等。其主要使用场景是:当前或历史某个时点,发生了什么样的异常,系统在执行/运行什么任务。用户可以使用该工具进行会话历史的分析,并针对报告呈现的性能瓶颈进行优化。
PS: 到此,就不得不说的
KWR及KSH的用途及适用场景,大家可用按需取用
1.3 SYS_KDDM:性能自动诊断和建议的报告
它基于 KWR 快照采集的性能指标和数据库时间模型(DB Time),自动分析等待事件、IO、网络、内存和 SQL 执行时间等,给出一系列性能优化建议。通过 KDDM 报告,能够实现数据库性能的快速调优。
PS:KDDM 存在于 KWR 插件里,和 KWR 一起对外提供服务。
接下来,我们来具体看看KWR的使用
2. KWR的大显身手
2.1 KWR的基本原理
数据库实例运行过程中不断产生一些统计数据,比如对某个表的访问次数,数据页的内存命中次数,某个等待事件发生的次数和总时间,SQL语句的解析时间等,这些统计数据被一个叫做 KWR collector 的后台性能监控进程周期性地(默认每小时)自动采集,存储到KWR快照库里面,这些快照默认保存8天,到期后那些旧的快照被自动删除。
2.2 KWR的为DBA提供性能参考,其价值包括
(1)自动采集操作系统统计信息,不需要额外的性能监控工具。
(2)感知数据库运行环境,排查数据库实例外部原因造成的性能问题。
(3)通过统一的 DB Time 模型,度量数据库关键活动耗时。
(4)通过 query ID 将 SQL 执行时间、等待时间和资源消耗关联起来,进行语句级分析。
(5)从多个维度(时间、IO、内存、锁、实例、库对象等)分析数据库实例的性能问题。
(6)自动生成快照,便于回溯之前发生的性能问题。
(7)为 KDDM 等自动诊断和建议提供基础数据。
2.3 KWR参数设置
KWR依赖内核统计模块采集性能统计数据,建议设置如下GUC参数,否则KWR报告里会缺失部分内容
在kingbase.conf 参数文件后添加如下参数:
track_sql = on
track_instance = on
track_io_timing = on
track_functions = 'all'
sys_kwr.track_objects = off
sys_kwr.track_os = on # KWR 1.4 新增参数
sys_stat_statements.track = 'top'
参数的说明如下:
track_sql:统计SQL时间、SQL等待事件、SQL IO,默认为off,建议开启。
track_instance:统计实例级IO、锁、关键活动,默认为off,建议开启。
track_io_timing:统计IO耗时,默认为off,建议开启。
track_functions:统计用户自定义函数使用情况,默认为'none',建议'all'。
sys_kwr.track_objects: 统计数据库对象使用情况,在sys_kwr1.7之前默认值为on,从sys_kwr1.7默认值更改为off,建议关闭。该参数需要手动添加。
sys_stat_statements.track: 设置 sys_stat_statements.track 控制哪个语句可以被该模块跟踪, 声明 'top' 来跟踪顶级(直接通过客户端发出)的语句,'all' 跟踪嵌套的语句,'none' 禁用语句状态收集。建议使用 'top'。
sys_kwr.enable:开启kwr自动快照默认为关。
设置完成后,重启数据库
[kingbase@dba236 ~]$ sys_ctl -D /data/Kingbase/kbs/data/ restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2025-02-16 13:37:40.726 CST [1356] LOG: config the real archive_command string as soon as possible to archive WAL files
2025-02-16 13:37:40.733 CST [1356] LOG: sepapower extension initialized
2025-02-16 13:37:40.740 CST [1356] 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-16 13:37:40.740 CST [1356] LOG: listening on IPv4 address "0.0.0.0", port 54321
2025-02-16 13:37:40.740 CST [1356] LOG: listening on IPv6 address "::", port 54321
2025-02-16 13:37:40.743 CST [1356] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321"
2025-02-16 13:37:40.804 CST [1356] LOG: redirecting log output to logging collector process
2025-02-16 13:37:40.804 CST [1356] HINT: Future log output will appear in directory "sys_log".
done
server started
别问为啥要加-D参数,问就是我遇到报错还没修复
2.4 KWR报告生成
第一次执行查询AWR快照及生成报错:
test=# CREATE EXTENSION sys_kwr;
CREATE EXTENSION
test=# SELECT * FROM perf.kwr_snapshots;
snap_id | snap_time | sess_count | snap_version
---------+-----------+------------+--------------
(0 rows)
创建KWR快照
test=# SELECT * FROM perf.create_snapshot();
create_snapshot
-----------------
1
(1 row)
操作数据库
test=# create table t_1(id int,name varchar2(50));
CREATE TABLE
test=# insert into t_1 values(1,'Guangzhou');
INSERT 0 1
test=# insert into t_1 values(2,'Chendu'),(3,'Shanghai');
INSERT 0 2
test=# select count(*) from t_1;
count
-------
3
(1 row)
再次创建KWR快照
test=# SELECT * FROM perf.create_snapshot();
create_snapshot
-----------------
2
(1 row)
查询KWR快照
test=# SELECT * FROM perf.kwr_snapshots;
snap_id | snap_time | sess_count | snap_version
---------+------------------------+------------+--------------
1 | 2025-02-16 13:57:00+08 | 1 | 1.8
2 | 2025-02-16 13:59:46+08 | 1 | 1.8
(2 rows)
生成KWR报告
test=# SELECT * FROM perf.kwr_report(1,2,'html');
2.5 KWR报告查看
报告生成完成后,若为指定路径,会默认存放到…/data/sys_log目录下,下载查看
首先可以查看到数据库相关信息,以及报告的起止时间
接下来会有个目录,可以先按关注查看具体(比如已知CPU使用过高,就可以先关注CPU的情况),也可以一项项具体分析
摘要信息
CPU、内存、IO等信息
然后到比较另外比较关注的慢SQL及锁等待等信息
PS:更多的信息,查看AWR报告详细
3. 常见报错
在未创建AWR插件之前,直接进行查询AWR快照,会提示报错
解决措施:
test=# CREATE EXTENSION sys_kwr;
CREATE EXTENSION
-- ## 再次查询无报错
test=# SELECT * FROM perf.kwr_snapshots;
snap_id | snap_time | sess_count | snap_version
---------+-----------+------------+--------------
(0 rows)
参考文档:
性能优化官方文档
KWR官方文档
https://bbs.kingbase.com.cn/docHtml?recId=d16e9a1be637c8fe4644c2c82fe16444&url=aHR0cHM6Ly9iYnMua2luZ2Jhc2UuY29tLmNuL2tpbmdiYXNlLWRvYy92OS9wZXJmb3IvcGVyZm9ybWFuY2Utb3B0aW1pemF0aW9uL2luZGV4Lmh0bWw