当前位置: 首页 > 科技观察

交给DBA,让数据库自己解决繁琐的参数调整!

时间:2023-03-12 10:31:30 科技观察

数据库有很多参数。比如MySQL有几百个参数,Oracle有几千个参数。这些参数控制着数据库的方方面面,极大地影响着数据库的性能。例如缓存容量和检查点频率。DBA们会花费大量时间根据经验调优数据库的参数,企业需要花大价钱聘请有经验的DBA。但是,对于不同的硬件配置和不同的工作负载,对应的参数文件是不同的。DBA不能简单地重复使用以前调整过的参数文件。这些复杂性使数据库调优变得更加困难。为了解决这些问题,卡内基梅隆大学数据库组的教授、学生和研究人员开发了数据库自动调优工具OtterTune,它可以利用机器学习自动调优数据库的参数文件,并且可以利用现有的数据训练机器学习模型,然后自动推荐参数。可以帮助DBA很好的调优数据库,将DBA从复杂繁琐的参数调优工作中解放出来。之前网上就有关于OtterTune的报道,标题都挺吓人的。比如这篇文章:运维失业了吗?机器学习可以自动优化您的数据库管理系统[1]。OtterTune的目的是帮助DBA,让数据库的部署和调优变得更简单,用机器代替繁琐但重要的数据库调优工作,即使没有专业知识也可以完成。OtterTune现已完全开源,Github上的版本可用[2]。本文档中有一个分步示例可以帮助您入门。在AWS的m5d.xlarge机器上调优PostgreSQL9.6数据库,将吞吐量从默认参数文件中的每秒约500个事务提高到每秒约1000个事务。有兴趣的朋友不妨试一试。但让我们意外的是,我们发现这个通用模型在业界很多地方都有真实的应用。它不仅可以调优数据库的参数,还可以调优操作系统内核的参数,甚至可以尝试调优机器学习模型的参数。例如以下场景:某欧洲银行需要自动调优数据库集群的参数,以提高性能,降低人力成本。大型云供应商需要在不影响性能的情况下尽可能减少分配的资源(如内存),并降低硬件成本。纽约一家高频交易公司需要调优机器的操作系统参数,以优化机器性能,减少延迟,增加利润。本文将介绍OtterTune的内部原理,以及OtterTune的一些进展和尝试,例如使用深度强化学习调优数据库参数。本人水平有限,如有错误请指正。更多信息请参考2017年SIGMOD[3]和2018年VLDB[4]的论文。1.客户端和服务端OtterTune分为客户端和服务端。目标数据库是用户需要调参的数据库:OtterTune的客户端安装在目标数据库所在的机器上,收集目标数据库的统计信息,并上传到服务器。服务器一般配置在云端。它从客户端接收数据,训练机器学习模型并推荐参数文件。客户端收到推荐参数文件后,在目标数据库上进行配置,并衡量其性能。可以重复以上步骤,直到用户对OtterTune推荐的参数文件满意为止。当用户配置OtterTune时,它可以自动持续推荐参数文件,并将得到的结果上传到服务器进行可视化,无需DBA干预。这样可以大大简化DBA的工作。例如,DBA可以配置OtterTune并回家睡觉。第二天早上,OtterTune可能会在一个晚上的试验中找到一个好的参数文件。OtterTune尝试的所有参数文件和相应的数据库性能和统计信息都可以在服务器的可视化界面上轻松找到。上图为OtterTune的整体结构:客户端中的控制器由Java实现,使用JDBC访问目标数据库,收集其统计信息;驱动程序使用Python的结构,主要与服务器进行交互。服务端使用Django搭建网站,使用Celery调度机器学习任务;机器学习使用tensorflow和sklearn。更多关于OtterTune架构的细节请参考2018VLDB的demopaper[4]。2.随机抽样为了描述方便,我们不妨假设参数文件中有10个重要参数需要调优。我们将参数文件表示为:X=(x1,x2,...x10)对应数据库性能Y。Y可以是吞吐量、延迟或用户定义的度量。我们假设目标测量是延迟。那么我们要做的就是调整这10个数据库参数的值,让数据库的延迟尽可能的小。也就是找到一个合适的X,让Y尽可能的小。一个好的参数文件会降低数据库的延迟,即Y对应X越小,X越好。最简单直观的方法就是随机试,也就是给这10个要调整的参数一个大值一个小值,在这个范围内随机取值试。显然这样的随机方法效率不高,可能需要多次试验才能得到一个好的参数文件。OtterTune还支持这种在没有训练数据可用时收集数据的随机方法。与随机抽样相比,有一种效率更高的抽样方法,称为拉丁超立方体抽样。比如随机找3个0到3之间的数,简单随机抽样可能找3个0到1之间的数。拉丁超立方体抽样就是找一个0到1之间的数,找一个1到2之间的数,再找一个2到3之间的数字,比较分散。推高维度也是类似的情况。下图是二维情况。x1和x2的值在0到1之间。使用拉丁超立方体采样取5个采样点。先把x1和x2分成不同的范围,然后取样本点,使得每一行只有一个样本点,每一列也只有一个样本点。这样可以避免多个采样点出现在一个相似的范围内,使其更加分散。对于OtterTune,简单随机采样尝试的参数文件可能更集中和相似,而拉丁超立方体采样尝试的参数文件更分散和不同。显然,后者可以给我们更多的信息,因为尝试类似的参数文件很可能会导致信息较少的数据库性能相似,而尝试不同的参数文件可以更快地找到更好的。3.高斯过程回归上面的采样方法没有使用机器学习模型来预测参数文件的效果。当OtterTune没有数据训练模型时,可以使用上述方法收集初始数据。当我们有足够的数据(X,Y)时,OtterTune训练机器学习模型进行回归,即估计函数f:X→Y,这样对于参数文件X,使用f(X)估计值数据库延迟Y。那么问题就变成了找到一个合适的X使得f(X)的值尽可能小。这样我们就可以通过对f做梯度下降找到合适的X。如下图,横坐标是两个参数——缓存大小和日志文件大小,纵坐标是数据库延迟(越低越好):OtterTune用回归模型估计f,即给定值这两个参数,预估对应的数据库延迟。然后使用梯度下降来寻找合适的参数值,使延迟尽可能低。OtterTune使用高斯过程回归来估计上面的函数f。使用高斯回归的好处之一是它不仅可以估计给定X对应的Y值,还可以估计其置信区间。这可以恰当地描述参数调优的情况:对于同一个参数文件X,当对数据库多次运行相同的查询时,每次得到的数据库的性能可能因错误而不同。比如同一个参数文件和查询语句,这次执行的数据库延迟是1.8秒,下次执行可能延迟2秒,但是每次得到的延迟很可能是差不多的。高斯过程回归可以估计均值m(X)和标准差s(X),进而可以求出置信区间。比如上面的例子,通过回归我们估计延迟的均值为1.9秒,标准差为0.1秒,那么它95%的概率在1.7秒到2.1秒之间。再来说说探索和利用:探索就是在数据点很少的未知区域探索新的点。Utilization就是用这些数据在已知区域训练一个机器学习模型,有足够的数据点进行估计,然后找到一个好的点。比如我们知道有10个数据点(X,Y),X的9个点在0到1之间,X的1个点在1到2之间,X在0到1之间的数据点有很多,你可以利用这些数据点进行回归估计f:X->Y,然后利用f找到一个合适的X,使估计出的Y值尽可能好。这个过程是使用.探索是在未知领域尝试新的点。例如,X在1和2之间的已知点只有一个,信息很少,因此很难估计f。我们在1和2之间选一个X点试试。虽然效果可能不好,但是可以增加这块区域的信息量。当该区域有足够多的已知点时,可以使用回归来找到一个好的点。在OtterTune推荐的过程中,需要探索新的领域,利用已知领域的数据进行推荐。也就是说,需要平衡探索和利用,否则可能陷入局部最优点,找不到全局最优点。比如我们一直在用已知区域的数据做推荐。虽然我们可以在这个区域找到更好的点,但是在未被发现的未知区域可能会有更好的点。如何平衡勘探与利用一直是一个复杂的问题。要求尽可能找到一个好的点,并尽可能少地找到这个点。OtterTune采用的高斯过程回归可以很好的解决这个问题。核心思想是当数据足够多的时候,我们用这些数据进行推荐;当缺少数据时,我们在点数最少的区域探索,探索未知数最多的区域能给我们的信息量。上面利用了高斯过程回归的特点:它会估计均值m(X)和标准差s(X)。如果X周围的数据不多,估计的标准差s(X)就会偏大,直观的理解是,如果数据不多,不确定性就会很大,体现在标准差大.反之,当数据足够多时,标准差会变小,因为不确定性降低了。OtterTune使用置信区间的置信上限来平衡探索和利用。假设我们需要找到X以使Y尽可能大。则U(X)=m(X)+k*s(X),其中k>0为可调系数。我们只需要找到X使U(X)尽可能大。如果U(X)很大,则m(X)可能很大,或者s(X)可能很大。如果s(X)很大,说明X周围的数据不多,OtterTune正在探索未知区域的新点。如果m(X)很大,也就是估计的Y均值很大,那么OtterTune就是用已知数据找一个效果好的点。公式中的系数k影响勘探利用比。k越大,越鼓励探索新领域。4.有无数据OtterTune训练模型所用数据的好坏极大地影响其最终效果。只要有合适的训练数据,OtterTune过去几次推荐的参数文件一般都能达到比较理想的效果。当缺少训练数据(或数据集),甚至任何以前的数据时,OtterTune如何处理?当OtterTune没有任何数据时,高斯过程回归也能有效地在尽可能少的时间内找到一个好的参数文件。当数据很少时,OtterTune倾向于探索而不是利用,可以在每次探索新的参数文件时尽可能增加信息量,从而减少探索次数。这种方法比随机抽样和拉丁超立方体抽样更有效。同时,OtterTune还可以使用拉丁超立方抽样,选取少量参数文件作为初始数据进行尝试,然后使用高斯过程回归进行推荐。事实上,在OtterTune之前,系统iTunes[5]在没有数据的情况下使用高斯过程回归来推荐参数文件。OtterTune的改进是利用之前收集的数据做推荐,大大减少尝试次数和等待时间,提高推荐效果。想想看。当OtterTune的服务器配置在云端,多个客户端访问时,OtterTune会保存所有用户尝试的参数文件和对应的性能数据,以供使用。这意味着使用OtterTune的人越多,使用时间越长,它收集的训练数据就越多,推荐效果就越好。此外,OtterTune还使用Lasso回归自动选择需要调整的重要参数。数据库中有数百个参数,我们只需要调整重要的即可。需要调整哪些参数可以根据DBA的经验。同时,OtterTune还利用机器学习对参数的重要性进行排序,从而选出最重要的参数。另外,针对不同的工作负载,对应的参数文件也不同。例如,OLTP工作负载通常是许多简单的查询(如插入、删除),而OLAP工作负载通常是几个复杂的查询(通常是多个表的连接)。对于OLAP和OLTP,需要调整的参数和最优值是不同的。OtterTune目前的做法是使用一些系统统计数据(比如读/写的字节数)来表征工作负载,在现有数据中找到与用户工作负载最相似的,然后使用最相似的工作负载对应数据推荐。5.深度强化学习在OtterTune的进展中,我们尝试了深度强化学习的方法来进行数据库调优,因为我们发现数据库调优的过程可以很好地描述为一个强化学习问题。在强化学习问题中,有状态、动作和环境给出的反馈。如下图所示,整个过程就是在当前状态(st)和环境的反馈(rt)下做一个动作(at),然后环境会产生下一个状态(st+1)和反馈(rt+1),然后进行下一步操作(at+1)。在数据库调参过程中,状态就是参数文件,动作就是调整某个参数的值,反馈就是参数文件下数据库的性能。因此,我们对当前参数文件调整某个参数的值,得到一个新的参数文件,测试新的参数文件,得到相应的数据库性能,然后根据参数的好坏,继续调整参数的值。表现。这样,数据库参数调整的过程就可以很好地描述为一个强化学习问题,而深度强化学习就是用神经网络来表示状态或动作。我们使用了DeepDeterministicPolicyGradient(DDPG)算法,主要是因为DDPG允许动作在连续的区间内取值。对于参数调优,作用是调整某个参数的值,比如调整内存容量。DDPG允许我们尝试从128MB到16GB之间的任意值,而且这个范围是连续的。许多其他算法只允许在离散间隔内进行操作,例如只允许取几个值中的一个。通过实现和优化DDPG,深度强化学习最终推荐的参数文件与高斯过程回归推荐的参数文件相似。但是我们发现之前的高斯过程回归(GPR)更有优势,可以用更少的时间和次数找到满意的参数文件。如下图所示,我们在TPC-Hbenchmark中跑了一个query(Query13),OtterTune一次又一次推荐参数文件,直到取得好的结果(即相应的数据库延迟变低)。图中的横坐标是推荐数量,纵坐标是数据库的延迟。延迟越低越好。蓝线是深度强化学习,而黄线代表高斯过程回归模型。可以看到两个模型推荐的文件效果差不多,但是高斯过程回归收敛的次数少,推荐好的参数文件。深度强化学习需要更多的试验才能获得相似的结果。我们发现:DDPG算法模型的一些参数也需要调整,这些参数对效果影响很大。调整算法模型的参数也是一个费时费力的过程。这就导致了一个尴尬的局面。OtterTune是一个自动调整数据库参数的工具,OtterTune自身算法模型的参数也需要调整。相比之下,GPR的模型参数可以自动调整,从而实现OtterTune真正的自动化。GPR可以通过UpperConfidenceBound更好地平衡exploration和exploitation,比DDPG更高效。在没有或丢失数据的情况下,GPR可以用更少的次数找到好的参数文件。DDPG是一个更复杂的模型,包括神经网络,可解释性较差。需要更多的数据和更长的时间来训练和收敛。虽然它可以达到与GPR相同的推荐效果,但往往需要更多的次数和更长的时间,这意味着用户需要等待更长的时间才能得到满意的参数文件。6.展望对于数据库,有很多部分可以和机器学习结合。比如预测一段时间数据库的工作负载,比如通过挖掘数据库的日志来做自动预警,然后到更核心的部分,比如学习数据库索引,甚至帮助优化器优化查询。OtterTune的专用参数文件调整只是等式的一部分。由于OtterTune与数据库的交互只是一个参数文件,这使得该工具的通用性更强,理论上适用于所有数据库。在调优一个新的数据库时,我们只需要给OtterTune一些数据库的参数和统计信息,而不需要改变数据库的任何代码。此外,OtterTune的通用框架也可以用于调整其他系统的参数。例如,我们尝试使用OtterTune对操作系统的内核参数进行调优,取得了不错的效果。目前的OtterTune还有改进的空间:比如假设硬件配置需求是一样的,我们希望OtterTune可以使用不同硬件配置上的数据来训练模型进行推荐。另一个例子是,现在OtterTune一次只推荐一个文件。当有多台相同的机器时,我们希望一次推荐多个文件并并行尝试,这样可以加快推荐速度。此外,你也可以尝试将其与其他机器学习方法相结合。比如可以先用机器学习的方法预测工作量,然后根据预测的工作量提前调整参数文件。使用机器学习来优化系统是最近在工业界和学术界的热门话题。全球数据库厂商甲骨文目前的卖点是自治数据库[6],即自适应数据库,利用机器学习自动优化数据库,减少DBA干预。你一定知道在美国招聘一个高级DBA有多难。.甲骨文为此投入了大量的专家和资金,证明了它的产业价值。在学术上,一些ML和系统领导者在过去两年开了一个名为SysML[7]的新会议,专注于机器学习和系统的交叉领域。更不用说越来越多的相关论文,例如卡内基梅隆大学的OtterTune,以及麻省理工学院和谷歌开发的神经网络学习数据库索引[8]。以谷歌的JeffDean在演讲中的话结尾:计算机系统充满了经验法则,处处用启发式的方法来做决策,用机器学习来学习系统的核心部分会让它变得更好,更具适应性,这个领域充满了机会[9]。参考文献[1]运维失业了吗?机器学习可以自动优化你的数据库管理系统www.sohu.com/a/146016004_465914[2]https://github.com/cmu-db/ottertune[3]通过大规模机器学习自动调优数据库管理系统。DanaVanAken、AndrewPavlo、GeoffreyJ.Gordon、BohanZhang。SIGMOD2017[4]OtterTune自动数据库管理系统调优服务演示。BohanZhang、DanaVanAken、JustinWang、TaoDai、ShuliJiang、SiyuanSheng、AndrewPavlo、GeoffreyJ.Gordon。VLDB2018[5]使用iTunes调优数据库配置参数。SongyunDuan、VamsidharThummala、ShivnathBabu。VLDB2009[6]https://www.oracle.com/database/what-is-autonomous-database.html[7]https://www.sysml.cc/[8]学习索引结构的案例。TimKraska、AlexBeutel、EdH.Chi、JeffreyDean、NeoklisPolyzotis。SIGMOD2018[9]http://learningsys.org/nips17/assets/slides/dean-nips17.pdf