一种面向键值对存储引擎的参数自动调优方法、装置、系统与流程

文档序号:18464711发布日期:2019-08-17 02:21阅读:393来源:国知局
本发明属于存储
技术领域
:,具体涉及一种面向键值对存储引擎的参数自动调优方法。
背景技术
::随着云计算和大数据技术的不断发展和普及,数据存储量呈现出爆炸式增长的趋势。根据idc在2019年的预测,全球在2019-2023年预测期内的存储机容量将翻倍,增长到11.7zb,大规模存储的需求日益强烈。随着大规模分布式存储技术的发展,对传统关系型数据库的改造研究成为热点,出现了诸多以rocksdb作为存储引擎的新型数据库系统。rocksdb是一种基于日志结构合并树的键值对系统,它具有化随机i/o为顺序i/o的优点,大大优化了数据写入的性能,在提高吞吐量和减少时延方面方面有着巨大的优势,是当前大规模数据存储的首选产品。以rocksdb为存储引擎的系统目前主要有关系型数据库mysql、新型数据库tidb、分布式文件系统ceph以及区块链系统以太坊parity分支等,如此大范围的应用说明在底层优化键值对存储引擎具有很高的直接经济效益。然而,在动态变化的工作负载场景中,默认的参数配置不能发挥最佳的存储性能,对这些参数进行调优是一个挑战。rocksdb中的存储参数众多,它们之间的依赖关系复杂,即使同一个参数在不同的工作负载下也有不同的性能表现,并且这些参数在复杂多变的工作负载下缺乏自适应性,在极端情况下会导致写停止等严重的性能问题。这些存在的问题阻碍了键值对存储引擎的进一步应用。技术实现要素:发明目的:针对现有技术的缺陷与不足,本发明提出一种面向键值对存储引擎的参数自动调优方法、装置和系统,能够有效地应对在默认参数配置下,由于工作负载发生变化导致系统性能下降的问题,提升整个键值对存储引擎的环境自适应能力。技术方案:根据本发明的第一方面,提供一种面向键值对存储引擎的参数自动调优方法,所述方法包括以下步骤:依据键值对存储引擎中的参数配置方式,对参数进行预处理,并构建restful服务化框架;构建基于模型的deeppilco强化学习模型;运行上层数据库系统的工作负载,生成数据,训练模型;载入模型,针对输入的工作负载,输出策略产生的参数配置,应用到底层键值对存储引擎中。进一步地,所述构建基于模型的deeppilco强化学习模型包括:以系统状态和数据库状态作为强化学习的环境输入,以系统吞吐量作为奖励,以调节的参数作为动作;构建策略模型,用来选择动作,策略包括随机策略、线性策略和神经网络策略,其中随机策略是在待调参数的动作空间中随机选择一个作为动作,线性策略是在状态空间中通过一个线性函数映射到动作空间,神经网络策略是基于多层感知器将状态空间的值映射到动作空间;构建动力学模型,用来学习数据库的状态转移模型,所述动力学模型是一个bnn神经网络,其数据输入方法包括数据缓冲区和粒子采样;构建训练流程,设置模型训练参数和损失函数。进一步地,所述运行上层数据库系统的工作负载,生成数据,训练模型包括:在数据库上层生成多种类型的工作负载,监控系统状态、数据库状态;数据库后台线程将监控到的状态数据发送至强化学习模型中,强化学习模型进行动力学和策略学习;数据库后台线程轮询动作的策略结果,并在数据库的键值对引擎中进行实际的参数设置;数据库后台线程发送执行策略后的奖励至强化学习模型中,模型同时记录数据。根据本发明的第二方面,提供一种数据处理装置,所述装置包括一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如本发明第一方面所述的面向键值对存储引擎的参数自动调优方法。根据本发明的第三方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令被处理器执行时实现如本发明第一方面所述的面向键值对存储引擎的参数自动调优方法。根据本发明的第四方面,提供一种存储系统,所述存储系统作为供应用直接使用的第一存储系统,包括处理器和接口,所述处理器和所述接口通信,所述处理器用于执行如的本发明第一方面所述的面向键值对存储引擎的参数自动调优方法。有益效果:本发明实现了对键值对存储引擎的参数的自动调优,能够解决键值对存储系统中因工作负载发生变化导致默认的参数配置引起系统性能下降的问题,可应用于以日志结构合并树作为存储引擎的数据库系统、工作负载经常变化的场景中。附图说明图1是根据本发明实施例的参数自动调优方法流程示意图;图2是根据本发明实施例的存储参数预处理示意图;图3是根据本发明实施例的数据库客户端-模型服务器端交互时序示意图;图4是根据本发明实施例的实现算法细节示意图;图5是根据本发明实施例的训练流程示意图。具体实施方式下面结合附图对本发明的技术方案做进一步的详细说明。在一个实施例中,提供了一种应用于键值对存储引擎的运行时参数自动调优方法,可以应用在基于日志结构合并树的存储引擎中。例如,可以应用基于rocksdb封装的存储系统中,包括并不限于rocksdb、myrocks等。存储系统中的性能表现很大程度上决定于工作负载的类型。rocksdb键值对存储引擎使用的日志结构合并树是一种面向写优化的结构,这种结构通过在内存和磁盘中分层存储数据,累积一定量的数据后进行批量处理,在牺牲读性能的条件下实现了顺序写i/o。因此,提升整个键值对存储引擎的环境自适应能力包含两个方面,第一个方面是在写数据的场景下,通过配置参数控制写数据的速率和后台刷盘、合并操作,避免引起写停止等性能下降问题;第二个方面在于读写切换时,通过配置参数倾向于读或写进行针对性优化,避免在主要读的场景中因默认配置导致不能发挥最佳性能的问题。图1所示为根据本发明实施例的系统总体流程示意图。整个系统流程主要由模型和数据两大部分组成。其中模型部分包括预处理和模型拟合两个过程,预处理过程包括参数预处理和模型构建两块内容,模型拟合过程包括数据输入、模型拟合、动作输出三个方面,这三个方面相互交互,通过迭代的方式获得最终的结果。其中数据部分包括环境数据的采集和工作负载输入两个过程,环境数据的采集用作模型的输入,工作负载输入用来产生环境数据。所述方法包括以下步骤:步骤s10,依据键值对存储引擎中的参数配置方式,对参数进行预处理,并构建restful服务化框架。具体而言,对参数的处理过程包括:收集键值对存储引擎中的分别通过setdboption、setoption和readoption配置的三类参数;然后对三类参数提取最小值、最大值和默认值,并设置调参步长,形式为<参数:write_buffer_size},类型:size_t(mb),(参数最大值,最小值、默认值、调整步长):(1,-1,64,16)>。本发明旨在通过强化学习模型来学习得到最优参数。强化学习有三大要素:环境、动作、奖励,在键值对存储引擎中依次对上述要素建模。数据库系统内部状态、现有参数设定和操作系统的状态,共同构成模型的环境输入。环境的输入形式是<db0,…,knob0,…,os0,…>,其中db表示为数据库的状态(如读写操作比例,当前第1层的写放大系数等),knob表示为当前系统的参数设置(如memtable的大小等),os表示操作系统的状态(如内存、cpu使用占比等)。键值对存储引擎中的原始存储参数,固定步长后进行数值方向的调整,构成模型的动作输入。动作的输入形式是<a0,a1u,a1d,…,a4n,…>,其中a0表示此次不调整任何参数,下标u代表增加(数值类型),d代表减少(数值类型),n代表取反(布尔类型),这些动作只有一个为1,其他均为0,即每次只进行一个操作。进行决策时,输出的策略也是动作ak。作为执行动作后的反馈,奖励需要体现性能的变化,这里的性能包括读和写两部分。对于读,使用每秒的查询数(qps)度量,对于写,使用每秒的吞吐量(tps)度量,两者除以基准性能测试下的bqps、btps分别进行放缩,得到相对性能指数。然后使用相对性能指数乘以分钟时间窗口内每种操作所占的比例,得到最终的奖励:其中αread表示读操作所占的比例。其中环境数据通过系统监控实现。对于系统/进程cpu、内存数据,使用开源的psutil工具获取系统和进程的利用率数据,包括cpu(psutil.cpu_percent)、内存(psutil.virtual_memory())、磁盘(psutil.disk_usage(path))等,对于数据库状态数据,通过db->getproperty("rocksdb.stats")和options.statistics.tostring()获取内部的统计信息,如通过db->getintproperty(db::properties::ktotalsstfilessize,&total_sst_size)便可以获得整个数据库的存储空间。如图2所示,为本发明实施例提供的一种存储参数预处理示意图。rocksdb中的存储参数数值范围并不相同,因此首先对上述指标进行放缩和标准化等预处理工作。对于离散型的存储参数,如memtable_whole_key_filtering,只有true或false两种取值,将其0-1化,调整方向只有一个,即取反操作;对于连续型的存储参数,如write_buffer_size,取值范围为1mb以上,并且没有上限,通常取64mb,因此以默认64mb为基线,步长为16mb,调整方向有增加和减少两种,并且有最小值约束;当然系统也并不一定需要调参,当调整的收益没有达到阈值时,可以保持原样,放弃此次调参计划。图2中展示了具体的处理方法,其中类型栏表示该参数的原始数值类型,括号里面的单位进一步说明数值的单位,bool表示这是开关参数,kb/mb表示容量参数,count表示纯数值参数,处理栏的四元组分别表示(参数最小值,参数最大值,参数默认值,参数调整步长),其中参数调整的步长根据经验确定。该步骤得到的数据处理后的格式为:<参数设置方法,参数名称,数据类型,数值单位,最小值,最大值,默认值,步长>。按照参数设置的方式分为三类,第一类为通过setdboption设置的参数,面向整个rocksdb系统,主要涉及到线程的控制,如后台线程的设置:max_background_jobs;第二类为通过setoption设置的参数,面向列簇的,主要涉及到日志结构合并树结构和内存使用的控制,如内存写的缓冲区大小:write_buffer_size;第三类为通过readoption设置的参数,面向读操作,涉及到读取时的行为控制,如预读取的字节数:readahead_size。参数经过预处理后通过框架进行交互。在具体实施时,本发明通过设计restfulapi,构建数据库客户端-模型服务器端框架。图3所示为本发明实施例提供的一种数据库客户端-模型服务器端交互时序示意图。整个系统为客户端-服务器端模式,客户端为存储引擎,服务器端为自动调参模块。在自动调参模块中,主要进行模型训练和提供基于restfulapi的模型在线服务;myrocks在系统运行过程中作为客户端,使用后台线程保持与自动调参模块的交互,完成向服务器发送和请求数据等任务。rocksdb为参数调优的最终执行者,根据myrocks客户端获取的参数设置信息选择更新系统的一个存储参数或不进行参数更新。其中,资源的路由主要有三个:/state客户端向模型服务端发送系统状态;/reward客户端向模型服务端发送奖励函数值;/action客户端向模型服务端请求动作设置;客户端通过get/put操作经资源路由实现与服务器端的交互,下面以一个例子阐述这种交互过程。首先启动mysql数据库,运行myrocks实例,并启动服务器端,在执行插入操作(insertintotable)时,myrocks客户端收集系统状态,通过/state路由发送至服务器端;服务器端获得状态输入时,进行在线推理,并输出采取的动作;客户端通过路由/action轮询请求,直到获取到服务器端的动作,然后根据动作在rocksdb中设置新的参数或不进行任何操作;一分钟后,客户端计算此次调参的奖励,通过/reward路由向服务器端反馈,若是训练阶段,则根据奖励来更新策略,若是在线推理阶段,则不产生实质作用。基于步骤s10,区分对待不同的参数配置方式,并将参数处理成可供模型读取的格式,为自动化调整参数提供操作基础。使用restful服务化框架,以资源的方式处理请求。客户端-服务器端相分离,客户端通过请求的方式与服务器端通信,实现了不同程序设计语言间的互操作,提供了灵活的操作性,方便数据库端调用模型的输出结果。步骤s20,构建基于模型的deeppilco强化学习模型。具体包括以下步骤:s21、以系统状态和数据库状态作为强化学习的环境输入,以系统吞吐量作为奖励,以调节的参数作为动作;s22、构建策略模型,用来选择动作,其中策略包括随机策略、线性策略和神经网络策略三种。随机策略是在待调参数的动作空间<a0,a1u,a1d,…,a4n,…>中随机选择一个作为动作;线性策略是在状态空间中通过一个线性函数映射到动作空间;神经网络策略是基于多层感知器将状态空间的值映射到动作空间,即策略的输入是系统状态和数据库状态,输出是要采取的动作;s23、构建动力学模型,学习数据库的状态转移模型。首先设置数据输入方法,包括数据缓冲区和粒子采样。数据缓冲区用来保存状态空间。数据缓冲区的实现为固定长度的队列,新数据添加至队列的尾部,并删除队列头部的溢出数据,其中数据包含数据库状态、相邻状态间的差值、所实施的动作和得到的奖励。动力学模型是一个bnn神经网络,用来学习数据库系统的状态转移模型,组成包括dropout、全连接隐藏层和线性层,并使用relu或tanh激活函数;在动力学模型中,为了实现输入输出的不确定性,使用多个不同的动作进行粒子采样。即输入的动作是一个分布,通过这个分布获取数据库系统状态的多个输出,然后计算输出状态的均值和方差,构造状态的高斯分布模型,然后在这个高斯分布模型中采样k个粒子,从而数据库系统下一个时刻的状态输出也是一个分布;s24、构建训练流程,设置动力学模型训练参数和损失函数:隐藏层维度设置为200,隐藏层深度设置为2,动力学模型每轮迭代次数为50,批数据大小为256,学习率为0.001,dropout概率为0.1,l2正则化系数为0.00001,激活函数为relu,损失函数为均方损失函数(mseloss),并使用adam优化器进行梯度下降优化。设置神经网络策略模型的训练参数和损失函数:隐藏层维度设置为100,深度为1,激活函数为relu,策略迭代次数为100,粒子采样大小为30,时间窗口为25,并使用adam优化器进行梯度下降优化。如图4所示,为本发明实施例提供的一种算法细节示意图。deeppilco算法包含三个层次,底层为学习到的状态-动作概率转移模型,具体是通过贝叶斯网络实现的;中间层为对长期预测进行的近似推断,即利用底层的概率模型和策略π,预测在该策略下后面的状态分布:p(s0,s1,…,st),利用状态值函数来评估策略π,其中c(st)表示当前状态下的奖励函数,p(st)表示状态分布的转移函数;顶层为策略学习和更新,这里是基于奖励函数的梯度反向传播方法。基于步骤s20,通过基于模型的强化学习对存储参数和运行环境进行非线性建模,提供自动调参的算法依据。通常的无模型强化学习方法学习效率低下,需要大量探索环境,成本很高。而基于模型的方法先从数据中学习模型,然后基于学到的模型对策略进行优化,从而变成一个最优控制问题。这种方法具有泛化性,主要体现在当训练完成后,智能体便学到了一个比较好的描述系统的模型,当外界环境变化后,很多时候系统自身的模型是不变的。因此在参数调优场景中,可以高效地学习到存储参数和工作负载之间的复杂关系。步骤s30,运行上层数据库系统的工作负载,生成数据,训练模型。包括以下步骤:s31、在数据库上层生成多种类型的工作负载,监控系统状态、数据库状态;s32、数据库后台线程将监控到的状态数据发送至强化学习模型中,强化学习模型进行动力学和策略学习;s33、数据库后台线程轮询动作的策略结果,并在数据库的键值对引擎中进行实际的参数设置;s34、数据库后台线程发送执行策略后的奖励至强化学习模型中,模型同时记录数据。如图5所示,为本发明实施例提供的一种训练流程示意图。整个系统的模型训练分为两部分,首先进行使用随机策略进行预训练,获得一个基准动力学概率转移模型,然后使用神经网络策略继续训练,迭代若干次后,得到最终的强化学习模型。保存这个模型至磁盘中,在服务阶段只需载入模型对输入的环境状态进行推理即可。具体来看,其中数据库中的工作负载体现为不同比例读写的任务,读任务形式为select语句,写任务则有insert、update、delete语句。通过上述工作负载生成状态数据,形式为<cpu_use_percent:0.1,mem_use_percent:0.3,…,l0_score:0,l0_w_amp:1.0,l0_rd:0,l0_wr:36,…>,动力学模型的输入为经过差分后的状态数据,即形式为<δcpu_use_percent,…,δl0_score,…>,输出为下一时刻的<δcpu_use_percent,…,δl0_score,…>,策略学习的在动力学模型所学习到的概率转移基础上,对于神经网络策略进行梯度下降更新,得到强化学习模型。获取到策略后,在rocksdb中设置参数时,首先对预处理后的存储参数进行范围还原,即原始参数加上策略的动作方向,如max_background_flushes=3-1=2。对于通过setdboption设置的参数,设置形式为db->setdboptions({{"max_background_flushes","2"}}),对于通过setoption设置的参数,设置形式为db->setoptions({{"write_buffer_size","131072"}}),对于通过readoption设置的参数,设置形式为readoptions.readahead_size=131072。基于步骤s30,利用数据训练模型,拟合模型中的参数,进而实施自动调参。通过运行上层动态工作负载,产生具有一定约束条件的数据,为模型提供可靠的数据输入。通过对系统环境和数据库环境监控,对存储引擎的运行环境进行刻画,为参数调优模型提供状态输入。通过训练模型,调节模型参数的权值,获得存储参数和环境之间的非线性映射,并根据贪心方法选择动作产生收益最大的策略,指导需要调节的参数。步骤s40,载入模型,针对输入的工作负载,输出策略产生的参数配置,应用到底层键值对存储引擎中。包括以下步骤:s41、数据库后台线程将监控到的状态数据发送至强化学习模型中,强化学习模型计算策略;s42、数据库后台线程轮询动作的策略结果,并在数据库的键值对引擎中进行实际的参数设置;s43、数据库后台线程发送执行策略后的奖励至强化学习模型中,模型同时记录数据。基于步骤s40,在运行时根据数据库输入的环境状态,经过差分处理后,神经网络策略模型给出动作空间的概率输出<a0:0.2,a1u:0.02,a1d:0.003,…,a4n:0.04,…>,选择其中概率最大的作为待调参数,然后rocksdb应用新的参数设置,实现自动化的参数调优机制。这个在线推理和决策过程完全不需要人工的干预,可以根据模型监控到的工作负载变化情况动态调整相关参数的值,因此具有很高的灵活性。基于与方法实施例相同的技术构思,根据本发明的另一实施例,提供一种数据处理装置,所述装置包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现方法实施例中的各步骤。本领域技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1