https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys-ksh
sys_stat_activity 里记录的等待事件是瞬时信息,没有对等待事件的时间进行累计,所以 KingbaseES 在 V8R6 中引入了明细会话历史(Kingbase Session History)和相应的报告工具。用户可以使用该工具进行会话历史的分析,并针对报告呈现的性能瓶颈进行优化。
sys_ksh 以每秒采样的方式进行会话和数据收集,并将采集数据放入内存的 Ringbuf 队列中,采集的数据主要包括:会话、应用、等待事件、命令类型、QueryId 等。其主要使用场景是:当前或历史某个时点,发生了什么样的异常,系统在执行/运行什么任务。
KSH 功能已经在 KWR 插件中实现,当KWR插件创建后就可以使用该功能。
sys_ksh 的参数在 kingbase.conf 中设置,典型用法可能是:
#kingbase.conf
shared_preload_libraries = 'liboracle_parser, sys_stat_statements, sys_kwr'
sys_stat_statements.track = 'top' # default = 'none'
sys_kwr.collect_ksh = on # default = off
KSH 相关参数:
track_activities:跟踪活动会话的等待事件、执行SQL、状态等,默认:on
sys_stat_statements.max:设置 sys_stat_statement 跟踪的最大语句数,默认:5000
sys_kwr.collect_ksh:启用或禁用 sys_ksh 数据收集,默认:关闭
sys_kwr.ringbuf_size:设置 sys_ksh ringbuf 大小,在内存中可以存多少条数据,默认:100000
sys_kwr.history_days:设置最大的 sys_ksh 历史数据存储,在磁盘上存储的时间,默认:8天
sys_kwr.language:KSH 报告展示中文/英语信息,默认:中文
注:采集报告需要在开启:track_activities(默认已开启),并设定 sys_kwr.collect_ksh = on 才可以查看报告。开启该参数会有一定的性能损耗。
为了确保 KSH 能够采集到活动会话的信息,需要给数据库系统施加一些负载,比如用 TPCC、sysbench、loadrunner 等工具对其进行压测。
也可以通过以下语句给当前会话产生一个 TimeOut 等待事件,以便能够查看无负载情况下的 KSH 报告:
SELECT sys_sleep(2);
SELECT * FROM perf.ksh_report();
当 KSH 没有采集到数据会提示:
SELECT * FROM perf.ksh_report();
KSH 报告中的 queryid 依赖于 sys_stat_statements 表,当 sys_stat_statements 没有采集到数据会提示:
SELECT * FROM perf.ksh_report();
KSH 采集的数据主要包括以下信息:
字段 |
类型 |
描述 |
---|---|---|
ts |
ti mestamptz |
采样时间 |
db_id |
oid |
数据库OID |
db_name |
va rchar(64) |
数据库名称 |
pid |
int |
进程ID |
user_id |
oid |
用户OID |
user_name |
va rchar(64) |
用户名 |
app_name |
va rchar(64) |
应用名称 |
c lient_addr |
inet |
客户端IP地址 |
wait_class |
text |
等待事件类型 |
wait_event |
text |
等待事件 |
query_id |
uint8 |
QueryId |
ba ckend_type |
text |
后端类型,如:autovacuum, autovacuum worker等 |
type |
text |
语句类型,如:INSERT, SELECT, UPDATE, DELETE, UTILITY |
phase |
text |
执行阶段,如:PARSE, PLAN, EXECUTION, UNKNOWN |
state |
text |
状态,如:IDLE, IDLE IN TRANSACTION, RUNNING等 |
创建 KWR 插件:
CREATE EXTENSION sys_kwr;
保存于内存 Ringbuf 的数据可以通过视图 perf.session_history 查看:
SELECT * FROM perf.session_history;
其中保存于数据库的历史数据可以通过视图 perf.ksh_history 查看:
SELECT * FROM perf.ksh_history;
可以通过 perf.ksh_report() 函数生成在线报告查看:
SELECT * FROM perf.ksh_report({start_ts}, {duration}, {slot_width}, {format});
参数说明:
start_ts: 报告开始时间,默认:当前时间-15分钟
duration: 报告时长,默认:15分钟,最大不超过60
slot_width: 报告最小区间,输入0时系统自动计算合适的宽度,默认:0
format: 报告生成格式,可选择 ’html’和’text’两种格式,默认 TEXT 格式
例:生成 TEXT 的 KSH 在线报告
select * from perf.ksh_report('2022-12-13 14:12:46',15,0,'text');
可以通过 perf.ksh_report_to_file() 函数生成报告文件:
SELECT * FROM perf.ksh_report_to_file({start_ts},{duration},{slot_width},{file_path},{format});
参数说明:
start_ts: 报告开始时间,默认:当前时间-15分钟
duration: 报告时长,默认:15分钟,最大不超过60
slot_width: 报告最小区间,输入0时系统自动计算合适的宽度,默认:0
file_path: 报告生成地址,示例:’/home/username/ksh_report.html’
format: 报告生成格式,可选择 ’html’和’text’两种格式,默认 TEXT 格式
例:生成 HTML 的 KSH 报告文件
select * from perf.ksh_report_to_file('2022-12-13 14:12:46',15,0,'/home/kingbase/ksh_report.html','html');
若想查看两个快照期间的 KSH 报告,可以通过 perf.ksh_report_by_snapshots() 函数生成在线报告:
SELECT * FROM perf.ksh_report_by_snapshots({start_snapid}, {end_snapid}, {slot_width}, {format});
参数说明:
start_snapid: 起始快照号
end_snapid: 结束快照号
slot_width: 报告最小区间,输入0时系统自动计算合适的宽度,默认:0
format: 报告生成格式,可选择 ’html’和’text’两种格式,默认 TEXT 格式
例:根据快照号生成 TEXT 的 KSH 在线报告
select * from perf.ksh_report_by_snapshots(1,2);
若想查看两个快照之间的 KSH 报告并保存到文件中,可以通过 perf.ksh_report_to_file_by_snapshots() 函数生成报告文件。
SELECT * FROM perf.ksh_report_to_file_by_snapshots({start_snapid}, {end_snapid}, {file_path}, {format}, {slot_width});
参数说明:
start_snapid: 起始快照号
end_snapid: 结束快照号
file_path: 报告生成地址,示例:’/home/username/ksh_report.html’
format: 报告生成格式,可选择 ’html’和’text’两种格式,默认 TEXT 格式
slot_width: 报告最小区间,输入0时系统自动计算合适的宽度,默认:0
例:根据快照号生成 HTML 的 KSH 报告文件
select * from perf.ksh_report_to_file_by_snapshots(1,2,'/home/kingbase/ksh_report.html','html');
KSH输出报告的内容章节包括:
报告和实例信息
Top 用户事件
Top 后台事件
Top 数据库
Top PL/SQL 过程
Top 简单查询
等待事件高的 Top SQL
Top 会话
Top 客户端
Top 并行 SQL 等待事件
Top 阻塞会话事件
Top 重量级锁等待事件
Top 轻量级锁等待事件
Top SQL 命令类型
Top 执行阶段
分段时间等待事件统计
完整 SQL 列表
KSH 网页版示例报告说明如下:
报告和实例信息
该报告显示KSH环境和总体信息:
统计字段说明:
HostName:主机名
Cpus:服务器cpu数
SGA Size:共享内存大小
Server Version:服务器版本
Listen Address:数据库服务器的监听地址
Report Begin Time:KSH报告开始时间
Report End Time:KSH报告结束时间
Sample Count:报告时间范围内采样次数
Second Count:总共采样到的秒数(各客户端会话进程累加起来)
Avg Act Ses:平均每秒的活跃会话数
Data Source:KSH报告数据的来源(包括:内存、KSH表、混合三种)
TOP用户事件
该报告展示排名靠前的客户端会话等待事件,通过该报告可以知道数据库系统里哪些等待事件发生的比较多:
字段说明:
事件类型:等待事件所属的分类,其中OnCpu是指非等待事件
事件名称:等待事件的名称
采样数:报告期间采样到的等待事件数量
事件占比:报告期间采样到的等待事件数量占全部等待事件的百分比
平均会话数:平均每秒等待事件出现的会话数量
TOP后台事件
该报告展示排名靠前的后台进程的等待事件,通过该报告可以知道数据库系统里哪些等待事件发生的比较多:
字段说明:
事件类型:等待事件所属的分类,其中OnCpu是指非等待事件
事件名称:等待事件的名称
采样数:报告期间采样到的等待事件数量
活动占比:报告期间采样到的等待事件数量占全部等待事件的百分比
平均会话数:平均每秒等待事件出现的会话数量
TOP数据库
该报告展示访问次数排名靠前的数据库:
字段说明:
数据库名:数据库名称
访问次数:报告期间访问数据库的次数
活动占比:报告期间采样到的访问次数占全部访问次数的百分比
平均会话数:平均每秒访问出现的会话数量
Top PL/SQL 过程
该报告展示采样到的PL/SQL函数执行情况:
字段说明:
名称:PL/SQL函数名称
数据库名:执行该PL/SQL函数的数据库名称
活动占比:该函PL/SQL数执行占全部PL/SQL函数执行的百分比
平均会话数:平均每秒PL/SQL出现的会话数量
Top 简单查询
该报告主要展示使用简单报文(Simple Query)的SQL语句,即没有使用绑定变量的SQL语句统计:
字段说明:
Query ID:执行简单报文的SQL语句的ID,可以通过点击链接看详细SQL语句
活动占比:SQL语句占简单报文SQL语句的百分比
平均会话数:该SQL语句每秒平均会话数
采样数:KSH报告期间采样到的该SQL语句次数
SQL语句:SQL语句字符串,超长则截断
等待事件高的 TOP SQL
该报告统计等待时间最多的SQL语句:
字段说明:
Query ID:执行简单报文的SQL语句的ID,可以通过点击链接看详细SQL语句
采样数:KSH报告期间采样到的该SQL语句次数
活动占比:SQL语句占简单报文SQL语句的百分比
事件名称:等待事件的名称
事件次数:等待时间发生的次数
事件占比:该SQL语句当前等待事件占其全部等待事件的比例
SQL语句:SQL语句字符串,超长则截断
完整的 SQL 文本列表
该报告展示KSH报告中出现的Query ID对应完整SQL语句:
字段说明:
Query Id:SQL语句的query
采样数:该SQL语句的采样数
SQL语句:SQL语句的完整字符串
TOP会话
该报告展示TOP活跃会话的基本信息:
字段说明:
会话ID:活跃会话对应的进程ID
会话占比:该活跃会话出现的占比
事件名称:采样到的等待事件或者CPU的名称
事件占比:该事件占该会话全部事件的占比
客户程序:该会话的客户端名称
用户名:该会话的用户名
TOP客户端
该报告按客户端连接来统计活跃会话情况:
字段说明:
用户名:该客户端类型的用户名称
客户程序:该客户端应用名称
活动占比:统计到该客户端的活动占全部活动的比例
平均会话数:统计到该客户端的平均会话数
TOP 并行 SQL 等待事件
该报告主要展示客户端会话中的并行查询进程的SQL统计信息:
字段说明:
会话ID:统计到的并行进程的PID
活动占比:统计到该客户端的活动占全部活动的比例
事件名称:并行进程的等待事件或者CPU活动
事件占比:并行进程的等待事件或者CPU活动的占比
平均会话数:并行进程的平均活跃会话数
用户:并行进程的用户
客户程序:并行进程的客户端程序名称
Query Id:并行进程执行的SQL语句
Top 阻塞会话事件
该报告按进程展示阻塞类的会话事件,即Lock类等待事件的统计:
字段说明:
会话ID:发生阻塞等待事件的进程的PID
活动占比:该会话阻塞事件占全部事件的占比
平均会话数:进程的平均活跃会话数
事件名称:并行进程的等待事件或者CPU活动
事件占比:并行进程的等待事件或者CPU活动的占比
用户:并行进程的用户
客户程序:并行进程的客户端程序名称
Top 重量级锁等待事件
该报告展示客户端会话进程的重量级锁等待事件统计:
字段说明:
锁名称:统计的锁的名称
锁次数:统计的锁的次数
锁占比:统计的锁占全部锁的占比
活动占比:统计到该等待事件重量级锁的次数占全部活动的比例
平均会话数:该锁出现的平均会话数
Top 轻量级锁等待事件
该报告展示客户端会话进程的轻量级锁等待事件统计:
字段说明:
锁名称:统计的锁的名称
锁次数:统计的锁的次数
锁占比:统计的锁占全部锁的占比
活动占比:统计到该等待事件轻量级锁的次数占全部活动的比例
平均会话数:该锁出现的平均会话数
Top SQL 命令类型
该报告展示客户端会话进程的SQL语句类型:
字段说明:
命令类型:SQL语句类型
差异Query ID:该类型下SQL语句数量
命令占比:该SQL语句类型的占比
平均会话数:该SQL语句的平均会话数
Top 执行阶段
该报告展示客户端会话进程的SQL语句执行阶段:
字段说明:
执行阶段:SQL语句的执行阶段,主要包括解析(Parse)、计划(Plan)、绑定(Bind)、执行(Execute)、同步(Sync)等
阶段占比:该执行阶段占全部执行阶段采样数的比例
活动占比:该执行阶段采样数占全部采样数量的比例
平均会话数:该执行阶段的平均会话数
分段时间等待事件统计
该报告展示按时段(比如5分钟)统计的等待事件:
字段说明:
启动:统计时段开始时间
结束:统计时段结束时间
区间采样数:统计时段内等待事件采样数
事件类型:统计到的等待事件类型
事件次数:该等待事件类型下等待事件的数量
事件占比:该等待事件占全部等待事件的比例
通过该输出,可以发现报告区间发生的最多的等待事件、查询和客户端的信息,基于这些信息可以帮助使用者快速定位当前系统的瓶颈点。
KSH报告说明:
KSH仅支持管理员在主服务器运行(备机无法运行)
KSH功能仅能在kingbase库上使用
历史数据的采样周期为10秒,实时数据的采样周期为1秒
报告的采集要求开启:track_activities 和 sys_stat_statements 并设置 sys_kwr.collect_ksh = on
sys_kwr |
sys_ksh | |
---|---|---|
定位 |
周期时间累积差异,查询特定时间段的累积变化 |
识别系统短暂(transient)变化, 秒级时刻的实时值 |
原理 |
以累积式计数反馈系统在一定周期内的整体负载和瓶颈 |
基于定时的采样方式进行会话和数据收集 |
场景 |
本次系统升级后有哪些整体改进, 当前时段与基线相比指标如何变化。 |
当前或历史某个时点,发生了什么样的异 常,系统在执行/运行什么任务 |
数据 留存 |
默认1小时采集,快照保留8天,超过8天后自动删除 |
默认1秒,实时数据保留1小时, 过后以1/10的比例存入历史数据 |