发明内容
为解决上述问题,本发明的目的在于提供一种服务器lua性能热点分析方法,通过Linux系统提供的动态追踪技术systemtap对服务器进行周期性的采样,记录当前正在执行的lua函数,通过对采样数据进行分析处理即可得到性能数据文件。
本发明解决其问题所采用的技术方案是:一种服务器lua性能热点分析方法,其特征在于,该方法包括以下步骤:S100、预设采样策略;S200、对服务器进行周期采样;S300、判断全局变量L的值是否为0,若是,执行步骤S600,否则执行步骤S400;S400、根据全局变量L的值定位luaState地址并提取出当前执行的函数;S500、将提取出的函数及调用次数累计到MAP中;S600、判断采样时间是否大于等于周期时间,若是,执行步骤S700,否则,执行步骤S200;S700、结束采样,输出性能数据文件。
进一步的,所述步骤S200包括以下步骤:启动服务器,运行服务器代码;使用工具SystemTap对服务器进行采样。
进一步的,所述启动服务器运行服务器代码包括以下步骤:启动服务器;开启测试程序,运行代码。
进一步的,所述使用工具SystemTap对服务器进行采样包括以下步骤:将全局变量L初始化为0;使用SystemTap对lua_pcall接口进行采样,探测其调用及返回通知;判断lua_pcall的是否被调用,若是,则执行下一步,否则,不执行操作;将当前虚拟机luaState地址记录到全局变量L中;lua_pcall调用完成返回后,将全局变量L设置为0;结束采样。
进一步的,所述步骤S400包括以下步骤:根据全局变量L的值获取虚拟机luaState地址;使用查询指令查询在当前虚拟机中运行的进程ID;根据预设策略对运行中的进程进行采样;提取出当前正在执行的lua函数;结束采样。
进一步的,所述步骤S500包括以下步骤:保存被提取函数信息;根据函数信息进行分析处理,将处理后的信息输出为性能数据文件。
进一步的,所述步骤S100包括预设采样周期。
进一步的,所述的函数信息包括函数名以及调用信息。
进一步的,所述分析处理包括统计函数被调用次数。
本发明的有益效果是:本发明采用的一种服务器lua性能热点分析方法,此方法不依赖luaDebug,而是使用Linux系统提供的动态追踪技术,无需修改服务器代码,同时也不需要打开LUA虚拟机提供的luaDebug功能,因此其对服务器的性能影响非常小,且非常方便,实现即插即用。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。
需要说明的是,如无特殊说明,当某一特征被称为“固定”、“连接”在另一个特征,它可以直接固定、连接在另一个特征上,也可以间接地固定、连接在另一个特征上。此外,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种元件,但这些元件不应限于这些术语。这些术语仅用来将同一类型的元件彼此区分开。例如,在不脱离本公开范围的情况下,第一元件也可以被称为第二元件,类似地,第二元件也可以被称为第一元件。本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。
参照图1所示为根据本发明的方法流程图,方法流程如下:预设采样策略;
对服务器进行周期采样;
判断全局变量L的值是否为0,若是,执行判断采样时间是否大于周期时间的步骤,否则执行下一步骤;
根据全局变量L的值定位luaState地址并提取出当前执行的函数;
将提取出的函数及调用次数累计到MAP中;
判断采样时间是否大于等于周期时间,若是,执行下一步骤,否则,返回执行第二步骤,继续对服务器进行周期采样;
结束采样,输出性能数据文件。
参照图2所示为根据本发明的具体实施例一,主要用于解释如何根据lua_pcall的接口被调用状态来改变全局变量L的值:首先将全局变量L初始化为0;
使用SystemTap对lua_pcall接口进行采样,探测其调用及返回通知;
判断lua_pcall的是否被调用,若是,则执行下一步,否则,不执行操作;
将当前虚拟机luaState地址记录到全局变量L中;
lua_pcall调用完成返回后,将全局变量L设置为0;
结束采样。
参照图3所示为根据本发明的具体实施例二,主要用于解释如何在定位到进程运行的对应虚拟机的情况下,如何从运行的进程中提取出正在执行的lua代码:根据全局变量L的值获取虚拟机luaState地址;
使用查询指令查询在当前虚拟机中运行的进程ID;
根据预设策略对运行中的进程进行采样;
提取出当前正在执行的lua函数;
结束采样。
参照图4所示为根据本发明的具体实施例三,列举在游戏服务器中使用本发明的具体实施例:在游戏服务器中获取测试数据,
第一步:根据上述技术流程开发出lua.profiler装置;
第二步:启动游戏服务器GameServer,使用ps-aux|grep GameServer找到该进程的进程ID,为633;
第三步:开启压测程序,让模拟机器人登录GameServer并进行对战(此步为了增加服务器压力值);
第四步:使用“./lua.profiler-p 633-t 50”对游戏进程进行采样,其中633为进程ID,50是指采样50秒的时间(50秒的时间可根据不同的情景进行模拟);
第五步:50秒后结束采样,并输出profiler.txt性能数据文件;
第六步:分析profiler.txt性能数据文件即可定位游戏服务器中性能热点;
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。