【本文正在参与炫"库"行动-人大金仓有奖征文】

开发者请集结丨炫“库”行动——2021人大金仓征文大赛悬赏万元等你来!

最近一直在研究 Oracle 的 AWR 报告,觉得它功能很强大,尤其是 DB Time 模型和等待事件能够让性问题的分析变得十分方便,再也不需要依赖大量的运维脚本去分析和定位问题了。

偶然之间,发现人大金仓的 Kingbase ES 也提供了一个类似的功能,叫 KWR 报告,深感意外。下面我们就来一起来探索一下吧。

1. 什么是AWR


首先我们先了解一下什么是AWR。它是Oracle 10g 版本推出的一个特性,全称叫Automatic Workload Repository(自动负载信息库)。AWR自动采集性能统计相关的指标,存储为性能快照(Snapshots),通过对比两次快照收集到的统计信息,来生成性能报告,帮助DBA对数据库进行性能调优。

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

当出现性能问题的时候,DBA 执行 awrrpt.sql 脚本,指定快照范围,就可以生产相应时间范围内的 AWR 报告,定位性能问题的根本原因。

以下是一个 AWR 报告的示例:

2. 安装人大金仓 KES


去人大金仓公司网站上下载数据库的试用版:

人大金仓-KingbaseES V8 R6

我们选择的 KingbaseES V8 R6,下载一个单机版,以及开发版本的 License(后面安装时会用到):

下载完成后,将安装包拷贝到 X86-64 平台的 Linux 虚拟机上,可以将 ISO 文件 mount 到文件系统,或者在 Windows 上用 winrar 解压后再拷贝过去也行。

安装程序是 SETUP/INSTALL.BIN,chmod +x 添加执行权限,运行后一路下一步,中间输入刚才下载的 license-开发版.dat,按照提示初始化数据库实例即完成安装过程。

在此我们将 KES 数据库安装到 kes_svr 目录,数据在 kes_data 目录:

3. 生成 KWR 报告


因为 KWR 依赖数据库内部的统计数据,所以最好通过配置文件 kes_data/kingbase.conf 开启全部的统计开关:

编辑 ~/.bash_profile 配置环境变量,将 KES 的 bin 目录添加到 PATH,并添加 2个快捷命令:

启动 KES 数据库,ksql 连接进去,创建 sys_kwr 插件:

创建性能快照 - 1,随便执行一些SQL语句,然后再次创建快照 - 2:

用刚才创建的 2 个快照产生 KWR 报告:

如果,我是说如果,这个报告是中文的,就太好了。据说中国的空间站上的显示屏上都是中文的菜单,希望下次看到这个报告时,它是中文的!

4. 管理KWR快照


快照是 KWR 的核心数据,整个 KWR 报告就是对采集到的快照数据进行挖掘,找出可能的性能问题的根本原因。

快照默认每个小时采集一次,保留八天,也可以通过参数去设置采集频率和保留时长。这样当发现过去某个时间段有性能问题的时候,可以通过KWR快照产生那段时间范围内的性能报告,回溯性能问题。

  • 快照查询

快照的查询通过 perf.kwr_snapshots 即可:

  • 自动快照

创建快照有2种不同的方式,自动快照和手工快照。

自动快照由后台进程周期性的生成快照,需要配置 kingbase.conf 参数:

sys_kwr.nable 参数默认是关闭的。

sys_kwr.interval是自动快照间隔,默认 60 分钟一次,这里设置为 10 分钟一次。

修改参数后,重启 KES 服务器,后台进程 kwr_collector 就会自动每 10 分钟采集一次快照。从 14:17 到 15:47 一共产生了 10 个快照:

这些快照以表的形式存在于当前库,可以通过 SELECT 去查看里面的内容,不过其内容比较基础,分析起来有一定难度。建议还是通过 KWR 报告去查看各性能指标。

  • 手动快照

手动快照则是由 DBA 通过 SQL 语句执行生成快照,执行 perf.create_snapshot() 函数,返回快照编号:

手动快照不受自动快照间隔配置参数的影响,随时可以产生。

  • 快照清理

如果之前产生的快照不想要了,可以执行 perf.reset_snapshots()  函数清理全部的快照:

也可以 drop extension sys_kwr 删除插件后再重新创建插件的方式清理全部的快照。

5. 生成 KWR 报告


有了 KWR 快照后,就可以随时生成 KWR 报告了。

  • 生成 TEXT 格式报告

调用 perf.kwr_report(snap_1, snap_2) 来生成 text 报告:

报告的内容很长,这里不显示了,需要的朋友可以自己去实践一下。

  • 生成 HTML 格式报告

TEXT 报告的可读性稍微差一些,可以调用 perf.kwr_report(snap_1, snap_2, ‘html’) 来生成 html 报告,它是网页形式的,可读性非常好:

用 Firefox 打开 KWR_1_2.html:

感觉还是 HTML 格式的报告更便于阅读一些。不过 TEXT 格式的报告直接在ksql里就能看,看自己实际的需求吧。

  • 将报告存为磁盘文件

也通过 perf.kwr_report_to_file()  函数可以将生成的 KWR 报告保存到磁盘上:

感觉这功能还挺方便的,不需要使用 Linux 的管道符操作了。这个功能 Oracle 好像没有。

6. 分析 KWR 报告


为了后面的演示更有针对性,我们在KES数据库不进行任何优化的情况下,运行 TPCC 测试 2 分钟以便让数据库产生一些负载,在此期间生成两个快照,最后生成 KWR 报告,结合该报告来分析重要的一些性能指标。

  • 报告结构

人大金仓的 KWR 报告主要分 3 部分:

1)报告头

这部分主要是列出数据库实例的版本、运行环境和快照信息。

2)报告摘要

这是整个报告的精华所在,大部分的性能问题都能够从这部分报告里看到。看这部分内容的时候,如果有必要,还可以结合后面的详细报告具体分析问题。

这部分最重要的几个报告是:负载统计表(Load Profile)、实例效率百分比(Instance Efficiency Percentages)、前台等待事件(Top 10 Foreground Wait Events)、主机环境统计(Host CPU、Host IO、Host Memory、Host Network)。

3)报告主体

报告主体提供了更加全面的性能指标,主要包括:DB Time 模型、等待事件、SQL 报文统计、TOP SQL 统计、后台写统计、数据库对象统计和配置参数。

  • 分析 DB Time

DB Time,就是数据库时间,它用来衡量数据库的繁忙程度,DB Time 越高,说明数据库业务越繁忙。

如报告所示,在 2.92 分钟的快照时间内,只有 0.16 分钟在执行数据库任务,说明数据库业务非常空闲。

在满负荷的情况下,DB time 会等于 Elapsed Time(快照时间)* CPU 个数,说明每一个 CPU 都在执行数据库业务。

可以从详细报告的 Time Model Statistics 里看 DB time 的各组成部分:

  • 分析负载统计

分析 Load Profile 报告,能够从总体上了解数据库系统的负载情况。主要分为5个部分:

  1. DB Time 统计
  2. IO 统计
  3. 解析和执行次数统计
  4. 元组统计
  5. 事务统计

IO 方面需要重点关注的指标有 WAL Size - WAL 日志 IO 大小,和 Blocks Read/Write Size - 数据页读和写的大小,这应该是物理读写的大小。

解析方面需要关注解析次数和执行次数的比例情况,如果硬解析过多,则必然 Parser Calls 跟Execute Calls 更接近,说明解析效率不高。如果今后能够提供软解析和硬解析次数,就跟完美了。

元组方面感觉可以大概看一下增删改查的比例就好,了解一下大概的业务类型。

事务方面看看回滚的事务是不是比例高,如果比例高是不是需要分析一下业务逻辑。

这个报告非常的有用,我比较喜欢的一点是这里提供了每秒(Per Second)、每事务(Per Transaction)的统计功能,可以比较直观的知道每秒写了多少WAL日志,每秒执行了多少元组的插入和删除等。

  • 分析实例效率百分比

这个报告功能比较少,这里面出现的每一项,最佳情况是都为 100%,至少应该是 90% 以上。如果低于 90%,说明数据页缓存不够(Buffer Hit),需要加大 Shared_buffers,让更多的数据页通过缓存级能命中,较少 IO;或者说明解析和计划效率不高,发生了大量的硬解析的,需要从业务端把 Simple Query(select * from t1 where id = 5)通过扩展 SQL 协议来执行,即绑定变量的方式来执行。

如果能再多提供一些跟效率百分比相关的统计更好了,比如 LWLock 命中率,全部在内存上发生的排序比例等。

  • 分析等待事件

等待事件是多少 DBA 分析性能问题的利器,PostgreSQL 目前就只提供了当前发生的等待事件,而没有提供 KES 里面这种累积式的等待事件,不能不说是一个遗憾。

我觉得这个报告是最重要的。拿到报告,看完负载统计后,应该立刻查看排名靠前的几个等待事件,尤其那种大约 DB Time 5% 以上的等待事件,往往是发现性能问题的关键线索。

这个报告里可以看到 DataFileRead 等待事件发生了 2497 次,DB Time 比例超过 30%,说明发生了严重的 IO 等待,存在大量的物理读。可以通过加数据页预先加载到内存的方式来较少物理读。

然后是 WAL 日志的 3 个等待事件也比较高,可以通过扩大 WAL 日志缓冲区、修改 WAL 刷盘的方式来减少 WAL 日志的写压力。

另外,平均等待时间也值得关注,比如报告里的 transactionid 的平均等待时间是 9.23 毫秒,说明分配事务 ID 的锁冲突太厉害了。

  • 分析主机环境

看到这个主机环境报告,我惊讶了!

有过 DBA 经验的人都知道,有多少的问题是应该客户主机和网络环境问题引起的,尤其是在一些保密性强的环境里,很多的服务器上无法安装 NMON 之类的性能监控工具,这时候,能有一份不依赖任何外部工具就能生产的 CPU、IO、内存和网络统计报告是多么的激动。

废话不多说了,相信大家都能明白这几个报告的内容,和他们的重要性。

  • 分析实例 IO 和内存

通过 IO Profile 报告,能更细节地了解数据库实例 IO 的详细情况,重点关注每秒读写 IO 的大小,并和网络 IO 去比较,看看是不是 IO 遇到瓶颈了。

另外,如果 IO 读写太高,需要分析一下业务场景,或者调整一下数据库的配置参数。

Top 10 Shared memory 报告则展示了数据库实例共享内存的一个分部情况,能够很清晰的知道哪些业务占了共享内存的大部分空间。

如果能按照功能,比如数据缓冲区、WAL 缓冲区、CLOG 缓冲区等分一下类可读性会更强。

分析 TOP SQL

TOP SQL 从多个维度展示了耗时耗资源最多的 SQL 语句,有了这些报告,可以很容易找出消耗资源最多的 SQL 语句,然后具体分析。

以 Top SQL By Elapsed Time 为例,该报告按 SQL 完整执行完成时间排序,显示了总花费时间、执行次数、平均每次的执行时间、执行时间占比和 SQL 文本等信息。点击 Query Hash 链接还可以查看完整的 SQL 语句。

具体调查某一条 SQL 语句的时候,还需要分析它涉及到的表和索引的统计信息,因为有时候性能问题往往是由部分热表、热索引冲突导致的。

整体感觉这些 TOP SQL 报告还是比较完备的,如果有执行计划的相关信息就更好了。

  • 数据库对象统计

这一部分是从数据库对象:后台写统计、数据库统计和数据库对象(表、索引和自定义函数)统计显示各数据库对象的资源消耗的。

我们需要重点关注的是表和索引的 IO 读写情况。

比如 Top Tables By Logical Read 查看物理读的情况,它不仅展示了表的物理读,还展示相关联的索引表、Toast 表的物理读情况。对这些物理读很高的表和索引要特别关注一下。

结束语


好了,整个人大金仓 KWR 报告的体验过程就基本结束了,还有很多的地方读者朋友们可以自己去实践体会一下,如果有条件可以和 Oracle 产生的报告对比一下,看看互相的有点和缺点。

虽然国产数据库跟 Oracle 相比还有一些差距,但是单从人大金仓的这个 KWR 报告跟 Oracle 的 AWR 相比,已经算是有模有样了,基本上该有的都有了,我是对咋们国产数据库越来越有信心了。

最后所有国产数据人一句李白的话共勉:乘风破浪会有时,直挂云帆济沧海!

【本文正在参与炫"库"行动-人大金仓有奖征文】

开发者请集结丨炫“库”行动——2021人大金仓征文大赛悬赏万元等你来!

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览13601 人正在系统学习中

[转帖]人大金仓- KWR 报告初体验的更多相关文章

  1. 通过ODBC接口访问人大金仓数据库

      国产化软件和国产化芯片的窘境一样,一方面市场已经存在性能优越的同类软件,成本很低,但小众的国产化软件不仅需要高价买入版权,并且软件开发维护成本高:另一方面,国产软件目前普遍难用,性能不稳定,Bug ...

  2. DBeaver连接达梦|虚谷|人大金仓等国产数据库

    前言 工作中有些项目可能会接触到「达梦.虚谷.人大金仓」等国产数据库,但通常这些数据库自带的连接工具使用并不方便,所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版,下文以达梦为例(其他国 ...

  3. QT 之 ODBC连接人大金仓数据库

    QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...

  4. 教你10分钟对接人大金仓EF Core 6.x

    前言 目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql.SqlSugar(排名不分先后).FreeSql和SqlS ...

  5. 通过jmeter连接人大金仓数据库

    某项目用的人大金仓数据库,做性能测试,需要用jmeter来连接数据库处理一批数据.jmeter连接人大金仓,做个记录. 1. 概要 在"配置元件"中添加"JDBC Con ...

  6. 人大金仓KCI

    #include "bin/libkci.h" static void exit_nicely(KCIConnection *conn) { KCIConnectionDestor ...

  7. Rocky4.2下安装金仓v7数据库(KingbaseES)

    1.准备操作系统 1.1 系统登录界面 1.2 操作系统版本信息 jdbh:~ # uname -ra Linux jdbh -x86_64 # SMP Fri Dec :: CST x86_64 G ...

  8. 润乾配置连接kingbase(金仓)数据库

     问题背景 客户根据项目的不同,使用润乾连接的数据库类型各种各样,此文针对前几日使用润乾设计器连接kingbase金仓数据库做一个说明. kingbase金仓数据库是一款国产数据库,操作方式和配置 ...

  9. 金仓Kingbase数据库网页数据维护分析工具

    金仓Kingbase是优秀的国产数据库产品,在能源,政务,国防等领域广泛使用, 现在TreeSoft数据库管理系统已支持Kingbase了,直接在浏览器中就可以操作查看Kingbase数据了,十分方便 ...

  10. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. CodeForces 1453D 概率 期望

    CodeForces 1453D Checkpoints 概率 期望 原题链接 题意 现在我们可以设计n个擂台,有的是激活点,有的不是.从第一个开始挑战,每次都有1/2的概率成功,如果该点成功,则跳到 ...

  2. 华为云分布式云原生UCS,助力MetaERP构建企业级高可用分布式业务

    本文分享自华为云社区<华为云分布式云原生UCS,助力MetaERP构建企业级高可用分布式业务>,作者:云容器大未来. 引言 华为云最近成为<Forrester Wave: Multi ...

  3. 云小课|MRS基础原理之Hudi介绍

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Hudi是数据湖的 ...

  4. Java 全新生态的框架,Solon v1.10.12 发布

    一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,也没有 Servlet,独立的生态.主框架仅 0.1 MB.Helloworld: @Controller public ...

  5. SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven

    命令如下: mvn install:install-file -Dfile="D:\Projects\lib\com.ibm.mq-7.0.1.3.jar" -DgroupId=c ...

  6. java中类的普通初始化块一定在静态初始化块后运行吗

    大部分教程都会告诉我们静态初始化块和静态字段总是在初始化块和普通类字段前运行,事实上也确实如此,直到我看到下面这样的代码: public class Test { static Test test = ...

  7. C#写日志工具类(新版)

    源码:https://gitee.com/s0611163/LogUtil 昨天打算把我以前写的一个C#写日志工具类放到GitHub上,却发现了一个BUG,当然,已经修复了. 然后写Demo对比了NL ...

  8. SpringBoot 项目实战 | 瑞吉外卖 优化篇 Day01

    该系列将记录一份完整的实战项目的完成过程,该篇属于优化篇第一天,主要负责完成缓存优化问题 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下 ...

  9. 领域驱动设计(DDD)实践之路(二):事件驱动与CQRS

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/Z3uJhxJGDif3qN5OlE_woA作者:wenbo zhang [领域驱动设计实践之 ...

  10. RPC与Http的区别

    一.远程调用方式 无论是微服务还是分布式服务(都是SOA,都是面向服务编程),都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Pro ...