性能分析方法、系统、设备及介质
文献发布时间:2023-06-19 16:06:26
技术领域
本发明涉及计算机技术领域,尤其涉及一种性能分析方法、系统、设备及介质。
背景技术
性能是分布式存储是否优秀的一个评价指标,而时延是性能指标的一个重要项,根据时延能够快速找到性能瓶颈。
分布式存储由于节点多,调用路径长,运行过程中会出现IO抖动等等因素,因此时延性能分析起来比较困难。相关技术中,关于分布式存储的性能分析只支持单节点分析,不支持执行流分析,并且对分布式存储系统的性能损耗大、分析速度慢、对代码运行影响大。
发明内容
鉴于以上所述现有技术的缺点,本发明提供一种性能分析方法、系统、设备及介质,以解决上述技术问题。
本发明提供的一种性能分析方法,所述方法包括:
将预设采集函数分别注入分布式存储系统中多个待分析函数;
通过一个或多个待检测线程调用至少一个所述待分析函数,基于所述预设采集函数获取各所述待检测线程的运行数据,所述运行数据包括待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程平均耗时;
分别根据所述待分析函数身份信息确定当前函数名和上层函数名,根据各所述待分析函数的调用关系数据分别生成各所述待检测线程的调用链,所述调用关系数据包括待检测线程身份标识、待分析函数身份信息、当前函数名和上层函数名;
根据各调用链和各调用链对应的待检测线程的运行数据对所述分布式存储系统进行性能分析。
可选的,所述待分析函数被待检测线程调用至少两次,所述待检测线程的调用链的生成方式包括:
按照各当前函数名对应的待分析函数在所述待检测线程中被第一次调用的顺序对各所述当前函数名进行排序,生成所述待检测线程的调用链。
可选的,根据各调用链和各调用链的运行数据进行所述分布式存储系统的性能分析包括:
分别获取所述待分析函数在各所述待检测线程中的线程最大耗时、线程调用次数和线程平均耗时;
将所述待分析函数的各线程最大耗时中最大值确定为所述待分析函数的调用最大耗时;
将所述待分析函数的各线程调用次数之和确定为所述待分析函数的总调用次数;
根据所述待分析函数的各线程调用次数和各线程平均耗时确定所述待分析函数的调用平均耗时;
根据所述调用链及各调用链中待分析函数的调用最大耗时、总调用次数和调用平均耗时对所述分布式存储系统进行性能分析。
可选的,所述调用平均耗时的确定方式包括:
根据待分析函数在一待检测线程中的线程调用次数和线程平均耗时确定所述待分析函数的单线程总耗时;
根据所述待分析函数在各所述待检测线程中的单线程总耗时确定所述待分析函数的调用总耗时;
根据所述调用总耗时和总调用次数确定所述调用平均耗时。
可选的,所述方法还包括:
显示各所述调用链;
响应于用户的选择指令,确定所述选择指令对应的待分析函数,并显示所述待分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一。
可选的,所述方法还包括:
根据一调用链上各待分析函数的调用平均耗时和/或调用最大耗时从各待分析函数中确定一个或多个建议重点分析函数;
将所述建议重点分析函数在一调用链上的节点进行突出显示。
可选的,所述方法还包括以下至少之一:
所述待分析函数预设有至少两个预埋性能分析点;
基于所述预设采集函数获取各所述待检测线程的运行数据包括,响应于用户的开始采集指令,基于所述预设采集函数获取各所述待检测线程的初始数据,响应于用于的结束采集指令,停止所述预设采集函数获取各所述待检测线程的初始数据,根据所述初始数据确定所述运行数据,所述初始数据包括待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程总耗时。
本发明还提供了一种性能分析系统,所述系统包括:
执行模块,用于将预设采集函数分别注入分布式存储系统中多个待分析函数;
采集模块,用于通过一个或多个待检测线程调用至少一个所述待分析函数,基于所述预设采集函数获取各所述待检测线程的运行数据,所述运行数据包括待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程平均耗时;
解析模块,用于分别根据所述待分析函数身份信息确定当前函数名和上层函数名;
数据分析模块,用于根据各所述待分析函数的调用关系数据分别生成各所述待检测线程的调用链,所述调用关系数据包括待检测线程身份标识、待分析函数身份信息、当前函数名和上层函数名;
性能分析模块,用于根据各调用链和各调用链对应的待检测线程的运行数据对所述分布式存储系统进行性能分析。
可选的,所述系统包括以下至少之一:
数据传输模块,用于触发所述解析模块分别根据所述待分析函数身份信息确定当前函数名和上层函数名,将各所述运行数据,以及各解析模块的当前函数名和上层函数名保存并发送至所述数据分析模块;
可视化模块,用于显示各所述调用链,并响应于用户的选择指令,确定所述选择指令对应的待分析函数,显示所述待分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一。
本发明还提供了一种电子设备,包括处理器、存储器和通信总线;
所述通信总线用于将所述处理器和存储器连接;
所述处理器用于执行所述存储器中存储的计算机程序,以实现如上述中任一项实施例所述的方法。
本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,
所述计算机程序用于使计算机执行如上述任一项实施例所述的方法。
本发明的有益效果:本发明提出的一种性能分析方法、系统、设备及介质,该方法通过通过将预设采集函数分别注入分布式存储系统中多个待分析函数,通过一个或多个待检测线程调用至少一个待分析函数,基于预设采集函数获取各待检测线程的运行数据,分别根据待分析函数身份信息确定当前函数名和上层函数名,根据各待分析函数的调用关系数据分别生成各待检测线程的调用链,根据各调用链和各调用链对应的待检测线程的运行数据对分布式存储系统进行性能分析,通过统计各调用链的运行数据,并对其进行集中分析能够实现对分布式存储系统既支持单函数分析,也支持执行流分析,对分布式存储系统的性能损耗小,分析速度更快,对代码影响更小。
附图说明
图1是本发明一实施例中提供的性能分析方法的一种流程示意图;
图2是本发明一实施例中提供的显示调用链的一种示意图;
图3是本发明一实施例中提供的性能分析系统的一种示例性的结构示意图;
图4是本发明一实施例中提供的性能分析系统的一种结构示意图;
图5是本发明一实施例中提供的性能分析系统的一种具体示例的结构示意图;
图6是本发明一实施例提供的一种电子设备的结构示意图。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
在下文描述中,探讨了大量细节,以提供对本发明实施例的更透彻的解释,然而,对本领域技术人员来说,可以在没有这些具体细节的情况下实施本发明的实施例是显而易见的,在其他实施例中,以方框图的形式而不是以细节的形式来示出公知的结构和设备,以避免使本发明的实施例难以理解。
如图1所示,本实施例提供了一种性能分析方法,该方法包括:
步骤S101:将预设采集函数分别注入分布式存储系统中多个待分析函数。
其中,待分析函数预设有至少两个预埋性能分析点,在待分析函数正常运行过程中,该预埋性能分析点无任何采集任务,触发执行预设采集函数运行后,向预设采集函数所在进程发送采集指令即可开始采集。可选的,待分析函数可以在编译期前后分别预埋两个预埋性能分析点。
可以通过外部执行工具触发将预设采集函数注入待分析函数。其中外部执行工具例如TaskExec模块等,预设采集函数Stacktrace模块的采集函数等。
预设采集函数的数据采集格式包括但不限于如下形式:
tid:function name:function addr:avg time:max time:runs。
其中,用符号“:”分割;各字段意思分别为,
tid:线程id(待检测线程身份标识);
function name:函数名(当前函数名);
function addr:当前tid函数所在位置(待分析函数身份信息);
avg time:该函数平均耗时(线程平均耗时);
max time:该函数最大耗时(线程最大耗时);
runs:该函数被调次数(线程调用次数)。
分布式存储系统中存在多个待分析函数,此时,可以将预设采集函数注入到各待分析函数中,也可以从分布式存储系统中确定多个待分析函数,再将预设采集函数注入到这些被选择的待分析函数中。具体的,如何实现将预设采集函数注入到待分析函数中的实现方式可以采用本领域技术人员所知晓的方式实现,在此不做限定。
步骤S102:通过一个或多个待检测线程调用至少一个待分析函数,基于预设采集函数获取各待检测线程的运行数据。
分布式存储系统中可能存在一个或多个线程,一个待分析函数可以被一个或多个线程所调用,调用待分析函数的线程即为待检测线程。本实施提供的方法既可以支持单线程的性能分析,也可以支持多线程的性能分析。
运行数据包括但不限于待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程平均耗时中至少之一。
待检测线程身份标识为调用该待分析函数的待检测线程的全局唯一标识,通过该待检测线程身份标识可以知晓当前运行数据是属于哪一个待检测线程的数据。
待分析函数身份信息可以是如当前待检测线程上待分析函数所在位置functionaddr,可以标识该待分析函数在待检测线程上的调用顺序,基于该待分析函数身份信息可以分析出函数调用链。一种可选的待分析函数身份信息的生成方式如下,在每一个待检测线程中设置一个位置计数器t_addr,初始值为0,当某个待分析函数function name第一次在某个待检测线程tid中调用时,该待分析函数function name的待分析函数身份信息function addr值为t_addr+1,同时t_addr的值也自增一次。
函数线程最大耗时为当前待分析函数M在待检测线程N上每一次被调用时的单次耗时时间中最大值。例如,待分析函数M在待检测线程上被调用了4次,每一次的单次耗时时间分别为2ms,1ms,5ms,2ms,3ms,此时线程最大耗时为5ms。
函数线程调用次数为该待分析函数M在待检测线程N上共计的调用次数。
函数线程平均耗时可以根据该待分析函数M在待检测线程N上总共的调用次数以及总计的单次耗时时间确定。例如:线程平均耗时=总计的单次耗时时间/线程调用次数。在一个实施例中,基于预设采集函数获取各待检测线程的运行数据包括:
响应于用户的开始采集指令,基于预设采集函数获取各待检测线程的初始数据;
响应于用于的结束采集指令,停止预设采集函数获取各待检测线程的初始数据;
根据初始数据确定运行数据,其中,初始数据包括待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程总耗时。通过上述方式能够实现基于用户的指令采集指定时间的运行数据。例如,通过用户的开始采集指令、结束采集指令,采集20s的运行数据等。
步骤S103:分别根据待分析函数身份信息确定当前函数名和上层函数名,根据各待分析函数的调用关系数据分别生成各待检测线程的调用链。
其中,调用关系数据包括待检测线程身份标识、待分析函数身份信息、当前函数名和上层函数名。
可选的,待分析函数身份信息包括当前待检测线程上待分析函数所在位置function addr,基于function addr可以确定当前函数名和上层函数名,其中当前函数名为在待分析函数身份信息所在位置所被调用的待分析函数的函数名,上层函数名为在待分析函数身份信息所在位置的前一个位置所被调用的待分析函数的函数名。若当前待检测线程上待分析函数所在位置为首位,也即,该待分析函数为整个待检测线程上第一个别调用的函数,此时该位置的待分析函数身份信息中上层函数名为空。
可选的,待分析函数身份信息包括线程函数调用总次序和线程函数调用单次序,线程函数调用总次序标识某一个待分析函数在待检测线程上是第几个被调用的函数,线程函数调用单次序标识某一个待分析函数在该待检测线程上是第几次被调用。如,待检测线程的执行顺序为待分析函数A、待分析函数B、待分析函数C、待分析函数A,此时各待分析函数身份信息分别为:(1,1)、(2,1)、(1,1)、(3,1)、(4,2)。基于该待分析函数身份信息可以确定(1,1)的当前函数名为A,生层函数名为空,(2,1)的当前函数名为B,生层函数名为A,(3,1)的当前函数名为C,生层函数名为B,(4,2)的当前函数名为A,生层函数名为C。
根据当前函数名、上层函数名,每一组当前函数名和上层函数名对应的待分析函数身份信息(特别是线程函数调用总次序)、待检测线程身份标识可以生成每一个待检测线程身份标识对应的调用链,也即,针对每一个待检测线程将各当前函数名根据特别是线程函数调用总次序以生成一个序列,将该序列作为调用链。
在一个实施例中,待分析函数被待检测线程调用至少两次,待检测线程的调用链的生成方式包括:
按照各当前函数名对应的待分析函数在待检测线程中被第一次调用的顺序对各当前函数名进行排序,生成待检测线程的调用链。
也即,仅保留各待分析函数在待检测线程中第一次被调用时的序列位置对待检测线程所调用的各待分析函数进行排序,得到该待检测线程的调用链。
在一个实施例中,待分析函数被待检测线程调用至少两次,待检测线程的调用链的生成方式也可以包括:
根据待分析函数身份信息(特别是线程函数调用总次序)将待分析函数的当前函数名进行依次排序,得到完整调用序列,再对当前函数名相同的节点进行合并,保留第一次出现的节点,得到调用链。例如,某一待检测线程的完整调用序列为A→B→B→C→B→E→D→A,其中,A、B、C、D、E为当前函数名,对相同函数名的节点进行合并后,得到调用链为A→B→C→E→D。
步骤S104:根据各调用链和各调用链对应的待检测线程的运行数据对分布式存储系统进行性能分析。
可选的,调用链的运行数据为该调用链对应的待检测线程的运行数据,具体可以为函数线程最大耗时、函数线程调用次数和函数线程总耗时。
在一个实施例中,根据各调用链和各调用链的运行数据进行分布式存储系统的性能分析包括:
分别获取待分析函数在各待检测线程中的线程最大耗时、线程调用次数和线程平均耗时;
将待分析函数的各线程最大耗时中最大值确定为待分析函数的调用最大耗时;
将待分析函数的各线程调用次数之和确定为待分析函数的总调用次数;
根据待分析函数的各线程调用次数和各线程平均耗时确定待分析函数的调用平均耗时;
根据调用链及各调用链中待分析函数的调用最大耗时、总调用次数和调用平均耗时对分布式存储系统进行性能分析。
其中,调用平均耗时的确定方式包括:
根据待分析函数在一待检测线程中的线程调用次数和线程平均耗时确定待分析函数的单线程总耗时,也就是某一待分析函数在某一待检测线程内每一次被调用所对应的耗时之和;
根据待分析函数在各待检测线程中的单线程总耗时确定待分析函数的调用总耗时,也就是某一待分析函数被所有待检测线程所调用的耗时之和;
根据调用总耗时和总调用次数确定调用平均耗时。
换句话说,根据各调用链和各调用链的运行数据进行分布式存储系统的性能分析包括先根据各调用链的运行数据分别确定每一个待分析函数的调用最大耗时、总调用次数和调用平均耗时,再结合各调用链和上述各待分析函数的调用最大耗时、总调用次数和调用平均耗时来进行分布式存储系统的性能分析。
在一个实施例中,该方法还包括:
显示各调用链;
响应于用户的选择指令,确定选择指令对应的待分析函数,并显示待分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一。
可选的,一种调用链的显示方式可参见图2,调用链包括当前函数名和各当前函数名的执行指向(图中的箭头)。用户的选择指令可以是用户在显示的调用链上对函数名所在区域的点击、按压、框选等指令。基于上述方式可以确定用户所选择的一个或多个当前函数名,每一个待分析函数均对应一个唯一的当前函数名,进而可以知晓用户所选择的待分析函数,进而显示带分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一,用户可以通过上述数据进行进一步的性能分析。继续参见图2,当用户将光标(图中的十字)移动到当前函数名f1的区域内,则对应将显示当前函数名f1对应的待分析函数1的调用最大耗时(20)、总调用次数(100)和调用平均耗时(10)。
在一个实施例中,该方法还包括:
根据一调用链上各待分析函数的调用平均耗时从各待分析函数中确定一个或多个建议重点分析函数;
将建议重点分析函数在一调用链上的节点进行突出显示。
可选的,可以是将全部调用链上的建议重点分析函数均确定出来,并依次突出显示。各调用链的建议重点分析函数可以是相同的,也可能存在差异。
其中,根据一调用链上各待分析函数的调用平均耗时和/或调用最大耗时从各待分析函数中确定一个或多个建议重点分析函数包括:
根据某一调用链上各待分析函数的调用平均耗时和/或调用最大耗时按照从大到小的顺序对各待分析函数进行排序;
取排序前N的待分析函数作为建议重点分析函数。
当根据各待分析函数的调用平均耗时和调用最大耗时按照从大到小的顺序对各待分析函数进行排序,则可以分别以调用平均耗时和调用最大耗时进行排序,再将得到的两个序列的排序名次进行平均或加权平均,得到新的序列,取新序列前N的待分析函数作为建议重点函数。
其中,根据一调用链上各待分析函数的调用平均耗时和/或调用最大耗时从各待分析函数中确定一个或多个建议重点分析函数包括:
将某一调用链上调用平均耗时和/或调用最大耗时大于预设调用平均耗时和/或预设调用最大耗时的待分析函数作为建议重点分析函数。
在一个实施例中,将建议重点分析函数在调用链上的节点进行突出显示可以是将图2中的某一个当前函数名如f1进行着色、放大、加粗等方式中至少之一处理,以实现该当前函数名被突出显示。可选的,可以对不同排序的当前函数名进行渲染不同的颜色,如将耗时最大的前三个(调用平均耗时和/或调用最大耗时最大)的当前函数名设置为红、蓝、紫等。
通过上述方式可以给到相关用户建议重点进行分析的函数,使得性能分析的效率更高。
上述实施例提供的性能分析方法,通过将预设采集函数分别注入分布式存储系统中多个待分析函数,通过一个或多个待检测线程调用至少一个待分析函数,基于预设采集函数获取各待检测线程的运行数据,分别根据待分析函数身份信息确定当前函数名和上层函数名,根据各待分析函数的调用关系数据分别生成各待检测线程的调用链,根据各调用链和各调用链对应的待检测线程的运行数据对分布式存储系统进行性能分析,通过统计各调用链的运行数据,并对其进行集中分析能够实现对分布式存储系统既支持单函数分析,也支持执行流分析,对分布式存储系统的性能损耗小,分析速度更快,对代码影响更小。
可选的,通过显示调用链,并显示选中的待分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一,能够直观的显示待分析函数在调用链上的调用关系,方便用户查看调用链上的各待分析函数的运行数据,进而方便用户有针对性的找到合适的待分析函数进行性能分析。
可选的,通过对建议重点分析函数在各调用链上的节点进行突出显示,能够更有针对性的给到用户以建议,方便用户更快的找到影响该分布式存储系统运行的函数。
可选的,预先在待分析函数中预设预埋性能分析点,采集运行数据,对代码运行影响很小。
可选的,在进行运行数据采集时可以将该运行数据记录在内存,但不进行持久化,这样可以有效减少对性能的影响。
可选的,根据待分析函数身份信息确定当前函数名和上层函数名可以每完成一次运行数据采集后执行一次,而非实时解析,也可以减少对性能的影响。
可选的,执行步骤S103和步骤S104时,可以将包括运行数据、当前函数名、上层函数名进行本地持久化后,再通过网络分发至专门的数据分析端进行性能分析。这样也可以减少对性能的影响。
下面通过一个具体实施例,示例性的对上述性能分析方法进行说明。该方法可以基于性能分析系统实现,该性能分析系统至少包括数据分析端S和多个数据采集端C,各数据采集端部署在分布式存储系统集群各节点上,如图3所示,数据采集端C1–C2将各节点数据采集后发送到数据分析端S,然后由数据分析端S统一分析,并输出可视化报告。一个完整的流程为数据采集、数据传输、数据分析三个阶段,具体如下:
一、数据采集。
数据采集包含三个子阶段:
(1)执行采集任务,可以由外部工具如TaskExec触发。
(2)原始数据采集,可以由Stacktrace模块实现。
(3)函数地址解析,可以由Funcanalyz模块实现。
其中,TaskExec模块是一个采集任务执行工具,其功能是向需要采集的模块注入采集任务,过程为:
比如函数F,其头尾在编译期预埋性能分析点。正常运行时,该点并无任何采集任务执行TaskExec后,向函数F所在进程发送采集指令即可开始采集。一种采集指令格式为:
函数F1,F2,……,Fn或者函数F ALL。
比如模块A,包括有函数F1,F2,……,Fn,运行TaskExec时,TaskExec会向每个函数注入Stacktrace的采集函数,注入完成后,开始采集数据(运行数据)。F1,F2,……,Fn在运行时,会先调用Stacktrace的开始采集指令,F1,F2,……,Fn运行结束后,会先调用Stacktrace的结束采集指令。根据两个指令之间所获取到的运行数据得到个被调用的待分析函数当前的地址(待分析函数身份信息),耗时(函数线程最大耗时),调用次数(函数线程调用次数),总时间(调用总耗时),平均时间(函数线程平均耗时)。
Stacktrace是常驻被采集进程内部的一个模块,它提供采集函数,采集原始可供分析的数据,包括栈帧,函数调用关系,每个函数的耗时,调用次数,总时间,平均时间。
一种Stacktrace模块记录的每个函数数据格式示例如下:
tid:function name:function addr:avg time:max time:runs
其中,用符号:分割;各字段意思可参考上述实施例,在此不再赘述。
可选的,函数统计与线程绑定,对于线程池这种,合并汇总不在采集阶段,放到分析阶段,这样可以进一步降低对分布式存储系统的正常运行的影响。
一种function addr(待分析函数身份信息)的生成流程如下:
每个tid(待检测线程)都有一个位置计数器t_addr,初始值为0,当某个functionname(函数名)第一次在某个tid中调用时,该function name的function addr值为t_addr+1,同时t_addr的值也自增一次。
Funcanalyz模块是常驻被采集进程内部的一个模块,用来分析Stacktrace模块中的function Name(当前函数名和上层函数名)的运行链。Funcanalyz根据线程tid,当前tid上函数所在位置function addr,分析出函数调用链。不会实时解析Stacktrace记录的信息,只在数据传输命令响应时,解析一次。一种可选的解析后的数据格式如下:
tid:function name:upper function name:avg time:max time:runs
其中,function name:该次计算耗时的函数名(当前函数名);upper functionname:该函数的上层函数名(上层函数名);用符号:分割,其他字段与Stacktrace中记录的意思一致。
二、数据传输
Stacktrace/Funcanalyz采集分析的信息记录在内存,出于减少对性能影响考虑,并没有持久化。数据传输Datatrans是一个单独进程,一是获取Stacktrace/Funcanalyz采集分析的信息,二是将采集信息发送到数据分析端S。
Datatrans与Funcanalyz通过共享内存通信,Datatrans收到数据分析端(S)的传输数据命令后,Funcanalyz分析Stacktrace中的地址信息,将所有地址转换为函数名,Datatrans拷贝Funcanalyz记录的共享内存信息,持久化到本地,持久化的目的是为了需要时单独分析。最后将这些数据通过网络发送数据分析端S。
三、数据分析
数据分析端S收到各节点的数据后,步骤如下:
3.1针对各节点数据首先作单独分析,主要合并线程,推导出调用栈,及性能计算,具体步骤如下(此处字符含义见上述标识,在此不再赘述):
tid:function name:upper by function name:avg time:max time:runs
根据采集信息中function name:upper by function name推导出所有调用关系,还原出调用链,去掉tid:
function name 1->function name 2->……->function name N
function name 2->function name 2->……->function name N
……
function name N->function name 2->……->function name N
然后将各调用链第一个函数名相同的线程合并,比如function name x和function name y函数名相同,则将avg time:max time:runs三个字段合并计算,runs相加,max time取最大值,avg time则如下计算:
avg time=(avg time x*runs x+avg time y*runs y)/(runs x+runs y)公式(1),
其中,avg time为调用平均耗时,avg time x为待检测线程x中的函数线程平均耗时,runs x为待检测线程x的函数线程调用次数,avg time y为待检测线程y中的函数线程平均耗时,runs y为待检测线程y的函数线程调用次数。
最后形成数据如下:
Stack 1:
function name 1:avg time:max time:runs\r\n
function name 2:avg time:max time:runs\r\n
……
function name N:avg time:max time:runs
Stack 2:
function name 1:avg time:max time:runs\r\n
function name 2:avg time:max time:runs\r\n
……
function name N:avg time:max time:runs
……
Stack N:
function name 1:avg time:max time:runs\r\n
function name 2:avg time:max time:runs\r\n
……
function name N:avg time:max time:runs
针对Stack(栈),将所有function的max time进行排序,提取前三个耗时最长的函数,形成如下记录:
Stack 1Max_3:function name x1,function name y1,function name z1
Stack 2Max_3:function name x2,function name y2,function name z2
……
Stack N Max_3:function name x3,function name y3,function name z3
3.2上述数据分析完成后,然后根据分析结果绘制图形,便于直接观察。
可选的,S端还包括一个可视化终端,分析图在终端显示,展示形式可参见图2,这里f n代替实际运行的函数名。每个模块都按栈形式显示,基于栈的分析,可以很方便的观察每个任务流的运行时间。
当鼠标放到每个函数名时,也会显示该函数被所有栈调用的总的avg time:maxtime:runs信息。
可选的,可以在对各个待检测线程的调用链进行可视化时,将调用链中耗时最长的三个函数名用红、蓝、紫标记,给出分析建议(该建议可以是本领域技术人员预先设定的多个建议集合,根据当前函数名对应的函数类型、耗时情况来确定的一个或多个建议)。
通过上述方法,不管是分析单个函数,还是分析任务流都能快速帮助了解分布式存储的运行情况。每个栈stack能清晰的观察其执行流,及执行性能数据。对于单个函数,比如f1,被statck 1和stack N调用,能清晰的观察f1的调用情况avg time:10ms,max time:20ms,runs:100次。
通过上述方法,在程序内预设分析点,统计集群各个节点的性能数据集中分析,并给出分析建议,以执行流、单函数结合的形式可视化显示,提升了分析速度,对代码运行影响极小。该方法可以快速分析分布式存储尤其是节点数过多时的性能瓶颈。通过在以调用栈方式统计并显示分布式存储集群中所有节点运行情况,可以很直观分析单个函数或者任务流,迅速找出分布式存储中的性能瓶颈,并且可配置需要分析的模块,提升分析速度,对代码运行影响极小。
通过对调用链进行可视化展示,可以方便找出关注的业务涉及的函数,一般从调用链入口处可以看到。查看涉及函数所在的调用链上的调用关系,查看调用链上标记为红、蓝、紫的耗时最长的三个函数,可进行重点分析,查看调用链上所有的函数运行信息,找出关心的点进行分析。
请参阅图4,本实施例提供了一种性能分析系统400,该系统包括:
执行模块404,用于将预设采集函数分别注入分布式存储系统中多个待分析函数;
采集模块402,用于通过一个或多个待检测线程调用至少一个待分析函数,基于预设采集函数获取各待检测线程的运行数据,运行数据包括待检测线程身份标识、待分析函数身份信息、函数线程最大耗时、函数线程调用次数和函数线程平均耗时;
解析模块403,用于分别根据待分析函数身份信息确定当前函数名和上层函数名;
数据分析模块404,用于根据各待分析函数的调用关系数据分别生成各待检测线程的调用链,调用关系数据包括待检测线程身份标识、待分析函数身份信息、当前函数名和上层函数名;
性能分析模块405,用于根据各调用链和各调用链对应的待检测线程的运行数据对分布式存储系统进行性能分析。
在一个实施例中,该系统还包括以下至少之一:
数据传输模块,用于触发解析模块分别根据待分析函数身份信息确定当前函数名和上层函数名,将各运行数据,以及各解析模块的当前函数名和上层函数名保存并发送至数据分析模块;
可视化模块,用于显示各调用链,并响应于用户的选择指令,确定选择指令对应的待分析函数,显示待分析函数的调用最大耗时、总调用次数和调用平均耗时中至少之一。
在一个实施例中,参见图5,图5为另一种性能分析系统的结构示意图,如图5所示,该性能分析系统包括数据采集端、数据传输模块、数据分析端,其中,数据采集端包括用于执行采集的TaskExec,用于进行数据拷贝的Stacktrace,以及用于地址解析的Funcanalyz,通过Funcanalyz对Stacktrace采集的运行数据进行解析,以得到当前函数名、上层函数名、函数线程最大耗时、函数线程调用次数和函数线程平均耗时,进而通过数据传输模块Datatrans进行数据传输,以及将分析数据返回给到Funcanalyz,Datatrans将性能数据(当前函数名、上层函数名、函数线程最大耗时、函数线程调用次数和函数线程平均耗时)传输给数据分析端Datatanalyz,通过Datatanalyz对性能数据进行分析(如建议重点分析函数的确定、调用平均耗时的确定、总调用次数的确定、调用最大耗时的确定、调用链的生成等),最终得到分析结果。在用户端,仅通过对TaskExec的控制,得到最终的结果,上述流程可以在后台进行。
在本实施例中,该系统实质上是设置了多个模块用以执行上述实施例中的方法,具体功能和技术效果参照上述方法实施例即可,此处不再赘述。
参见图6,本发明实施例还提供了一种电子设备1100,包括处理器1101、存储器1102和通信总线1103;
通信总线1103用于将处理器1101和存储器连接1102;
处理器1101用于执行存储器1102中存储的计算机程序,以实现如上述实施例一中的一个或多个的方法。
本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,
计算机程序用于使计算机执行如上述实施例一中的任一项的方法。
本申请实施例还提供了一种非易失性可读存储介质,该存储介质中存储有一个或多个模块(programs),该一个或多个模块被应用在设备时,可以使得该设备执行本申请实施例的实施例一所包含步骤的指令(instructions)。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
- 性能分析方法、性能分析装置、存储介质和电子设备
- 一种网络设备性能分析方法、系统、设备及计算机介质