likes
comments
collection
share

SIGMOD19 CDBTune论文分享

作者站长头像
站长
· 阅读数 12

摘要

CDB的特点是多样化的instance(主要指硬件条件多样化)和易变化的查询负载。

现有的数据库调参研究有以下几点限制:

  • 采用了pipelined的学习模型,不能以end-to-end的形式优化全局性能

(以Ottertune为例,收集数据库状态后,使用因子分析和kmeans技术做数据预处理,再使用线性回归分析计算参数对性能的影响从而分析重要性,这些都是独立的模块,需要分别调整优化,前一个模块的结果会影响后一个模块,所以是pipelined的方法。而本文没有这些独立开的模块,收集数据库状态后直接投入网络进行训练得到结果,所以是end-to-end的方法。)

  • 依赖大规模且高质量的训练样本,这通常很难获取
  • 很多参数在高维连续空间中,且彼此依赖关系未知,此类调参表现不佳
  • 在云上,对于硬件配置和负载的变化适应性很差

为解决以上限制,本文提出了CDBTune。

  • 是首创的端到端的基于深度强化学习方法推荐参数的自动调参系统
  • 用DDPG方法在高维连续空间中实现了推荐参数
  • 只用有限的样本就可以完成初始训练
  • 采用了reward feedback,实现端到端学习,加速收敛,提高调节效率

关键词

RL(Reinforcement learning)、CDB(cloud database)、DDPG(deep deterministic policy gradient)、RF(reward function)

1.介绍部分

数据库调参方案可分为两大类:基于搜索的方法和基于学习的方法

基于搜索的方法:比如BestConfig,基于一些准则搜索最优配置,这类方法通常时间复杂度高,当一个新的调节请求来了,会重启搜索的过程,这样并没有利用到先前的知识。

基于学习的方法:比如OtterTune,学习历史DBA经验,来推荐配置。弊端如上文提到的那些。

2.系统架构

2.1 工作机制

CDBTune先基于训练数据训练一个模型,然后输入一个调参请求,利用模型推荐参数。

2.1.1 离线训练

训练数据:训练数据是一个集合<q,a,s,r>,q是一个查询负载的集合(比如一组sql查询),a是一组参数配置,s是数据库状态(以mysql为例一共63个metrics,包括14个状态值(比如buffer大小、页大小)和49个积累值(比如缓冲区读请求个数、加锁时间),数据库状态可以通过show status获得),r是性能(包括吞吐和延迟)。

训练模型:RL模型,模型只会离线训练一次。

有两种方式收集训练数据:

1)冷启动:用标准的负载测试工具(sysbench),生成负载集合。对于每一个负载,在CDB上执行该负载,并获得一条初始的四元组训练数据。

2)增量训练:在CDBTune的实际使用中,对于每个用户调参请求,系统都会根据CDBTune的参数推荐获得反馈信息,CDBTune会不断强化模型并且提升推荐准确率。

2.1.2 在线调参

如果用户想调参数据库,只需要提交一个调参请求,OtterTune、BestConfig都是这样的。当收到一个调参请求,系统会收集最近150s的查询负载q,得到当前参数配置a,在CDB上执行查询负载来生成当前状态s和性能r。之后用离线训练的模型做在线调参。最终,表现最好的参数将被推荐给用户。在线调参和离线训练有两个主要的不同。一是不再用模拟的数据,而是用真实负载在CDB上压测来调整模型。二是如果调参已经到了很好的表现或者调参步数到达了设定的阈值,调参就终止了。(在本文实验中,阈值为5)

2.2 系统架构

SIGMOD19 CDBTune论文分享

系统架构如图,控制器在客户端、CDB、CDBTune之间交换信息。当调参请求来到控制器,负载生成器会根据模拟负载或者回放用户负载对CDB做压测。同时,特征收集器收集并处理相关特征。处理完的数据存在内存池中,被输入到RL网络中。最终,推荐器产生参数推荐。

3.RL

为了模拟DBA try-and-error策略以及克服回归调参的缺点,采用RL。

3.1 基本思想

开始阶段,尝试了RL中最经典的Q-Learning和DQN模型,但是这些方法都没解决高维连续空间的问题。最终,采用DDPG方法。同时,reward函数(RF)非常重要,影响模型质量和准确性。通过模拟DBA调参经验,设计了RF函数。

3.2 CDBTune RL

主要挑战是映射数据库调参场景到RL中的action。如图,描述了RL中六个关键元素和数据库调参的对应关系。

SIGMOD19 CDBTune论文分享

Agent:其实就是CDBTune,收到reward(性能的改变)和state,更新调参策略来获得更高的reward(更好的性能)。

Environment:调参目标(精确到CDB中一个instance)。

State:st, agent的当前状态(比如63个特征)。

Reward:rt, 一个标量,t和t-1时刻的性能差异。

Action:at, 一个调参操作,会同时增加或减少所有的参数值。

Policy:定义了在某个时刻和环境下CDBTune的行为,是一个从state到action的映射。policy其实是一个深度神经网络。

RL工作过程:当在CDB执行推荐配置时,当前state会改变,metrics相应地改变。内部特征衡量数据库运行时的表现,外部特征衡量性能,agent根据这两个反馈信息更新policy,以推荐更好的参数。这个过程迭代执行。最终,输出最合适的参数。

3.3 RL for Tuning

不同于监督学习和非监督学习,RL依赖于积累的reward,而不是标签,来训练和学习。RL的目标是基于Environment的reward,优化policy。agent通过利用当前知识或者探索未知的state发现最佳的action(try-and-error)。模型的学习遵循两个原则:action依赖policy,policy被每个state的期望reward驱动。RL可以被分为两类:基于value的方法和基于policy的方法。基于value的方法的输出值是所有action的收益,并且根据最高值选择action。基于policy的方法的输出值是一个policy,可以根据policy立刻输出action。因为本系统需要使用action,所以选择了基于policy的方法。

本文为什么选择DDPG?

Q-Learning:它是一个最经典的基于value的方法,核心是计算Q-tables。Q-table的行代表state的Q-value,列代表action,衡量了如果当前state采用了这个action该有多好。

SIGMOD19 CDBTune论文分享

更新Q-table的公式是Bellman方程:

SIGMOD19 CDBTune论文分享

α\alpha α代表学习率,γ\gamma γ是衰减率(discount factor),如果接近0代表专注于短期reward,如果接近1代表专注于长期reward。在小的状态空间中Q-learning是有效的,一个Q-table不能存储太多的state。但是CDB的state通常多维且复杂。

DQN:DQN可以解决上述状态空间很大的问题。DQN用神经网络而不是Q-table表述Q-value。在DQN中,输入是states,输出一个向量(所有action的Q-value)。DQN采用Q-learning的方法更新Q-value。 它的核心思想有两个:Experience Replay 经验回放和Fixed-Q-Target目标网络。

Experience Replay:设计了一个回放内存池,存储所有的transition。由于采集的样本之间具有时间连续性,算法在连续一段时间内基本朝着同一个方向做梯度下降,不容易收敛。因此,把样本都存到一个内存池中,每个样本都有一个采样优先级(优先级通常根据预测error设置,error越大的样本,采样优先级更高,代表更需要被学习),然后根据采样优先级随机采一批样本进行学习,既可以学习现在也可以学习过去的经验,同时随机的抽取也降低了样本之间的相关性,模型不容易过拟合。

Fixed-Q-Target:没有只采用一个神经网络进行训练,而是设计了两个网络,当前值网络和目标值网络,这两个网络在一开始拥有相同的结构和参数配置。在训练过程中,当前值网络的参数不断地更新优化,只在一定间隔时间点将当前值网络的参数赋给目标值网络。引入目标值网络后,目标Q值的计算相对稳定,提高了训练的稳定性。

DQN流程:

  1. 给定状态sts_tst输入当前值网络,算出所有的Q(st,ai)Q(s_t,a_i)Q(st,ai),选出最大的QQQ,从而对应执行动作ata_tat
  2. 获得反馈rtr_trt,并且获得新的状态st+1s_{t+1}st+1
  3. (st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1})(st,at,rt,st+1)放入内存池中作为一个新的样本
  4. 从内存池中采集一批样本(si,ai,ri,si+1)(s_i,a_i,r_i,s_{i+1})(si,ai,ri,si+1)
  5. 计算一个目标值yi=ri+maxQ′y_i=r_i+maxQ'yi=ri+maxQ(这个Q′Q'Q是将si+1s_{i+1}si+1投入目标值网络算出的最大QQQ
  6. 有了yiy_iyiQQQ,从而可以得到损失函数,通过损失函数最小化,更新当前值网络的参数
  7. 每经过CCC次上述流程,就更新目标值网络为当前值网络

DQN输出的actions是离散值。然而,数据库中很多参数的值是连续的。所以这种方法也不行。

4.DDPG CDBTune

DDPG是一个基于policy的方法,是DQN和actor-critic算法的结合,可以直接学习policy。DDPG可以根据当前state立刻获得当前连续action的精确值,而不是计算所有action的Q-value。

4.1 DDPG

SIGMOD19 CDBTune论文分享

将CDB的instance作为Environment E。agent在t时刻从E获得归一化内部特征。agent产生参数设置ata_tat,在应用ata_tat之后收到一个rewardrtr_t rt。与大多数policy gradient方法类似,DDPG有一个带参数的policy函数:

at = μ(st∣θμ),θμ是状态st到action at的映射a_t = \mu(s_t|\theta^\mu),\theta^\mu是状态s_t到action a_t的映射at = μ(stθμ),θμ是状态staction at的映射,通常也称为actor。

Critic函数:Qμ(st,at∣θQ),θQ是可学习的参数Q^\mu(s_t,a_t|\theta^Q),\theta^Q是可学习的参数Qμ(st,atθQ),θQ是可学习的参数

Critic函数指导actor的学习,它评估了应用该actor产生的参数之后的结果(根据instance的state)。

受DQN和Bellman方程的启发,Q的期望定义为:

SIGMOD19 CDBTune论文分享

SIGMOD19 CDBTune论文分享

算法包括七个主要部分:

1)从内存中提取一批transition(st,rt,at,st+1)(s_{t},r_{t},a_{t},s_{t+1}) (st,rt,at,st+1)

2)将st+1s_{t+1}st+1投入actor网络,输出参数推荐at+1′a_{t+1}^{'} at+1

3)在向critic网络发送st+1s_{t+1}st+1at+1′a_{t+1}^{'} at+1之后,得到value Vt+1V_{t+1}Vt+1

4)根据Q-Learning算法,Vt+1V_{t+1}Vt+1由衰减率和VtV_tVt的乘积加上t时刻的reward值得到,从而可以估计当前状态sts_{t}stVt′V_{t}^{'}Vt

5)将sts_{t}st投入critic网络,获得当前状态sts_{t}stVtV_{t}Vt

6)计算VtV_{t}VtVt′V_{t}^{'}Vt的差平方作为损失函数,根据梯度下降更新critic网络的参数θ\thetaθ

7)用critic网络的输出Q作为损失函数,采用梯度下降平均指导actor网络的更新,所以对于actor网络的每次推荐,critic网络会给一个更高的分数

为什么用有限的样本就可以得到很好的结果呢?第一,因为参数之间的相关性,参数修改以后,数据库的改变不是随机的。第二,建模的时候采用了很少维度的输入和输出,让网络在有限的样本就可以有效收敛。第三,RL通常需要多维的样本而不只是大量的样本,对于CDBTune,改变数据库参数并收集表现数据,这些数据在学习的过程中是多维的。RL可以利用多维的数据不断更新和优化表现。最后,有效的RF也是其中一个原因。

4.2 Reward function

DBA的调参过程如下:

1)假设数据库当前表现是D0D_0D0,并且被DBA调整后的最终表现是DnD_n Dn

2)DBA调参,第一次调参之后的表现是D1D_1 D1。然后DBA计算表现差异δ(D1,D0)\delta(D_1,D_0)δ(D1,D0)

3)在第i次调参之后,DBA期待当前的表现好于前一次,但是他不能保证做到。所以DBA会比较两个值:

一个是DiD_i DiD0D_0D0的差异,一个是DiD_i DiDi−1D_{i-1} Di1的差异。如果DiD_i DiD0D_0 D0好,说明调参的方向是对的,reward是正的。否则,reward是负的。reward的值也是针对这两个差异值进行计算。因此,DBA每次调参不只是考虑前一次的调参,还要考虑初始状态。令r代表reward,T代表吞吐,L代表延迟。T0T_0 T0L0L_0 L0代表调参之前的吞吐和延迟。

在时刻t,计算针对t-1时刻和初始时刻的性能变化率。

SIGMOD19 CDBTune论文分享

由此设计reward函数:

SIGMOD19 CDBTune论文分享

同时需要定义吞吐和延迟在reward中所占的比重,因此可以自定义两个系数,系数之和为1。

SIGMOD19 CDBTune论文分享

如果优化的目标是吞吐和延迟,RF不需要改变,因为RF独立于硬件条件和负载改变,只依赖于优化目标。

作者也设计了其他的RF,比如:当前性能和前一次性能的差值,当前性能和初始性能的差值。但是只有上述RF可以达到最好的收敛和性能效果。

作者也研究了两个系数如何影响数据库的性能。在本实验中,设置C_L=0.6。

5.实验

负载:实验基于三种benckmark工具生成负载:Sysbench,MySQL-TPCH,TPC-MYSQL。

在六个工作负载上进行实验:read-only、write-only、read-write、TPC-H、TPC-C、YCSB。

调参系统:主要是与BsetConfig还有OtterTune进行了对比。

DBA数据:邀请了三位腾讯的资深DBA,从他们的调参结果中选出了最好的数据。

设置:CDBTune由PyTorch和scikit-learn库等工具实现。所有实验在腾讯云服务器上运行。

实验运用了七种CDB instance,硬件配置均不同。在CDBTune和OtterTune、BestConfig推荐参数的所有实验中,选择了最优结果。

5.1 效率对比

5.1.1 执行时间

记录了每一步的平均运行时间,大约为5分钟,主要分为5部分(除去数据库重启的2分钟):

a)压测时间:负载生成器收集数据库特征的时间

b)特征收集时间:从内部特征获得state向量的时间+从外部特征计算reward的时间

c)模型更新时间:训练过程中前向计算和反向传播的时间

d)推荐时间:从输入数据库state到输出参数推荐的时间

5)应用时间:从输出参数推荐到应用参数的时间

离线训练:CDBTune运用了大约4.7小时训练266个参数,2.3小时训练65个参数。注意参数个数只影响训练时间,不影响调参时间。

在线调参:对于每一个调参请求,执行了5步,线上调参时间是25分钟。

5.1.2 Baseline对比

CDBTune vs OtterTune vs BestConfig vs DBA

如图,对于每个调参请求,每种方案平均分别用了多少时间调参,可以看出CDBTune耗时最短。

5.2 有效性对比

1)考虑了三种调参顺序,一种是根据DBA以往调整各个参数的次数来做调参排序。一种是Ottertune发现的调参顺序。一种是CDBTune随机选择的调参顺序。可以发现在这三种调参顺序下,随着调参数目的增加,CDBTune始终保持了最好的性能。同时,DBA和Ottertune是需要提前对参数进行排序,但是CDBTune通过特征提取自动完成了这个过程。

2)在CDB-A的instance下,针对不同工作负载进行测试,可以看出,在所有的工作负载下,CDBTune的吞吐和时延都是最优的。

5.3 适应性

5.3.1 对于内存大小和磁盘容量变化的适应性

相比本地数据库,云数据库的特点是硬件环境易于调整。所以,要求本系统在不同的硬件条件下都可以做很好的调参。因此,做了多组实验,比如在8G的内存下训练模型,在32G的内存下推荐参数。以及相应地调整磁盘容量。可以看出,CDBTune始终让数据库达到了最佳的性能,即它对于硬件环境的改变有很强的适应性。

5.3.2 对于工作负载变化的适应性

用工作负载A下训练的模型,对工作负载B下的系统做参数推荐。对比多组实验,可以发现CDBTune始终让数据库达到了最佳的性能,即它对工作负载变化也有很强的适应性。