KingbaseES数据库性能调优指南:从理论到实践的全链路解析

《KingbaseES数据库》本篇文章所属专栏---持续更新中---欢迎订阅!

KingbaseES(简称KES)是面向全行业、全客户关键应用的企业级大型通用融合数据库产品,适用于事务处理类应用、数据分析类应用、海量时序数据采集检索类应用、要求苛刻的互联网应用等场景;可用作管理信息系统、业务及生产系统、决策支持系统、多维数据分析系统、运行日志管理系统、全文检索系统、地理信息系统、时序数据处理相关系统的承载数据库。 KES采用融合数据库架构,通过多语法体系一体化架构实现一套软件兼容Oracle、MySQL、SQL Server、PostgreSQL等多个异构数据库的语法; 采用多模数据一体化存储,支持对关系模型、文档模型、全文本、GIS数据、时序等数据的统一存储、混合访问、模型间转换; 采用集中分布一体化架构,满足不同级别的可用性,为客户提供不同级别的可用性、性能扩展、成本需求,确保业务连续,最大化投资价值。

下面我将围绕KingbaseES 数据库性能调优主题来展开今天的文章内容

文章目录

正文开始------

第一章:理解数据库性能的本质

在深入技术细节之前,让我们先建立一个核心认知:什么是数据库性能?

1.1 什么是性能?

性能是一种指标,表明软件系统对于其及时性要求的符合程度。及时性用响应时间或者吞吐量来衡量。

  • 响应时间:对请求做出响应所需要的时间。对于单个事务可以是事务完成所需要的时间;对于用户任务,则是端对端的时间。

  • 系统吞吐量:特定时间内能够处理的请求数量。

软件性能的及时性包括两个重要方面:响应性和可扩展性。响应性是系统实现其响应时间或者吞吐量目标的能力;可扩展性则是系统在对其软件功能的要求增加的情况下,继续实现其响应时间或吞吐量目标的能力。

1.2 性能指标模型

数据库请求响应时间:即一个数据库请求从向数据库发起,到用户收到最后一条结果数据的时间间隔,其大小 = CPU计算时间 + 非空闲等待时间(如IO时间、数据库锁时间)。

并发吞吐量:即单位时间内,数据库能够处理的请求数量。该指标与前一指标的关系是:假设系统中只有一个会话,则只要该会话持续发起请求,即请求之间没有任何时间间隔,系统即可达到其最大并发吞吐量 = 1 / 数据库请求响应时间。

注意:这里的资源包括:CPU、内存、磁盘等存储设备、网络设备等硬件资源,数据库锁、应用锁等软件资源。

1.3 数据库时间模型

性能优化的第一步是确定性能问题的根本原因,然后才有可能给出有效的调优建议来解决或缓解该问题。

我们在数据库中引入时间模型来解决该问题。时间模型中最重要的就是数据库时间(DB TIME),DB TIME定义为在数据库中处理用户请求所花费的时间总和。这里我们给出数据库时间模型的量化公式:

数据库时间 = CPU时间 + 等待时间

数据库调优的根本目标则是缩短数据库时间:CPU或等待时间,随之吞吐量也自然提高。

注意:数据库时间不等于响应时间,它只是用户感知到的响应时间的一部分,因为它不包含中间层(网络、中间件等)花费的时间。

第二章:明察秋毫:构建系统化的诊断思维

性能问题不会凭空产生,它们总是有迹可循的。

2.1 性能问题产生模型

性能问题是由于某些系统资源争用或耗尽的结果。当系统资源耗尽时,系统无法扩展到更高的性能级别。而资源争用或不尽的根本原因,是对资源的使用不当,或资源的处理能力已经无法满足系统的负载需要。

数据库需要的软硬件资源包括:CPU、IO、内存、网络、锁等。这些资源在达到处理能力上限的时候,通常会产生性能问题。常见的资源瓶颈现象可能包括:

  • CPU利用率接近100%
  • IO利用率接近100%
  • 内存不够,开始写swap
  • 网络流量达到带宽上限,网络传输存在大量错误
  • 数据库内部有大量的时间在等待

注意:在进行性能调优时,DBA主要的目标是找出并优化对资源的不当使用;如果没有不当使用,则说明资源的处理能力已经无法满足系统的负载需要,此时应给出资源需求估计。

2.2 性能诊断整体流程

KingbaseES实例性能调优的整体过程如下:

  1. 定义性能目标

从用户那里获得关于性能问题范围的直接反馈,定义我们要达成的性能目标。准确确定应用场景,包括相关的测试用例。

需要收集的信息包括:

  • 确定性能指标:可接受性能指标是什么?如响应时间、吞吐量的要求
  • 确定问题涉及的范围:由于执行的缓慢影响到了什么?
  • 确定问题发生的时间:这个问题只在高峰时段出现吗?
  • 量化性能差距:这有助于确定问题的严重程度
  • 确定自性能达标以来发生了哪些变化
  1. 测试并检查资源使用情况,定位性能瓶颈,找出性能问题的直接原因

收集从测试程序到数据库之间完整的操作系统资源负载信息、数据库内部统计信息、性能指标信息后,检查数据是否有任何性能问题的迹象。

  1. 检查资源使用的分布情况,找出性能问题的根本原因

在定位到性能瓶颈后,还需要进一步分析各种软硬件资源使用的分布情况(尤其是瓶颈资源),找出资源使用的不当情况(或者没有不当使用但是无法满足当前性能指标要求),才能找出性能问题的根本原因,使得性能收益最大化。

  1. 对于不合理的资源使用,合理化运用调优手段

在定位到性能问题的根本原因后,合理运用数据库的现有手段来解决性能问题。

  1. 提出需要进行的变更和实施变更的预期结果。然后,实现这些更改并监测应用程序的性能表现

  2. 确定步骤1提出的问题是否解决,如果没有解决,重复2,3,4,5步骤

第三章:利器出鞘:操作系统级诊断实战

3.1 CPU诊断:mpstat实战

cpu信息收集工具主要有:mpstat、iostat、nmon、oprofile、perf、sar、vmstat、uptime、/proc/stat、/proc/loadavg等。

mpstat使用示例:

复制代码
[jwang@hai -]$ mpstat -P 0,1 2 4
Linux 3.10.0-693.21.1.e17.x86_64 (hai) 2020 年 03 月 21 日 _x86_64_(32 CPU)

11 时 52 分 38 秒
CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11 时 52 分 40 秒
0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

CPU资源分析要点:

  • %usr:用户态消耗时间。如果比较大,说明用户程序本身有cpu瓶颈,需要优化程序本身。
  • %sys:系统内核消耗时间。如果比较大,说明系统调用函数花费时间很多。
  • %iowait:等待io的cpu时间,如果比较大,说明IO等待越严重,可能由于磁盘大量随机访问造成,也有可能磁盘出现瓶颈。
  • %idle:空间cpu,如果比较大,说明不是瓶颈。

3.2 内存瓶颈分析

内存常用分析工具:top、free、nmon、/proc/zoneinfo、/proc/buddyinfo、/proc/meminfo、/proc/slabinfo、/proc/vmstat、/proc//maps等。

top命令示例:

复制代码
top - 14:32:45 up 43 days, 8:28, 21 users, load average: 0.19, 0.30, 0.30
Tasks: 630 total, 1 running, 628 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 26372547+total, 20976670+free, 4104164 used, 49854604 buff/cache
KiB Swap: 16777212 total, 16777212 free, 0 used. 25713113+avail Mem

内存资源分析要点:

  • swap是否被使用,如果存在swap空间被使用的情况,说明发生了磁盘IO操作,数据库消耗CPU和IO时间,导致性能下降。
  • 空闲内存是否比较少,一般来说如果空闲内存/物理内存 >70%,内存性能优,如果小于20%,则性能差,需要添加内存。
  • 如果内存用的很少,查询比较慢,而且数据量很大,并且很多io,那可以考虑调大shared_buffers,提高命中率。

3.3 I/O瓶颈分析

测量I/O的工具包括:iostat, nmon, sar, vmstat, lsof, /proc/diskstat, /proc/partitions

iostat使用示例:

复制代码
[root@localhost -]$ iostat -xkt 1
Linux 3.10.0-1160.e17.x86_64 (localhost.localdomain) 2024 年 08 月 20 日

avg-cpu: %user %nice %system %iowait %steal %idle
          8.15   0.00     0.59     0.70     0.00   90.55

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda      1.27   5.09  2.33 18.75 55.47 1519.95 149.47 0.11 5.07 22.80 2.86 4.32 9.10

IO资源分析关键参数:

  • %util:io的使用率,主要看是否已经接近或者超过100%,如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
  • svctm:时间,主要说明磁盘本身的读写性能快慢。
  • await:主要说明平均每次IO响应时间,一般小于5ms。
  • 如果svctm比较接近await,说明I/O几乎没有等待时间。
  • 如果await远大于svctm,说明I/O队列太长,应用得到的响应时间变慢。

第四章:数据库内部资源深度分析

4.1 使用sys_stat_statement工具

sys_stat_statement是KingbaseES系统的一个扩展组件,它提供了所有执行语句的统计信息,可以帮助找出哪种类型的查询很慢以及多久调用一次查询。

使用步骤:

  1. 在kingbase.conf里添加预加载项:

    shared_preload_libraries = 'liboracle_parser, sys_stat_statements'
    sys_stat_statements.track = 'top'

  2. 重启数据库服务器

  3. 在执行的数据库里创建扩展:

sql 复制代码
CREATE EXTENSION sys_stat_statements;

关键视图字段说明:

  • query:语句的文本形式
  • calls:被执行的次数
  • total_exec_time:在该语句中花费的总时间,以毫秒计
  • rows:该语句检索或影响的行总数
  • shared_blks_hit:该语句造成的共享块缓冲命中总数
  • shared_blks_read:该语句读取的共享块的总数

查询TOP SQL示例:

sql 复制代码
SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM sys_stat_statements 
ORDER BY total_exec_time DESC 
LIMIT 10;

4.2 等待事件分析

为了了解数据库当前的运行时状态,管理员可以查看系统视图sys_stat_activity来进行查看。该视图能够知道数据库目前正在发生写什么:比如有多少个连接,客户端的情况,每个连接的状态,每个连接上的等待事件等。

sys_stat_activity关键字段:

  • datname:数据库名称
  • usename:用户名
  • application_name:应用名称
  • state:当前的状态
  • wait_event_type:当前等待事件的类型
  • wait_event:当前等待事件
  • query:当前查询语句

等待事件类型包括:

  • LightLock:轻量级锁
  • Lock:重量级锁
  • BufferPin:数据缓冲区等待
  • IO:IO等待
  • Client:客户端等待
  • Activity:后台辅助进程活动等待

查询等待事件示例:

sql 复制代码
SELECT wait_event_type, wait_event, state, count(*) 
FROM sys_stat_activity 
GROUP BY wait_event_type, wait_event, state;

4.3 自动负载信息库SYS_KWR

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

快速生成报告步骤:

  1. 配置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'
    sys_stat_statements.track = 'top'

  2. 重启数据库服务器

  3. 通过KSQL连接,创建KWR插件和快照:

sql 复制代码
CREATE EXTENSION sys_kwr;
SELECT * FROM perf.create_snapshot();    -- 获得快照1

-- 执行一些SQL操作
CREATE TABLE IF NOT EXISTS t1(id int);
SELECT count(*) FROM t1;

SELECT * FROM perf.create_snapshot();    -- 获得快照2
SELECT * FROM perf.kwr_report(1,2,'html'); -- 生成HTML版报告

KWR报告核心价值:

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

4.4 共享内存命中率分析

系统表sys_statio_user_tables和sys_statio_user_indexes从I/O的角度记录用户表和用户索引的信息。如果命中率过低,则可以考虑加大shared_buffers。

关键视图查询:

sql 复制代码
-- 查看表级别的IO统计
SELECT schemaname, relname, 
       heap_blks_read, heap_blks_hit,
       round(heap_blks_hit * 100.0 / (heap_blks_hit + heap_blks_read), 2) as hit_rate
FROM sys_statio_user_tables 
WHERE heap_blks_hit + heap_blks_read > 0
ORDER BY hit_rate ASC;

-- 查看索引级别的IO统计  
SELECT schemaname, indexrelname,
       idx_blks_read, idx_blks_hit,
       round(idx_blks_hit * 100.0 / (idx_blks_hit + idx_blks_read), 2) as hit_rate
FROM sys_statio_user_indexes
WHERE idx_blks_hit + idx_blks_read > 0
ORDER BY hit_rate ASC;

第五章:性能优化实战经验

5.1 数据库参数优化

主要是根据不同应用调节不同内核参数进行优化,比如经常有大量数据频繁访问可以调大shared_buffers,有写临时文件的情况调大work_mem。

关键优化参数:

共享内存参数:

  • shared_buffers:数据库服务器使用的共享内存缓冲区量,建议设置为系统内存的15-25%
  • wal_buffers:用于还未写入磁盘的WAL数据的共享内存量

私有内存区参数:

  • work_mem:在写入临时磁盘文件之前用于内部排序操作和哈希表的内存量
  • maintenance_work_mem:用于维护操作(如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)的最大内存量

I/O相关参数:

  • checkpoint_timeout:自动WAL检查点之间的最长时间
  • checkpoint_completion_target:在检查点期间用于扩散刷出脏缓冲区的时间分数
  • bgwriter_delay:后台写入器活动轮次之间的延迟
  • bgwriter_lru_maxpages:每个轮次中后台写入器最多刷出的缓冲区数

5.2 SQL优化

可以考虑创建合适的索引、使用分区、通过HINT控制优化器使用最优的执行计划、使用并行等方式。

索引设计原则:

  • B-树索引:这种索引是标准的索引类型,对于主键和频繁选择索引都是非常适用的。作为连接索引使用,数据库可以使用B-树索引检索索引列排序的数据。

  • 位图索引:这种索引类型将相同的数据以元组ID位图的形式保存在磁盘上。具有占用空间小、查找迅速的特点。适合没有Update操作且基数值较低(1-10000)的数据列。

  • 基于函数的索引:这种索引允许通过B-树访问从原始数据中通过函数派生的值。基于函数的索引在使用空值方面有一些限制,并且该索引的使用要求占用查询优化器。

索引设计注意事项:

  • 构建和维护索引结构可能会很昂贵,而且会消耗磁盘空间、CPU和I/O容量等资源
  • 通过插入、删除或更新索引所维护的键所需的资源大约是在表上实际进行DML操作所需资源的三倍
  • 设计者应该灵活地定义索引构建的规则,根据不同情况对索引中的键进行排序

5.3 性能诊断与优化经验

除了上述从瓶颈分析、根因分析到实施调优手段这种自顶向下追溯原因的方法,KingbaseES也有一些常见的优化经验供用户参考:

  • 如果遇见查询计划不准的情况,首先需要考虑是否做了analyze
  • 数据量大性能慢的情况,首先需要考虑shared_buffers是否开小了
  • 一般有排序和join的查询慢的情况,只要数据量稍微大点就需要考虑work_mem是否设置了比较大,确保不写临时文件,不过如果并发特别多设置太大可能导致内存不够
  • 全表扫描慢的情况,可以考虑采用索引,尤其是表达式索引和条件索引,调整SQL的执行计划,选择合适的索引
  • 多表join的慢的情况,可以考虑join顺序问题,调整执行计划得到最优的join的顺序
  • 表的join慢的情况,比如原来采用了nestloop,数据无序可以考虑采用hashjoin,有序可以考虑mergejoin
  • 对于慢语句,在cpu资源比较充裕的情况下,可以考虑并行技术
  • 数据库层优化完还不行,可以考虑操作系统调优,比如IO问题考虑磁盘的调度策略,数据库一般采用deadline,还有操作系统预读和IO请求队列的调整
  • 对于同类请求比较多的情况,可以尝试通过PBE进行SQL的变量绑定,缓解SQL的硬解析,当遇到成千上万的查询操作时,能够不经处理过程直接使用缓存的执行计划,那效率可以提高n倍
  • 数据量大还可以考虑分区
  • 数据库能够高效的运行,最关键的因素需要内存足更大了,能缓存住数据,更新也可以在内存先完成。但不同的业务对内存需要强度不一样,一推荐内存要占到数据的15-25%的比例,特别的热的数据,内存基本要达到数据库的80%大小
  • 单机操作的时候可以考虑读写分离
  • 连接数过多造成资源争用严重的,考虑使用连接池来减缓竞争压力

第六章:总结与展望

性能调优从来都不是一次性的任务,而是一个持续优化、不断精进的过程。KingbaseES为我们提供了强大的工具和方法论,但真正的价值在于将这些能力转化为业务发展的动力。

当我们下次面对性能挑战时,相信KingbaseES提供的这套完整解决方案------从精准的诊断工具到深度的优化建议,从稳定的基础架构到智能的调优能力。选择KingbaseES,不仅是选择了一个高性能的数据库产品,更是选择了一个值得信赖的技术伙伴。

让我们携手金仓数据库,共同打造更快、更稳、更强的数据底座,为企业的数字化转型注入源源不断的动力!

相关推荐
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希8 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神8 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员8 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴9 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存