内存参数的确定方法、装置及设备与流程

文档序号:15615163发布日期:2018-10-09 21:11阅读:150来源:国知局

本发明涉及通信技术领域,尤其涉及一种内存参数的确定方法、装置及设备。



背景技术:

当前,构建在分布式系统基础架构hadoop大数据平台上的hbase(一种分布式的、面向列的开源数据库)数据库得到了广泛的应用,它通过采用在搜索引擎中构建二级索引的方式来更好地满足真实业务场景下的复杂查询需求,该搜索引擎即为es(elasticsearch,开源搜索服务器)。hbase数据库以检索条件字段和行健(rowkey)在搜索引擎中构造索引,用户在检索时先基于搜索引擎es检索到满足条件的记录的rowkey,再基于rowkey检索hbase获取对应记录的全部数据。

在es使用过程中,内存设置的堆内存参数heapsize对数据处理有很大影响。堆内存通常为es内存中最大的一块内存区域,也是被各个线程共享的内存区域,包括新生代内存、老年代内存和永久代内存。

传统的es内存设置,对于heapsize通常是基于经验设置固定值。但是,heapsize设置得过低会导致es数据加载效率低,在数据不断增加的情况下,es的内存会逐渐消耗殆尽,降低甚至阻塞了es索引数据的加载,使es频繁出现卡顿现象;如果heapsize设置得过高则会导致es内存利用率低,降低es运行效率等问题。



技术实现要素:

本发明实施例提供了一种内存参数的确定方法、装置及设备,能够确定合理的es内存参数,避免es频繁出现卡顿现象,以及es内存利用率低的问题。

第一方面,本发明实施例提供了一种内存参数的确定方法,包括:

建立开源搜索服务器es内存中索引文件占用的内存空间与所述es内存中堆内存的内存参数之间的目标映射关系,所述内存参数表示为所述堆内存分配的内存空间;

统计es内存中当前索引文件占用的内存空间;

基于所述当前索引文件占用的内存空间和所述映射关系确定所述es内存中堆内存的内存参数。

第二方面,本发明实施例提供了一种内存参数的确定装置,包括:

建立单元,用于建立开源搜索服务器es内存中索引文件占用的内存空间与所述es内存中堆内存的内存参数之间的目标映射关系,所述内存参数表示为所述堆内存分配的内存空间;

统计单元,用于统计es内存中当前索引文件占用的内存空间;

确定单元,用于基于所述当前索引文件占用的内存空间和所述映射关系确定所述es内存中堆内存的内存参数。

第三方面,本发明实施例提供了一种内存参数的确定设备,包括:

存储器、处理器、通信接口和总线;

存储器、处理器和通信接口通过总线连接并完成相互间的通信;

存储器用于存储程序代码;

处理器通过读取存储器中存储的可执行程序代码来运行与可执行程序代码对应的程序,以用于执行一种内存参数的确定方法,所述内存参数的确定方法包括:

建立开源搜索服务器es内存中索引文件占用的内存空间与所述es内存中堆内存的内存参数之间的目标映射关系,所述内存参数表示为所述堆内存分配的内存空间;

统计es内存中当前索引文件占用的内存空间;

基于所述当前索引文件占用的内存空间和所述映射关系确定所述es内存中堆内存的内存参数。

本发明实施例提供了一种内存参数的确定方法、装置及设备,本发明实施例中,建立es内存中索引文件占用的内存空间与es内存中为堆内存分配的内存空间之间的目标映射关系;统计es内存中当前索引文件占用的内存空间;基于当前索引文件占用的内存空间和映射关系确定es内存中堆内存的内存参数。本发明实施例中,首先建立了目标映射关系,然后可以统计当前引文件占用的内存空间,基于统计的当前数据和目标映射关系确定出当时合适的内存参数,如此基于当前引文件占用的内存空间来确定内存参数,可以保证内存参数设置的合理性,避免了内存参数设置不和里导致es频繁出现卡顿现象,以及es内存利用率低的问题。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍,显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是根据本发明一实施例提供的内存参数的确定方法的示意性流程图;

图2是根据本发明一实施例提供的内存参数的确定装置的示意性框图;

图3是根据本发明一实施例提供的内存参数的确定设备的示意性框图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

jvm(javavirtualmachine,java虚拟机)内存分配主要指的是在堆上的分配,对象的内存分配都是在堆上进行。jvm堆内存分配和回收的机制可以概括为分代分配、分代回收,即根据不同生命周期的对象使用不同的算法,基于对象生命周期的分析后得出的垃圾回收算法。

依据分析,es的内存占用是具有线性特征的,数学模型如下:

jvm内存=k1+k2+k3+k4+k5。

其中,k1表示java虚拟机栈内存,即java方法执行的内存,占用内存不多;k2表示本地方法栈内存,即java方法执行native方法的内存,占用内存不多;k3表示方法区内存,即各个线程共享的内存区域,最大64m;k4表示程序计数器内存,即java内存中最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器;k5表示堆内存(heapsize),即java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域。

堆内存k5包括三部分:k51、k52和k53。

k51表示新生代内存占用空间,在创建对象时,首先发生在新生代为对象份分配内存(大对象可以直接在老年代分配内存),大部分的对象在创建后很快就不再使用,因此很快对象变得不可达,于是被新生代的gc(garbagecollection,垃圾回收)机制清理掉,这个gc机制被称为新生代垃圾回收minorgc或叫新生代垃圾回收younggc。执行minorgc并不代表新生代内存不足,它事实上只表示在eden区上的gc,不会导致老年代垃圾回收fullgc,所以不会导致应用es出现卡顿现象。

k52表示老年代内存占用空间,创建的对象如果在新生代存活了足够长的时间而没有被gc机制清理掉(即在几次younggc后存活了下来),则会被复制到老年代,老年代的空间一般比新生代大,能存放更多的对象,在老年代上发生的gc次数也比新生代少。当老年代内存不足时,将执行majorgc,也叫fullgc,es的卡顿就主要是由该类fullgc导致的。

k53表示永久代内存占用空间,常量池中的常量和类等信息:常量的回收很简单,没有引用了就可以被回收。

基于经验可知,jvm内存的各部分中k1、k2、k3、k4相对占用空间较小,并且固定,jvm内存主要由k5构成,包括新生代内存占用空间、老年代内存占用空间和永久代内存占用空间的总和。

对于内存参数heapsize的设定主要考虑到新生代、老年代和永久代占用内存的总和大小,heapsize总内存占用空间主要通过确定新生代内存大小、确定永久代内存大小和确定老年代内存大小的步骤来设定。

新生代内存大小通常基于经验值和es常规设置,作为临时性的存储区域,一般2g即可满足需求;永久代内存用于存放class和method等meta信息,例如class在被load的时候被放入该区域,另外它还负责保存反射对象,因为本质上反射对象会生成一些元数据不能被回收,以便下次反射重复利用,es固定使用2gb内存。永久代和新生代内存占用空间不多,所以回收并不是必须的,可以通过参数来设置是否对类进行回收,该部分空间是否回收对es卡顿没有主要影响,可以暂时不考虑。

根据以上分析,内存回收的重点是老年代的内存回收分配,对于老年代内存回收的方式有多种。

以cms(concurrentmark&sweepgc,并发标记-清除的垃圾回收)策略为例,在内存使用比率参数fraction设置为75%的时候,即使用空间75%时触发cmsfullgc,为了保证在最极端的情况下老年代的空余内存也比新生代大(避免提升失败promotionfail),老年代空余内存需要为新生代的4-8倍,即为8gb~16gb,另外对于索引数据存储也会带来动态内存开销,这部分内存会随着索引数据的增加而增大,所以老年代的内存计算方法可以总结为:老年代内存=(8gb~16gb)+索引数据内存占用空间。

在索引数据量不断累积的情况下,随着累积的数据量的不断增加,由于heapsize参数设置不合理,引发了老年代内存触发较高频率的fullgc,导致jvm停止响应从而降低甚至阻塞了es索引数据的加载,从而频繁出现卡顿现象。同时es索引数据的加载效率降低,导致hbase与es数据不能同步,从而影响到数据检索的准确性。

基于上述原理,本发明实施例提出了内存参数的确定方法,以下通过具体实施例进行说明。

图1是根据本发明一实施例提供的内存参数的确定方法的示意性流程图。如图1所示,该方法包括以下步骤。

110,建立es内存中索引文件占用的内存空间与es内存中堆内存的内存参数之间的目标映射关系。

其中,内存参数表示为堆内存分配的内存空间。在本发明实施例中,通过es内存存储原理可知,堆内存的内存参数设置是否合理与索引文件占用的内存空间的大小有关,所以本步骤中建立目标映射关系,目标映射关系表示了内存参数与索引文件占用的内存空间之间的对应关系,即基于索引文件占用的内存空间可以确定出合理的内存参数。

120,统计es内存中当前索引文件占用的内存空间。

其中,统计es内存中当前索引文件占用的内存空间,用于确定当前状态下合理的内存参数。es内存中当前索引文件占用的内存空间,即为es内存中当前全部索引文件的大小,本发明实施例中可以通过python遍历es内存中所有索引文件来统计。

130,基于当前索引文件占用的内存空间和映射关系确定es内存中堆内存的内存参数。

其中,由于步骤110中建立了索引文件占用的内存空间和内存参数之间的目标映射关系,所以在统计出当前索引文件占用的内存空间后,可以基于目标映射关系确定出与当前索引文件占用的内存空间对应的内存参数。

需要说明的是,在步骤130确定出内存参数后,则可以将内存参数(例如,参数es_max_mem)调整为步骤130确定出内存参数,然后重新加载配置文件,使调整的内存参数生效。

本发明实施例中,首先建立了目标映射关系,然后可以统计当前引文件占用的内存空间,基于统计的当前数据和目标映射关系确定出当时合适的内存参数,如此基于当前引文件占用的内存空间来确定内存参数,可以保证内存参数设置的合理性,避免了内存参数设置不合理导致es频繁出现卡顿现象,以及es内存利用率低的问题。

可以理解的是,在本发明实施例中,步骤110还可以具体执行为如下步骤。

111,采集样本数据。

其中,样本数据包括堆内存中数据占用不同内存空间和堆内存中数据占用不同内存空间时对应的索引文件占用的内存空间样本。内存参数表示为堆内存分配的内存空间,要建立内存参数和索引文件占用的内存空间的目标映射关系,则需要分析堆内存中数据占用内存空间与索引文件占用的内存空间之间的关系,所以本步骤中首先采集在堆内存中数据占用不同内存空间,以及堆内存中数据占用不同内存空间时对应的索引文件占用的内存空间样本,即采集由堆内存中数据占用内存空间x和堆内存中数据占用内存空间为x时对应的索引文件占用的内存空间y构成的二维数据(x,y)。

需要说明的是,本发明实施例中可以在es实际运行中采集的数据。

112,基于采集的样本数据,构建索引文件占用的内存空间与堆内存中数据占用内存空间之间的内存空间数学模型。

其中,在步骤111采集了样本数据后,可以对采集的样本数据进行分析,分析两者之间的关系,然后基于分析的结果来构建内存空间数学模型。

本发明实施例中,将采集的二维数据进行分析可知,索引文件占用的内存空间与堆内存中数据占用内存空间之间为线性关系,所以可以构建线性关系的内存空间数学模型。

113,根据预设算法和内存空间数学模型,建立索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系。

其中,在步骤112建立出内存空间数学模型后,通过预设算法,利用采集的二维数据可以建立索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系。预设算法可以选择使用的算法,利用采集的二维数据计算出内存空间数学模型中的各个参数值,从而建立索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系。

114,将索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系,确定为目标映射关系。

其中,内存参数的表示为堆内存分配的内存空间,所以索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系即为建立的目标映射关系。

需要说明的是,索引文件占用的内存空间与堆内存中数据占用内存空间之间为线性关系,在步骤112中构建内存空间数学模型可以具体为公式1。

k=k51+k52+k53=k51+c0+c1×s1+c2+k53公式1

其中,k表示堆内存中数据占用内存空间,k51表示所述堆内存中新生代数据占用的内存空间,k52表示所述堆内存中老年代数据占用的内存空间,k53表示所述堆内存中永久代数据占用的内存空间,c0表示已知常量参数,c1表示未知常量参数,s1表示所述索引文件占用的内存空间,c2表示未知常量参数。

基于上述原理可知,k51和k53可以确定出具体数值,例如,k51=k53=2gb;由于k52=(8gb~16gb)+索引数据内存占用空间,所以c0的值确定为8gb~16gb,例如,堆内存不足使用8gb,堆内存充足16gb;索引数据内存占用空间=c1×s1+c2,c1和c2均为未知常量参数,需要通过步骤113计算得出,计算出c1和c2的之后即可确定出k与s1之间的映射关系。

另外,在步骤112构建出内存空间模型的基础上,步骤113可以具体执行为:基于预设线性回归算法和内存空间数学模型确定索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系。

本发明实施例中采用了线性回归算法计算映射关系,从而确定出内存空间数学模型中的位置参数确定。线性回归算法中通常通过损失函数来计算,现有的线性回归的算法的损失函数为公式2所示。

其中,n表示采集样本数据的个数;xi表示采集的样本数据中第i个堆内存中数据占用内存空间,f(xi)表示当所述堆内存中数据占用内存空间为xi时,基于内存空间数学模型计算出的索引文件占用的内存空间,yi表示在采集的样本数据中,第i个堆内存中数据占用内存空间xi对应的索引文件占用的内存空间。

需要说明的是,步骤111采集的样本数据为二维数据(xi,yi),其中i大于0且小于n的整数。在基于线性回归算法计算出内存空间数学模型中未知常量参数c1和c2后,可以确定出将索引文件占用的内存空间与堆内存中数据占用内存空间之间的映射关系,进而确定出目标映射关系。基于确定出目标映射关系执行步骤120和130后确定出内存参数。但是在实际运行中发现上述过程确定出的内存参数在应用后仍然会有卡顿的现象出现,经过实际运行的内存动态监控分析,发现通过步骤110计算出来的目标映射关系是单纯从数学角度分析问题,通过线性回归算法计算出的结果,使采集的样本数据均匀分布在内存空间数学模型对应的函数曲线两侧,这样在实际情况下会出现堆内存中数据占用内存空间大于为堆内存分配的内存空间,即大于通过目标映射关系确定出的内存参数,所以此时为堆内存分配的内存空间并不能满足堆内存中数据所需的内存空间,从而导致频繁触发fullgc,进而导致es仍旧出现卡顿情况,即根据上面算法计算出来的内存参数有时会偏小,在实际应用中,这个计算结果不能完全解决es内存不足导致的卡顿问题,因此将损失函数进行优化,优化后的损失函数为公式3。

其中,n表示采集样本数据的个数;xi表示采集的样本数据中第i个堆内存中数据占用内存空间,f(xi)表示当堆内存中数据占用内存空间为xi时,基于内存空间数学模型计算出的索引文件占用的内存空间,ymax表示在采集的样本数据中,堆内存中数据占用内存空间为xi时对应的索引文件占用的内存空间的最大值。

本发明实施例中,通过优化的损失函数对线性回归算法进行改进,调整线性回归算法的计算过程。损失函数在统计学还可以成为rss(root-rumrquare,残差平方和),本发明实施例中采用优化梯度下降算法,基于公式3中的损失函数来计算c1和c2,进而得出目标映射关系。

优化后的梯度下降算法伪代码基于r语言实现如下:

可以理解的是,在本发明实施例中,步骤120可以具体执行为:设置统计es内存中当前索引文件占用的内存空间的预设周期;统计在当前预设周期内索引文件占用的内存空间的变化量;基于前一个预设周期统计的索引文件占用的内存空间和变化量确定当前预设周期的当前索引文件占用的内存空间。

其中,本发明实施例中可以设置统计es内存中当前索引文件占用的内存空间的预设周期,在每个预设周期统计当前索引文件占用的内存空间。为了避免重复统计,统计方式可以为在第一预设周期统计的第一预设周期的当前索引文件占用的内存空间后,第二预设周期可以统计索引文件占用的内存空间在第二预设周期的变化量,然后结合第一预设周期统计的当前索引文件占用的内存空间确定出第二预设周期的当前索引文件占用的内存空间,依次类推,在后续每个预设周期统计当前索引文件占用的内存空间时,可以统计在当前预设周期内索引文件占用的内存空间的变化量,然后基于前一个预设周期统计的索引文件占用的内存空间和变化量确定当前预设周期的当前索引文件占用的内存空间。依次节省统计的资源和时间。

需要说明的是,本发明实施例中还可以周期性执行步骤120和步骤130,如此可以实现内存参数基于索引文件占用的内存空间进行动态的调整,保证内存参数实时的合理性,达到既规避es卡顿,又避免内存资源的浪费的目的,从而提高了jvmgc效率,保证es高效稳定运行。

需要说明的是,本发明实施例可以通过使用python语言编写脚本来实现本发明实施例所述的方法,包括:通过python遍历所有索引文件,统计全部索引文件大小总量s1;通过python语言基于目标映射关系(内存参数=k51+k53+c0+c1*s1+c2)计算出最合适的内存参数的大小;通过python调整es参数并调用es重新加载配置文件使jvm参数生效。另外还可以通过指令crontab定时任务定期调用上述脚本更新es内存参数,以及编写python脚本监控内存分配回收情况,了解监控动态优化的效果。

图2示出了根据本发明一实施例的内存参数的确定装置200的示意性框图。如图2所示,该装置200包括:

建立单元201,用于建立开源搜索服务器es内存中索引文件占用的内存空间与所述es内存中堆内存的内存参数之间的目标映射关系,所述内存参数表示为所述堆内存分配的内存空间;

统计单元202,用于统计es内存中当前索引文件占用的内存空间;

确定单元203,用于基于所述当前索引文件占用的内存空间和所述映射关系确定所述es内存中堆内存的内存参数。

本发明实施例中,首先建立了目标映射关系,然后可以统计当前引文件占用的内存空间,基于统计的当前数据和目标映射关系确定出当时合适的内存参数,如此基于当前引文件占用的内存空间来确定内存参数,可以保证内存参数设置的合理性,避免了内存参数设置不合理导致es频繁出现卡顿现象,以及es内存利用率低的问题。

可以理解的是,所述建立单元201具体用于:

采集样本数据,所述样本数据包括所述堆内存中数据占用不同内存空间和所述堆内存中数据占用不同内存空间时对应的索引文件占用的内存空间;

基于采集的样本数据,构建所述索引文件占用的内存空间与所述堆内存中数据占用内存空间之间的内存空间数学模型;

根据预设算法和所述内存空间数学模型,建立所述索引文件占用的内存空间与所述堆内存中数据占用内存空间之间的映射关系;

将所述索引文件占用的内存空间与所述堆内存中数据占用内存空间之间的映射关系,确定为所述目标映射关系。

可以理解的是,所述内存空间数学模型k,包括:

k=k51+k52+k53=k51+c0+c1*s1+c2+k53,

其中,k表示所述堆内存中数据占用内存空间,k51表示所述堆内存中新生代数据占用的内存空间,k52表示所述堆内存中老年代数据占用的内存空间,k53表示所述堆内存中永久代数据占用的内存空间,c0表示已知常量参数,c1表示未知常量参数,s1表示所述索引文件占用的内存空间,c2表示未知常量参数。

可以理解的是,所述确定单元具体用于:

基于预设线性回归算法和所述数学模型确定所述索引文件占用的内存空间与所述堆内存中数据占用内存空间之间的映射关系;

所述预设线性回归算法中的损失函数j为如下公式:

其中,n表示采集所述样本数据的个数;xi表示采集的样本数据中第i个所述堆内存中数据占用内存空间,f(xi)表示当所述堆内存中数据占用内存空间为xi时,基于所述内存空间数学模型计算出的索引文件占用的内存空间,ymax表示在采集的样本数据中,所述堆内存中数据占用内存空间为xi时对应的索引文件占用的内存空间的最大值。

可以理解的是,所述统计单元具体用于:

设置统计es内存中当前索引文件占用的内存空间的预设周期;

统计在当前预设周期内所述索引文件占用的内存空间的变化量;

基于前一个预设周期统计的所述索引文件占用的内存空间和所述变化量确定当前预设周期的当前索引文件占用的内存空间。

根据本发明实施例的内存参数的确定装置200可对应于根据本发明实施例的内存参数的确定方法中的执行主体,并且内存参数的确定装置200中的各个模块的上述和其它操作和/或功能分别为了实现图1中的各个方法的相应流程,为了简洁,在此不再赘述。

图3是根据本发明一实施例的内存参数的确定设备300的示意性框图。如图3所示,设备300包括处理器301、存储器302和通信接口303,存储器302用于存储可执行的程序代码,处理器301通过读取存储器302中存储的可执行程序代码来运行与可执行程序代码对应的程序,通信接口303用于与外部设备通信,设备300还可以包括总线304,总线304用于连接处理器301、存储器302和通信接口303,使处理器301、存储器302和通信接口303通过总线304进行相互通信。

具体地,处理器301还用于执行一种内存参数的确定方法;其中,所述内存参数的确定方法包括:

建立es内存中索引文件占用的内存空间与所述es内存中堆内存的内存参数之间的目标映射关系,所述内存参数表示为所述堆内存分配的内存空间;

统计es内存中当前索引文件占用的内存空间;

基于所述当前索引文件占用的内存空间和所述映射关系确定所述es内存中堆内存的内存参数。

根据本发明实施例的内存参数的确定设备300可对应于根据本发明实施例的内存参数的确定方法中的执行主体,并且内存参数的确定设备300中的各个模块的上述和其它操作和/或功能分别为了实现图1中的各个方法的相应流程,为了简洁,在此不再赘述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1