草庐IT

面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读

腾讯云数据库 2023-03-28 原文

SIGMOD 数据管理国际会议是数据库领域具有最高学术地位的国际性会议,位列数据库方向顶级会议之首。近日,腾讯云数据库团队的最新研究成果入选 SIGMOD 2022 Research Full Paper(研究类长文),入选论文题目为“HUNTER: An Online Cloud Database Hybrid Tuning System for Personalized Requirements”。标志着腾讯云数据库团队在数据库AI智能化上取得进一步突破,实现性能领先。

数据库参数自动调优在学术界和工业界都已有较多研究,但现有的方法在缺少历史数据时或是面对新负载进行参数调优时,往往面临着调优时间过长的问题(可达到数天)。在此篇论文中,团队提出了混合调优系统Hunter,即改进后的 CDBTune+,主要解决了⼀个问题:如何在保证调优效果的前提下显著减少调优时间。经实验调优效果明显:随着并发度提升实现调优时间准线性降低,在单并发度场景下调优时间只需17小时,在20并发度场景下调优时间缩短至2小时。

工作原理(技术原理解析)

这是CDB/CynosDB数据库团队第三次研究成果论文被SIGMOD收录。继2019年数据库团队首度提出基于深度强化学习(DRL)的端到端云数据库参数调优系统CDBTune,该研究论文“An End-to-End Automatic Cloud Database Tuning System Using Deep Reinforcement Learning”入选SIGMOD 2019 Research Full Paper(研究类长文)。

虽然CDBTune 在调参效果上已经达到了⼀个相当高的水平,但我们也发现,CDBTune 需要较长的调优时间才能通过自我学习达到较高的性能。

对此,本次收录论文中提出改进的 CDBTune+,能够在保证调优效果的前提下极大地缩减调优耗时。

改进的混合调优系统CDBTune+,主要包含样本生成、搜索空间优化、深度推荐三个阶段。样本生成阶段利用遗传算法进行初期调优,快速获取高质量样本;搜索空间优化阶段利用上⼀阶段的样本信息减小解空间,减少学习成本;深度推荐阶段利用之前阶段的信息进行维度优化和强化学习预训练,保证调优效果的同时显著减少调优时间。

为了进⼀步对调优过程进行加速,我们充分利用CDB 的克隆技术,采用多台数据库实例实现并行化, 令整个调优时间更进⼀步地减少。

样本生成

如下图所示,由于基于学习的调优方法在训练初期都有着调优效果差、收敛速度慢等问题(我们称之为冷启动问题)。

我们认为这些方法面临冷启动问题主要是因为:

1、样本数量少质量差,网络难以快速学到正确的探索方向。
2、搜索空间大,网络结构复杂,学习速度缓慢。

为了缓解上述问题,我们采用收敛速度更快的启发式方法(如:遗传算法(GA))进行初期的调优,以此快速获得高质量的样本。

如图 5 所示,不同方法进行 300 次的参数推荐,图中是这 300 次参数所对应的数据库性能分布。可以见得,相较于其他的方法,GA 能够收集到更多的高性能参数。

虽然有着更快的学习速度,但是 GA 却可能更容易收敛到次优解,如图 6 所示。


启发式方法虽有着较快的收敛速度,但是却容易收敛到局部最优,导致最终调优效果不佳。

而基于学习的方法却在较长的调优时间后可以得到较高的性能,但是却需要较长的训练时间,速度较慢。我们将两种方法结合,即加快了调优速度,也确保了参数质量。

搜索空间优化

单纯地将两者拼接难以有⼀定的性能提升(节约约 20%的时间),但是我们期望更多。

利用样本生成阶段可以获得较多高质量的样本,但是却没有将其效果充分发挥。我们利用PCA 进行状态空间降维,Random Forests 进行参数重要性排序。

PCA 是⼀种常用的降维方法,可将高维数据降为低维数据的同时保留大部分信息。我们采用累计方差贡献率来衡量信息的保留度,⼀般来说,当累计方差贡献率 > 90%时即可认为信息得到了完全的保留。

我们选择贡献率最大的两个成分,并以此作为 x、y 轴描点,以其对应的数据库性能作为点的颜色(颜色越深性能越低),可以看出,低性能的点可以被两个成分较为明显的区分开来,由此可见,PCA 能够帮助 DRL 更好地学习。

随机森林可以被用来计算特征的重要性,我们以数据库参数为输入,对应的数据库性能为输出训练随机森林模型,然后计算各个数据库参数的重要性,并进行排序。采用不同数量的 Top 参数进行参数调优可以看到数据库最优性能的变化,在⼀定数量的样本保证下,TPC-C 负载调整 20 个参数即可达到较高的性能。

深度推荐

经历样本生成和搜索空间优化后,我们在深度推荐阶段采用深度强化学习(DRL)来进行参数推荐。

首先,搜索空间优化的结果会对 DRL 的网络进行优化,减少其输入输出的维度,简化网络结构。

其次,样本生成阶段的样本将加入DRL 的经验池中,由 DRL 进行⼀定程度的预训练。
最后,DRL 将基于改进后的探索策略进行参数推荐。

DRL 的基本结构与 CDBTune 类似,为了充分利用高质量的历史数据,我们修改了其探索策略。动作 (数据库参数配置)有⼀定概率在历史最优参数附近探索,具体的计算方法如下图所示。

Ac 表示 DRL 的结果,Abest 表示历史最优,初始情况下 Ac 的概率为 0.3。

调优效果性能分析

效果分析

为了测试不同调优方法从零开始进行参数调优的效果,我们在不同负载下进行了测试。在测试中,所有方法都没有任何的预训练。其中 HUNTER-20 表示以 20 个实例进行并发调优的 HUNTER。

如下图所示,虽然只有我们的方法提供了并发功能,但是并发加速本身是通用的,因此,我们在真实负载下对不同方法做了进⼀步测试。虽然大部分方法借助较长的调优时间可以获得足够高的性能,但是,在相同的代价情况下 (时间*实例数),HUNTER 的表现是最好的。

下图展示了 HUNTER-N 达到串行所能找到的最优性能的调优耗时,可见调优速度的效果,随着并发度增加,调优时间显著缩短。

不足

对于 DBA 来说,负载越简单所需的调优时间应该会越短,但是自动调优方法却没有这样的特质,如我们上述的实验图所示,有些时候,简单负载可能需要更多的时间来获得更高的性能。更重要的在于,我们目前难以快速地判断性能是否达到了“最优”,这导致我们花费了额外的时间来观察调优系统是否能令数据库性能再得到提高。

目前

通过技术解读和效果分析,我们可以看出改进后的Hunter大幅提升调优效果,同时体现出论文对实际数据库问题的落地可能性很高,具有指导方法意义。

在接下来的研究中,我们希望结合专家经验来解决上文提到的问题,提高参数调优的可解释性并更进一步压缩调优时间,同时也希望找到一种估计最优性能的方法,从而减少额外的调优时间。

CDBTune+旨在降低数据库参数调优的复杂度,实现参数调优零运维,是腾讯云数据库AI智能化变革的再一次跨越和实现。智能调优一期已经在腾讯云MySQL产品上线,后续会在更多腾讯云数据库产品上应用,为学术及工业界带来更多贡献和服务。

有关面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读的更多相关文章

  1. ruby-on-rails - ruby 真的是一种完全面向对象的语言吗? - 2

    Ruby是完全面向对象的语言。在ruby​​中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. ruby - 使用 Aquarium 的 Ruby 异常处理中的 SystemStackError(面向方面​​的编程) - 2

    我正尝试在Ruby中使用AOP处理异常。我在这里使用的工具包是Aquarium(http://aquarium.rubyforge.org/)。我已经编写了一个示例代码,它将尝试映射写下的ApplicationController类的所有后代(子类)。在执行以下程序时,我得到一个SystemStackError(我也尝试使用“ulimit-s”设置堆栈限制)。有人请帮我这个!或者关于映射的任何建议:父类(superclass)的子类的所有_方法都欢迎。提前致谢。require'aquarium'includeAquarium::AspectsclassApplicationContro

  4. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  5. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  6. Ruby Compass 编译器不工作,在线错误 [54] - 2

    RubyCompass不工作,代码如下,我已经在网上尝试了10-20种方法,有什么建议吗?在屏幕截图中,您会找到一种更简单的方法来读取我的gem的终端转储和错误,如果您想从那里获取一些东西,您会在屏幕截图下方找到文本谢谢,干杯,罗伯特RubyGemsisasophisticatedpackagemanagerforRuby.Thisisabasichelpmessagecontainingpointerstomoreinformation.Usage:gem-h/--helpgem-v/--versiongemcommand[arguments...][options...]Examp

  7. ruby - 关于 Ruby 面向对象设计的问题 - 2

    我正在考虑用Ruby编写一个CLIMonopoly游戏。这将是我在Ruby中完成的第一个大型项目。我在编程方面的大部分经验都是使用Clojure和Haskell等函数式编程语言。我非常了解面向对象,但我没有设计面向对象程序的经验。现在,这就是交易。在大富翁中,棋盘周围有很多空间。大多数空间是属性,而其他空间则做其他事情。为每个空间设置一个类(class)会很聪明吗?我正在考虑拥有一个所有其他空间都继承自的Space类,并拥有一个从Space继承的Property类,然后为从Property继承的每个属性创建一个类。这将意味着很多类,这让我相信这是一种糟糕的方式来做我想做的事情。我还打算

  8. 论文解读OTA: Optimal Transport Assignment for Object Detection - 2

    CSDN优秀解读:https://blog.csdn.net/jiaoyangwm/article/details/1266387752021https://arxiv.org/pdf/2103.14259.pdf关键解读在目标检测中标签分配的最新进展主要寻求为每个GT对象独立定义正/负训练样本。在本文中,我们创新性地从全局的角度重新审视标签分配,并提出将分配程序制定为一个最优传输(OT)问题——优化理论中一个被充分研究的课题。具体来说,我们将每个需求方(锚框)和供应商(GT标签)的单位传输成本定义为他们的分类和回归损失加权之和。在公式化后,找到最好的分配方案即为最小传播成本解决最优传输方案,

  9. ruby - ruby 是纯面向对象的编程语言吗,即使它不支持多重继承?请解释 - 2

    即使ruby​​不支持多重继承,它也是一种纯面向对象的编程语言吗?如果是如何?请解释。我知道通过允许在一个类中包含多个模块,在一定程度上弥补了多重继承的不足。此外,我不确定纯OOP语言的所有先决条件。来自thisarticle,他们提到aRubyclasscanhaveonlyonemethodwithagivenname(ifyoudefineamethodwiththesamenametwice,thelattermethoddefinitionprevails..这是否意味着Ruby不支持重载方法。如果是这样,它仍然可以作为纯OOP语言吗?如果是这样,请同时解释这背后的原因。谢谢

  10. ruby - 我如何让 ruby​​ 在线程内输出异常? - 2

    当我使用Thread.new{}生成一个线程时,该线程中发生的任何异常似乎永远不会出现,应用程序只是悄悄地忽略它 最佳答案 通常情况下,线程是相互隔离的,因此一个线程中的异常不会终止整个应用程序。但是,虽然我从未使用过它们,但Thread类有几个abort_on_exception方法,甚至还有一些示例。他们应该做你想做的事。http://corelib.rubyonrails.org/classes/Thread.html 关于ruby-我如何让ruby​​在线程内输出异常?,我们在S

随机推荐