我们把系统的内部metric叫做内部指标;外部的性能数据,比如TPS/QPS/Latency叫做外部指标。在数据库参数调优场景中,具体做法是:Agent选择一个参数调整的action(也可能是多个参数)作用于数据库,根据执行action后的外部指标,计算应该获得的即时奖励。
在强化学习对应到参数调优这个场景。此场景的问题是:强化学习需要构造一张表,表明在某种状态下,执行某个操作,获得的收益后,我们才知道执行什么操作获得的收益是最大的。但是数据库的状态空间(性能指标)和动作空间(配置组合)特别大,组合这样一张表出来是不可能的任务。此时深度强化学习就派上用场了,我们要通过一个深度网络逼近这个Q-table的效果,也就是CDBTune的实现方法。
CDBTune实现
S为当前数据库性能状态(内部指标),S'为下一状态数据库性能状态
r为即时奖励,w为神经网络参数,a为采取的动作(配置参数的执行)
Q为状态行为价值函数
此模型主要分成两部分。
l数据库环境:如图左边,参数会被设置到这个环境里,然后环境的内部指标和外部指标会被采集,反馈给右边的模型。
l深度强化学习网络:如图右边,实现算法类似DeepMind发布的Nature DQN,采用两个Q-Network。
另外,Replay Memory是我们的记忆池,历史数据会被记录下来。然后训练会不断进行,不断加入记忆池。深度学习网络会从记忆池中随机选取样本机型训练。
在估计一个action的reward的时候,基于一个假设:我们的回报取决于对未来每一步的结果影响;而影响最大的,是最近的回报。通过
近似获得这个Q值。对于一个样本(s, a)而言,我们可以得到真正的回报r。这时候我们可以获得他们之前的Loss,调整左边的网络,使两边的Loss越来越小。这样我们的网络就会逐渐收敛,获得更好的推荐。
数据形式和相关策略
效果评估
通过测试可以看到,在不需要任何前期数据收集的情况下,CDBTune通过自我学习参数调优过程,达到较优的参数调优效果,CDBTune调优获得的吞吐和延时性能均达到较为理解的水平。这也是深度强化学习方法相对于其他几种方法的优势所在。
总结:
基于DQN智能调参的优势
化繁为简,无需对负载进行精确分类
调参动作更符合实际调参时的情况
无需获取足够多的样本来,减少前期数据采集的工作量
利用探索-开发(Exploration & Exploitation)特点,降低对训练数据的依赖,减小陷入局部最优的可能性
在实践过程中,我们也遇到一些问题:
选择动作实际运行,训练效率不高,训练周期长
对连续配置离散化处理,可能导致推荐配置的精度不高,收敛较慢
使用动作的最大Q值,导致Q值的过高估计问题
针对这些问题,我们也在不断优化和改进我们的模型,优化参数。相信CDBTune可以在未来取得更好的效果。