一种基于贝叶斯网络定位HDFS关键低效函数的性能分析方法与流程

文档序号:20204392发布日期:2020-03-27 20:59阅读:185来源:国知局
一种基于贝叶斯网络定位HDFS关键低效函数的性能分析方法与流程

本发明涉及一种基于贝叶斯网络定位hdfs(分布式文件系统)关键低效函数的性能分析方法,用于大数据分布式文件系统的性能分析,资源监控,性能瓶颈诊断和可视化。



背景技术:

在过去的几十年当中,互联网技术飞速的发展,计算机、手机等终端的普及,更是使得互联网走进了千家万户,与此带来的就是数据成指数级的增长,这背后便需要大数据和分布式计算的支持。分析大数据存储系统,可从四个层面来分析:裸设备、本地文件系统、分布式文件系统、大数据应用。其中,分布式文件系统是其中重要的一环。分布式计算需要有分布式文件系统的支持,所以,分析和优化分布式文件系统的性能,具有非常重要的研究和应用价值。如今被广泛采用的大数据应用平台,hadoop和spark,都把hdfs(hadoopdistributedfilesystem)作为默认的分布式文件系统。所以hdfs的性能优化,具有非常重要的研究和应用价值。

以往的研究,大部分都把hdfs作为黑盒来分析,这样粗粒度的分析没办法发现性能问题的根本原因,所以据此给出的优化方案不一定能从根本上解决hdfs的性能问题。也有通过trace分析来定位性能瓶颈的研究,但是其分析的方法不够深入和系统。现有的hdfs分析方法大致有以下几种方法:

(1)benchmark测试

关于分布式文件系统性能分析的工作,有很多是采用benchmark或者运行一些简单的测试程序,统计读写时间的。有的利用hadoop自带的testdfsio对hdfs进行性能评测。有的使用两个典型的benchmark,terasort和testdfsio,对比了hdfs和lustre文件系统上hadoop的性能表现。有的使用性能评价进程代数(performanceevaluationprocessalgebra,pepa),一种形式语言,对hdfs的性能进行分析,然而只能拿到写操作的响应时间这个层次的性能指标,粒度太粗,无法深入到hdfs系统内部对其进行优化;

(2)基于统计的分析方法

这种方法主要是向分布式文件系统插桩,获取详细的底层信息,计算出任务执行每一个步骤所用的时间信息,通过统计学的方法对各个函数进行分析,从而找出低效原因。这种方法的弊端在于查找低效函数的方法完全基于统计方法,有的只是进行单纯的时间比较,选择时间较长的为低效函数,这种方法得出的低效原因不够全面,同时不具备改进的可行性;

(3)局部优化

关于hdfs的性能优化,许多研究只针对其性能问题的一个点来进行优化。例如,有的方法优化了hdfs的冗余备份策略,有的针对hdfs处理小文件性能较低的问题进行了优化,有的研究专门优化了hdfs的名称节点。这些都不能从宏观层次对hdfs的性能进行全局的优化。

总之,现有的技术,或粒度太粗,或不够全面,不能从全局对hdfs进行性能分析和优化。



技术实现要素:

本发明技术解决问题:克服现有技术的不足,提供一种基于贝叶斯网络定位hdfs关键低效函数的性能分析方法,可以进行函数级的细粒度关键低效函数的定位,同时,具有全局性。

本发明技术解决方案:一种基于贝叶斯网络定位hdfs关键低效函数的性能分析方法,基于htrace插桩得到函数特征信息,然后对函数经过贝叶斯网络和统计学的原因分析,进而得出hdfs的关键低效函数,其优点在于从较细粒度鉴定hdfs层的低效原因分析,便于用户定位性能瓶颈,对分布式文件系统进行改进,具体包括以下步骤(1)-(8):

步骤(1)对hdfs进行函数级源代码插桩;

对hdfs进行函数级性能分析的基础是得到有效的性能数据,方法就是插桩,插桩时,首先应当将探针,即性能采集的代码,插入hdfs源码中的函数当中,函数如表1所示,从而可以在应用程序运行过程之中获得hdfs被插桩函数的函数入口和出口的时间戳、函数读写的数据量特性,在待插桩的函数中入口处,插入调用插桩函数的代码,插桩使用的函数接口为:

tracescopenewpathtracescope(stringdescription,stringpath);

表1插桩目标函数

步骤(2)对插桩得到的数据进行采样;

当探针被插入在某些执行时间很短但非常频繁的代码段时,插桩代码对程序的性能干扰有可能会比较严重。而且,如果程序的执行时间较长,且系统的规模较大,则产自的数据有时会过于庞大,难以存储和分析。本文选用改进的htrace进行采样,采样方法为令牌桶算法,参数设置为令牌桶大小为1000,时间间隔为180ms;

步骤(3)对函数进行低效概率的计算;

将步骤(2)得到的函数执行时间进行统计计算。对于涉及i/o的函数,计算的指标为单位数据读写时间,计算方法如下:

其中,表示函数f在第i次执行时的执行时间,表示函数f在第i次执行时读写的数据量。不涉及i/o的函数,计算的指标为执行时间,即:

对每一个函数f,计算的25%到75分位点之间的平均值,将超过平均值1.5倍的执行次数除以全部的执行次数,这个比值就是得到的函数的低效概率;

步骤(4)构建函数低效概率数据集;

将步骤(1)至步骤(3),每次执行应用程序,得到一组各个函数的低效概率,作为一条数据,不同的实验采用不同的工作负载或者不同的数据规模,实验不少于50次,形成不少于50条数据,将这些实验数据统一整合起来,从而可以构建起一个低效函数的数据集;

步骤(5)通过低效函数数据集,使用结构学习的方法构建贝叶斯网络;

此处的贝叶斯网络的节点表示函数,节点的参数表示函数低效的概率,有向边表示函数之间低效行为的相互影响关系。贝叶斯结构学习就是从数据集当中,通过统计学方法和贝叶斯概率计算,生成一个表示条件概率的有向无环图;本方法使用贝叶斯评分策略和爬山搜索法进行结构学习,贝叶斯评分方法是一种经典且有效的评分策略,爬山法则减小了搜索空间,降低了算法的复杂度,使得方法可行性更高,结构学习的公式分为评分函数和搜索策略两方面:

贝叶斯评分:

g是表示变量集x中变量xi之间概率依赖关系的有向无环图,d为样本数据集,为超系数,i为节点节点集x的第i个节点xi,j为pa(xi)的取值,k为xi的第k个取值,nijk表示数据集中满足条件:xi=xik;pa(xi)=pa(xi)j的实例数目。

爬山搜索:

令e为所有候选边集合,δ(e)表示在网络结构中添加新边e(e∈e)后,评分函数的变化。首先,假设初试网络结构为空网络,从候选边集e中选择一条新边e,使其满足条件δ(e)≥δ(e'),如果满足条件,将e添加到当前网络结构中,并从候选边集合e中删除边e,并继续寻找下一条符合条件的边e’,如果找不到满足条件的边,则停止;

步骤(6)在结构学习的基础上进行参数学习;

参数学习为学习变量相对于父节点的概率依赖程度,进而获得局部的条件概率分布函数,目前两种常用的参数学习方法是最大似然估计方法和贝叶斯方法,当数据集的记录数不充分时,最大似然估计的计算精度通常不够高,而且在某些时刻,最大似然估计之的计算公式会失效,贝叶斯方法则可以有效地克服最大似然估计的这些不足,故本发明中采用贝叶斯方法进行,参数学习具体公式如下:

假设参数θ的先验分布为dirichlet分布,那么参数θ的后验概率也服从dirichlet分布,则参数θ的最大后验估计为:

θ={θ1,θ2,···,θn}表示网络中节点xi相对于其父节点集pa(xi)的条件概率分布表,为xi的第k个取值,相对于pa(xi)的第j个值的估计值,为超系数,i为节点节点集x的第i个节点xi,j为pa(xi)的取值,k为xi的第k个取值,nijk表示数据集中满足条件:xi=xik;pa(xi)=pa(xi)j的实例数目;

步骤(7)遍历每个函数,对所有函数执行下面的判断逻辑,包括以下步骤:

(7-1)对遍历到的任意函数f,判断该函数低效概率是否大于预设阈值thresholdlow,所述预设阈值thresholdlow根据用户的配置设定;如果大于阈值,则标记该函数为低效函数,执行(7-2),否则标记该函数不是低效函数,继续判断其他函数;

(7-2)将得到的所有低效函数的低效概率置为100%,在这个前提之下,利用贝叶斯网络学习到的条件概率分布关系,计算其他非低效函数节点的后验概率,如果这个后验概率超过给定阈值thresholdlow,则认为此非低效函数由非低效变为低效,统计在将所有低效函数的低效概率置为100%之后,由非低效转变为低效的非低效函数个数为npre,并继续执行(7-3);

(7-3)遍历所有低效函数,对任一低效函数f,将其低效概率置为0%,其他低效函数概率继续保持100%,以此为前提,计算所有非低效函数节点的后验概率,如果这个后验概率超过给定阈值,则认为此非低效函数由非低效变为低效,记由非低效转变为低效的函数的个数为判断是否大于预设阈值thresholdnode,所述预设阈值thresholdnode根据用户的配置设定,如果大于则认为函数f是关键低效函数,并对其执行(7-4),否则该函数不是关键低效函数,继续判断其他低效函数;

(7-4)遍历所有低效函数,计算其运行时间占程序总运行时间的比重,判断这个比重是否大于预设阈值thresholdweight,所述预设阈值thresholdweight根据用户的配置设定,如果大于则该函数为值得优化的关键低效函数,否则该函数不值得优化;

步骤(8)展示值得优化的关键低效函数并进行原因分析。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,步骤(1)中的hdfs源码插桩,为扩展htrace采集的trace信息。获取hdfs中名称节点、数据节点、客户端节点之间所有的通信trace信息,同时采集函数的参数信息,包括数据的发送、接收、读取、写入操作的数据规模,为进一步的分析提供充分的数据支持。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,在hdfs的性能检测当中,没有明确的对于低效函数的定义,本专利所述的低效函数概率,其计算公式如下:

其中,plow(f)为函数f对应的低效概率;flow(f)为函数f的低效执行的次数,其具体的计算方法为,在插桩得到的函数f的所有执行时间或单位数据读写时间当中,求出其25%和75%的分位点,将在这个范围之内的求平均值,记为e(tf),flow(f)为函数f的所有执行中,满足的执行次数,fall(f)为函数f的总执行次数。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,步骤(7-1)需要获取低效函数的总个数,判断的标准是预设阈值thresholdlow,针对统计原始低效函数个数的计算公式如下:

nodef=1,plow(f)>thresholdlow

=0,plow(f)≤thresholdlow

nlow=σnodef

nlow代表在贝叶斯网络建立之前,根据统计结果,计算出的低效函数的总个数,thresholdlow代表判断函数是否低效的预设阈值,nodef为中间变量,判断函数f的低效概率是否大于预计阈值。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,步骤(7-2)中,非低效函数转变为低效函数的过程是:以低效函数的概率为1为初始条件,在网络上做推理,则推理之后非低效函数的后验概率会发生变化,如果变化后的后验概率超过了预设阈值thresholdlow,则认为此非低效函数转变为了低效。由非低效转变为低效的函数个数记为npre。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,步骤(7-3)中非低效函数转变为低效的函数的个数表示在步骤(7-2)的基础上,把低效函数f的概率从100%降为0%后,以这些低效函数以及函数f为前提条件,在贝叶斯网络上推理之后,由非低效转变为低效的函数的个数。认为满足如下条件的低效函数f是关键低效函数:

其中,thresholdnode为预设阈值,由用户配置指定。

进一步地,上述基于贝叶斯网络定位hdfs关键低效函数的性能分析方法中,步骤(7-4)对于函数运行时间占程序总运行时间的比重的方法,即计算函数实际运行时间的方法,分为以下三种:

第一种方式:

其中,代表函数f所求的实际运行时间的结果,代表函数f的所有执行时间在25%至75%范围区间之内的平均值,代表函数f在所有节点的运行次数的平均值;

第二种方式:

其中,代表函数f所求的实际运行时间的结果,代表函数f的所有执行时间的总和,代表函数f运行的节点总数;

第三种方式:

其中,代表函数f所求的实际运行时间的结果,代表函数f在节点node上的总执行时间,由于插桩得到的trace信息中,包含了函数每一次执行时所在节点的ip地址,所以可以根据这个信息简单求和得到。

在不同的情况之下,选择适合计算时间占比的方式来进行判断,在有些情况下,也可以同时使用多种方式进行判断。

本发明与现有技术相比的优点在于:

(1)在函数级粒度进行hdfs的性能分析和定位,本发明是基于插桩到hdfs所得到的函数特征所进行的性能分析,粒度较细,可以深入系统内部进行分析。

(2)因为采用的人工选取插桩位点,所以可以在一定程度上,尽可能将有关的插桩位置详细和完善,相对于只基于一个具体的性能问题进行分析的方法,更具备全面性。

附图说明

图1为实现本发明基于贝叶斯网络定位hdfs关键低效函数的性能分析方法的系统架构示意图;

图2为本发明基于贝叶斯网络定位hdfs关键低效函数的性能分析方法的流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

本发明的基本思路在于首先提取函数的运行时间特征计算每个函数低效的概率,通过函数低效概率生成函数的贝叶斯网络,再根据时间特征筛选低效函数,从而得出关键低效函数。

图1为实现本发明基于贝叶斯网络定位hdfs关键低效函数的性能分析方法的系统架构示意图。hdfs节点为系统提供trace,trace合并模块将trace合并,trace处理模块将函数调用信息结构化,贝叶斯网络构建模块将贝叶斯网络结构化表示,然后交给贝叶斯网络推理模块进行概率推理,可视化模块负责向用户展示关键低效函数。

图2为本发明基于贝叶斯网络定位hdfs关键低效函数的性能分析方法的流程图,详细流程包括步骤(1)-(8):

步骤(1)对hdfs进行函数级源代码插桩;

对hdfs进行函数级性能分析的基础是得到有效的性能数据,方法就是插桩,插桩时,首先应当将探针,即性能采集的代码,插入hdfs源码中的函数当中,函数如表1所示,从而可以在应用程序运行过程之中获得hdfs被插桩函数的函数入口和出口的时间戳、函数读写的数据量特性,在待插桩的函数中入口处,插入调用插桩函数的代码,插桩使用的函数接口为:

tracescopenewpathtracescope(stringdescription,stringpath);

表1插桩目标函数

步骤(2)对插桩得到的数据进行采样;

当探针被插入在某些执行时间很短但非常频繁的代码段时,插桩代码对程序的性能干扰有可能会比较严重。而且,如果程序的执行时间较长,且系统的规模较大,则产自的数据有时会过于庞大,难以存储和分析。本文选用改进的htrace进行采样,采样方法为令牌桶算法,参数设置为令牌桶大小为1000,时间间隔为180ms;

步骤(3)对函数进行低效概率的计算;

将步骤(2)得到的函数执行时间进行统计计算。对于涉及i/o的函数,计算的指标为单位数据读写时间,计算方法如下:

其中,表示函数f在第i次执行时的执行时间,表示函数f在第i次执行时读写的数据量。不涉及i/o的函数,计算的指标为执行时间,即:

对每一个函数f,计算的25%到75分位点之间的平均值,将超过平均值1.5倍的执行次数除以全部的执行次数,这个比值就是得到的函数的低效概率;

步骤(4)构建函数低效概率数据集;

将步骤(1)至步骤(3),每次执行应用程序,得到一组各个函数的低效概率,作为一条数据,不同的实验采用不同的工作负载或者不同的数据规模,实验不少于50次,形成不少于50条数据,将这些实验数据统一整合起来,从而可以构建起一个低效函数的数据集;

步骤(5)通过低效函数数据集,使用结构学习的方法构建贝叶斯网络;

此处的贝叶斯网络的节点表示函数,节点的参数表示函数低效的概率,有向边表示函数之间低效行为的相互影响关系。贝叶斯结构学习就是从数据集当中,通过统计学方法和贝叶斯概率计算,生成一个表示条件概率的有向无环图;本方法使用贝叶斯评分策略和爬山搜索法进行结构学习,贝叶斯评分方法是一种经典且有效的评分策略,爬山法则减小了搜索空间,降低了算法的复杂度,使得方法可行性更高,结构学习的公式分为评分函数和搜索策略两方面:

贝叶斯评分:

g是表示变量集x中变量xi之间概率依赖关系的有向无环图,d为样本数据集,为超系数,i为节点节点集x的第i个节点xi,j为pa(xi)的取值,k为xi的第k个取值,nijk表示数据集中满足条件:xi=xik;pa(xi)=pa(xi)j的实例数目。

爬山搜索:

令e为所有候选边集合,δ(e)表示在网络结构中添加新边e(e∈e)后,评分函数的变化。首先,假设初试网络结构为空网络,从候选边集e中选择一条新边e,使其满足条件δ(e)≥δ(e'),如果满足条件,将e添加到当前网络结构中,并从候选边集合e中删除边e,并继续寻找下一条符合条件的边e’,如果找不到满足条件的边,则停止;

步骤(6)在结构学习的基础上进行参数学习;

参数学习为学习变量相对于父节点的概率依赖程度,进而获得局部的条件概率分布函数,目前两种常用的参数学习方法是最大似然估计方法和贝叶斯方法,当数据集的记录数不充分时,最大似然估计的计算精度通常不够高,而且在某些时刻,最大似然估计之的计算公式会失效,贝叶斯方法则可以有效地克服最大似然估计的这些不足,故本发明中采用贝叶斯方法进行,参数学习具体公式如下:

假设参数θ的先验分布为dirichlet分布,那么参数θ的后验概率也服从dirichlet分布,则参数θ的最大后验估计为:

θ={θ1,θ2,···,θn}表示网络中节点xi相对于其父节点集pa(xi)的条件概率分布表,为xi的第k个取值,相对于pa(xi)的第j个值的估计值,为超系数,i为节点节点集x的第i个节点xi,j为pa(xi)的取值,k为xi的第k个取值,nijk表示数据集中满足条件:xi=xik;pa(xi)=pa(xi)j的实例数目;

步骤(7)遍历每个函数,对所有函数执行下面的判断逻辑,包括以下步骤:

(7-1)对遍历到的任意函数f,判断该函数低效概率是否大于预设阈值thresholdlow,所述预设阈值thresholdlow根据用户的配置设定;如果大于阈值,则标记该函数为低效函数,执行(7-2),否则标记该函数不是低效函数,继续判断其他函数;

(7-2)将得到的所有低效函数的低效概率置为100%,在这个前提之下,利用贝叶斯网络学习到的条件概率分布关系,计算其他非低效函数节点的后验概率,如果这个后验概率超过给定阈值thresholdlow,则认为此非低效函数由非低效变为低效,统计在将所有低效函数的低效概率置为100%之后,由非低效转变为低效的非低效函数个数为npre,并继续执行(7-3);

(7-3)遍历所有低效函数,对任一低效函数f,将其低效概率置为0%,其他低效函数概率继续保持100%,以此为前提,计算所有非低效函数节点的后验概率,如果这个后验概率超过给定阈值,则认为此非低效函数由非低效变为低效,记由非低效转变为低效的函数的个数为判断是否大于预设阈值thresholdnode,所述预设阈值thresholdnode根据用户的配置设定,如果大于则认为函数f是关键低效函数,并对其执行(7-4),否则该函数不是关键低效函数,继续判断其他低效函数;

(7-4)遍历所有低效函数,计算其运行时间占程序总运行时间的比重,判断这个比重是否大于预设阈值thresholdweight,所述预设阈值thresholdweight根据用户的配置设定,如果大于则该函数为值得优化的关键低效函数,否则该函数不值得优化;

步骤(8)展示值得优化的关键低效函数并进行原因分析。

本发明未详细阐述部分属于本领域公知技术。

以上所述,仅为本发明部分具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域的人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

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