著录项信息
专利名称 | 服务器程序的监控方法及其系统 |
申请号 | CN201210241300.X | 申请日期 | 2012-07-12 |
法律状态 | 暂无 | 申报国家 | 暂无 |
公开/公告日 | 2014-01-29 | 公开/公告号 | CN103544095A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F11/34 | IPC分类号 | G;0;6;F;1;1;/;3;4查看分类表>
|
申请人 | 腾讯科技(深圳)有限公司 | 申请人地址 | 广东省深圳市南山区高新区高新南一路飞亚达大厦5-10楼
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 深圳市腾讯计算机系统有限公司 | 当前权利人 | 深圳市腾讯计算机系统有限公司 |
发明人 | 侯健 |
代理机构 | 广州华进联合专利商标代理有限公司 | 代理人 | 王茹;黄晓庆 |
摘要
本发明提供一种服务器程序的监控方法及其系统,所述方法包括:获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。本发明的服务器程序的监控方法及其系统记录下服务器程序的所有输入,依据记录下来的数据,可以做到在离线状态下对服务器程序在线运行状态的完全还原。能够以回放时候的服务器作为基础,进行服务器程序性能的测试分析,服务器程序开发过程中偶现的BUG的重现,或者分析服务器的接入用户行为等等应用。
1.一种服务器程序的监控方法,其特征在于,包括步骤:
获取服务器程序在线运行时调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;
在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。
2.根据权利要求1所述的服务器程序的监控方法,其特征在于,获取服务器程序在线运行时调用的函数的返回数据的步骤包括:
利用hook函数监视所述服务器程序在线运行时的函数调用行为;
在发生函数调用行为时,调用预设的伪函数获取被调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并且保存所述返回数据。
3.根据权利要求2所述的服务器程序的监控方法,其特征在于,将相应的所述返回数据输入到所述服务器程序的步骤包括:
在离线状态下调用所述伪函数将相应的所述返回数据输入到所述服务器程序。
4.根据权利要求2或者3所述的服务器程序的监控方法,其特征在于,所述调用伪函数的步骤包括:
将所述服务器程序所调用的函数的地址替换为承载所述伪函数的动态链接库的地址。
5.根据权利要求1所述的服务器程序的监控方法,其特征在于,所述服务器程序调用的函数包括系统API、自定义函数、以及共享内存的读取函数。
6.根据权利要求1所述的服务器程序的监控方法,其特征在于,获取服务器程序在线运行时所调用的函数的返回数据的步骤包括:
当所述服务器程序调用时间获取API获取时间时,保存所述时间获取API的返回值;
当所述服务器程序调用文件读取API读取文件时,保存所述读取操作,并判断读取的文件是否已保存;如果未保存,则保存所述文件,并保存所述文件的修改时间;如果已保存,则判断本次文件读取操作对所述文件的修改时间是否晚于所述文件最近一次保存的修改时间;如果是,则更新已保存的所述文件,并保存所述文件更新后的修改时间;否则,不更新已保存的所述文件;
当所述服务器程序调用网络数据接收API接收数据时,保存所述接收数据的操作,并保存接收的数据;
当所述服务器程序中的信号量接收函数接收到信号量时,记录所述信号量的接收时间和所述信号量的值。
7.根据权利要求6所述的服务器程序的监控方法,其特征在于,判断读取的文件是否已保存的步骤之前,执行以下步骤:
根据预设的白名单,判断读取的文件是否需要保存;其中,所述白名单中记录有需要保存的文件的扩展名,或者不需要保存的文件的扩展名。
8.根据权利要求1所述的服务器程序的监控方法,其特征在于,保存所述返回数据以及所述返回数据的获取时间的步骤包括:
将所述返回数据以及所述返回数据的获取时间传输到所述服务器以外的储存设备上保存。
9.根据权利要求1所述的服务器程序的监控方法,其特征在于,首先执行以下步骤:
在服务器程序启动时,判断所述服务器程序是否属于预设的监控列表中记载的程序;
在判断结果为是时,执行获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间的步骤。
10.一种服务器程序的监控系统,其特征在于,包括:
录制模块,用于获取服务器程序在线运行时调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;
回放模块,用于在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。
11.根据权利要求10所述的服务器程序的监控系统,其特征在于,所述录制模块利用hook函数监视所述服务器程序在线运行时的函数调用行为,在发生函数调用行为时,调用预设的伪函数获取被调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并且保存所述返回数据。
12.根据权利要求11所述的服务器程序的监控系统,其特征在于,所述回放模块在离线状态下调用所述伪函数将相应的所述返回数据输入到所述服务器程序。
13.根据权利要求11或者12所述的服务器程序的监控系统,其特征在于,所述录制模块和所述回放模块在调用所述伪函数时,将所述服务器程序所调用的函数的地址替换为承载所述伪函数的动态链接库的地址。
14.根据权利要求11所述的服务器程序的监控系统,其特征在于,所述录制模块包括:
第一录制子模块,用于在所述服务器程序调用时间获取API获取时间时,保存所述时间获取API的返回值;
第二录制子模块,用于在所述服务器程序调用文件读取API读取文件时,保存所述读取操作,并判断读取的文件是否已保存;如果未保存,则保存所述文件,并保存所述文件的修改时间;如果已保存,则判断本次文件读取操作对所述文件的修改时间是否晚于所述文件最近一次保存的修改时间;如果是,则更新已保存的所述文件,并保存所述文件更新后的修改时间;否则,不更新已保存的所述文件;
第三录制子模块,用于在所述服务器程序调用网络数据接收API接收数据时,保存所述接收数据的操作,并保存接收的数据;
第四录制子模块,用于在所述服务器程序的信号量接收函数接收到信号量时,记录所述信号量的接收时间和所述信号量的值。
15.根据权利要求14所述的服务器程序的监控系统,其特征在于,所述第二录制子模块进一步用于根据预设的白名单,判断读取的文件是否需要保存;其中,所述白名单中记录有需要保存的文件的扩展名,或者不需要保存的文件的扩展名。
16.根据权利要求11所述的服务器程序的监控系统,其特征在于,所述服务器程序调用的函数包括系统API、自定义函数,以及共享内存的读取函数。
17.根据权利要求11所述的服务器程序的监控系统,其特征在于,所述录制模块将所述返回数据以及所述返回数据的获取时间传输到所述服务器以外的储存设备上保存。
18.根据权利要求11所述的服务器程序的监控系统,其特征在于,进一步包括判断模块,用于在服务器程序启动时,判断所述服务器程序是否属于预设的监控列表中记载的程序;
在判断结果为是时,所述录制模块获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间。
服务器程序的监控方法及其系统\n技术领域\n[0001] 本发明涉及服务器监控的技术领域,特别是涉及一种服务器程序的监控方法,以及一种服务器程序的监控系统。\n背景技术\n[0002] 通常,服务器要处理接收到的数据请求,需要在服务器上运行各种服务器程序。而服务器的运行效率与各个服务器程序的运行情况密切相关,因此,在进行服务器性能分析等应用时,需要对服务器程序的在线运行情况进行监控。\n[0003] 一般的服务器程序监控方式都需要记录服务器程序在线运行时的各种状态数据,包括输入、输出,执行等等。以图形化性能分析工具Vtune为例,其核心实现是基于CPU的性能采样,通过直接在运行的进程上采集性能数据样本来分析程序运行性能。\n[0004] 然而,在进行服务器程序在线运行情况的监控时,对所述输入、输出,执行等状态数据的全面收集、保存和分析,将会大大影响服务器程序的正常运行,导致服务器程序在线运行时的处理效率损失。\n发明内容\n[0005] 针对上述背景技术中存在的问题,本发明的目的在于提供一种服务器程序的监控方法,能够减少服务器程序在线监控时,服务器程序处理效率损失。本发明的目的还在于提供一种服务器程序的监控系统,能够减少在服务器程序在线运行情况监控时,服务器程序的处理效率损失。\n[0006] 一种服务器程序的监控方法,包括:\n[0007] 获取服务器程序在线运行时调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;\n[0008] 在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。\n[0009] 一种服务器程序的监控系统,包括:\n[0010] 录制模块,用于获取服务器程序在线运行时调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;\n[0011] 回放模块,用于在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。\n[0012] 与现有技术相比较,本发明服务器程序的监控方法及其系统,在服务器在线运行时,通过获取服务器程序所调用的函数的返回数据,记录下所述服务器程序的输入状态,并且将所述返回数据输入到所述服务器程序,因此保证所述服务器程序能够正常运行。又因为只记录所述服务器程序的输入状态,而不需要记录所有的输入、输出和处理等状态参数,所以对服务器程序在线运行的效率影响较少。而在离线状态下,将保存的所述返回数据再次输入到所述服务器程序,因为程序的动作是由其输入决定的,同样的程序响应相同的输入会作出相同的操作,获得相同的输出。而本发明中保存的所述返回数据即为所述服务器程序在线运行时的输入,在离线状态下将所述返回数据重新输入到所述服务器程序,所述服务器程序将会作出和在线运行时相同的响应。从而实现在离线状态下还原服务器程序的在线运行状态。通过对还原的在线运行状态的分析,可以得到服务器程序在线运行时的分析数据。能够以离线状态的服务器作为基础,进行服务器程序性能的测试分析,服务器程序开发过程中偶现的BUG的重现,或者分析服务器的接入用户行为等等应用。\n附图说明\n[0013] 图1是本发明服务器程序的监控方法的流程示意图;\n[0014] 图2是本发明服务器程序的监控方法的一个优选实施方式的流程示意图;\n[0015] 图3是本发明服务器程序的监控方法的工作原理图;\n[0016] 图4是本发明服务器程序的监控系统的结构示意图;\n[0017] 图5是本发明服务器程序的监控系统的一个优选实施方式中录制模块的结构示意图;\n[0018] 图6是本发明服务器程序的监控方法及其系统的一种软件的实现架构图。\n具体实施方式\n[0019] 请参阅图1,图1是本发明服务器程序的监控方法的流程示意图。\n[0020] 所述服务器程序的监控方法包括以下步骤:\n[0021] 步骤S101,获取服务器程序在线运行时所调用的函数的返回数据;\n[0022] 由于服务器程序的输入都是通过调用相应的函数获取的,因此,获取这些被调用函数的返回数据,也就获取了所述服务器程序的所有输入数据。\n[0023] 所述服务器程序调用的函数包括系统API(Application Programming Interface,应用程序编程接口)、自定义函数,以及共享内存的读取函数。\n[0024] 所述系统API是指服务器系统中自带的一些预先定义的函数,比如linux系统下的时间获取API,包括time和gettimeofday等;又如文件读取API,包括fread和fgets等,系统API为最常用的函数,通常大部分服务器程序读取文件、获取时间、获取网络信息等的操作都是通过调用系统API来完成。这些系统API都具有固定的接口地址,通过这些接口地址可以调用对应的系统API。\n[0025] 所述自定义函数是指服务器运行商或者服务器程序制作者自定义的一些可供服务器程序调用的函数,这些自定义函数通常用于执行一些系统API无法完成功能,例如信号量接收函数。这些自定义函数也具有指定的接口地址,通过这些指定的接口地址可以调用对应的自定义函数。\n[0026] 所述共享内存的读取函数是指读取进程间的共享内存的函数。shared memory(共享内存)是进程间通信的一种技术,将一块内存映射到两个进程地址中,使得两个进程都可以对同一块内存进行读写,以linux为例子,通过shmget、shmat这两个函数,可以申请一块共享内存,然后服务器程序就可以像使用普通内存一样对这块共享内存进行读写操作,从而完成和其他进程的交互。而对这种共享内存的读取操作通常不是直接通过系统API完成的,而是由专门的共享内存的读取函数完成。这些共享内存的读取函数通常封装在一个函数集中,供服务器程序调用。\n[0027] 通过hook技术监视所述服务器程序对上述这些函数的调用行为,以及对应的函数的返回结果,就可以获得所述返回数据,以及所述返回数据的返回时间。\n[0028] 步骤S102,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;\n[0029] 获取所述返回数据之后,一方面要将所述返回数据输入到所述服务器程序,以保证服务器程序的正常运行,减少对服务器在线运行的效率的影响。另一方面,需要将所述返回数据以及所述返回数据的获取时间保存下来,以便在服务器程序离线时将所述返回数据回填到服务器程序。\n[0030] 步骤S103,在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。\n[0031] 由于服务器离线时的运行情况监控不会影响到服务器的在线运行效率,因此在服务器离线工作状态下,按照所述获取时间的顺序以及时间间隔,将相应的所述返回数据回填到所述服务器程序,就可以还原所述服务器程序的在线运行情况。\n[0032] 本发明通过在服务器在线运行时,获取服务器程序调用的函数的返回数据,记录下所述服务器程序的输入状态,完成了服务器程序在线运行状态的“录制”。并且将所述返回数据输入到所述服务器程序,因此所述服务器程序能够正常运行。又因为只记录所述服务器程序的输入状态,而不需要记录所有的输入、输出和处理时间等状态参数,所以对服务器在线运行的效率影响较少。\n[0033] 对于一个服务器程序来说,理论上并不存在真随机的算法,在此条件下,所有的算法的状态都是有限的,而对于固定的算法,只要给与固定的输入,其输出则相对也是固定的。因此,在离线状态下对所述服务器程序输入相同的返回数据,可以准确地还原所述服务器程序的在线运行状态。\n[0034] 以C标准库的rand()函数为例,通过记录下种子发生函数srand()函数,那么在固定的种子下,所有的rand()产生的随机数其实都是一个固定值,依据这个原理,将其放大到进程的级别,从而可以实现进程所有行为的“录制”与“回放”。\n[0035] 本发明在服务器离线时,将保存的所述返回数据再次输入到所述服务器程序,因为程序的动作是由其输入决定的,同样的程序响应相同的输入会作出相同的操作,获得相同的输出。而本发明中保存的所述返回数据即为所述服务器程序在线运行时的输入,在离线状态下将所述返回数据重新输入到所述服务器程序,所述服务器程序将会作出和在线运行时相同的响应,因此可以在离线状态下完成所述服务器程序在线运行状态的“回放”。通过对还原的在线运行状态的分析,可以得到服务器程序在线运行时的分析数据。\n[0036] 请参阅图2,图2是本发明服务器程序的监控方法的一个优选实施方式的流程示意图。\n[0037] 在本实施方式中,所述服务器程序的监控方法包括以下步骤:\n[0038] S201,利用hook函数监视所述服务器程序在线运行时的函数调用行为,在发生函数调用行为时,调用预设的伪函数获取被调用的函数的返回数据;\n[0039] S202,将所述返回数据输入到所述服务器程序,并且保存所述返回数据;\n[0040] S203,在离线状态下,根据所述获取时间,调用相应的所述伪函数将相应的所述返回数据输入到所述服务器程序。\n[0041] 其中,所述预设的伪函数为本发明预设的函数,其从所述被调用的原函数获取所述返回数据,将所述返回数据输入到所述服务器程序,并将所述原函数的返回数据保存下来。\n[0042] 下面以具体的例子说明:\n[0043] 工作原理如图3所示,假设所述服务器程序调用的时间获取API为gettimeofday;\n则在hook函数监视到所述服务器程序调用所述gettimeofday函数的行为时,就调用本发明预设的伪函数new_gettimeofday。所述伪函数new_gettimeofday的示例如下:\n[0044] Function new_gettimeofday()\n[0045] Call val=gettimeofday//此处val是系统gettimeofday的返回值,即当前时间[0046] Record val//记录下这个返回值\n[0047] Return val//将返回值输入到服务器程序\n[0048] End Function\n[0049] 同样,在将相应的所述返回数据输入到所述服务器程序时,所述伪函数的示例如下:\n[0050] Function new_gettimeofday()\n[0051] Get val from Record//获取储存的返回值\n[0052] Return val//将返回值回填到服务器程序\n[0053] End Function\n[0054] 所述伪函数可通过以下方式调用:在发生函数调用行为时,将所述服务器程序所调用的函数的地址替换为承载所述伪函数的动态链接库的地址。\n[0055] 例如在Linux系统下,可通过环境变量LD_PRELOAD将承载所述伪函数的动态链接库注入到服务器程序中,采集所述返回数据。这种操作是linux或者windows操作系统的基础功能都可以完成的,同时方法也是多种多样的,本发明以linux为例,linux提供了一个环境变量LD_PRELOAD,通过将这个环境变量设置为一个动态链接库文件,承载预先设置的所述伪函数,通过如下shell操作:export LD_PRELOAD=/data/a.so。就可以将a.so这个动态链接库文件注入到所有的这个shell启动的其他程序中。\n[0056] 进一步地,在获取到所述返回数据之后,可以执行格式转换、编码压缩等处理,以减少保存的数据量。\n[0057] 本发明中,针对各种不同的函数的返回数据,采用相应的方式获取:\n[0058] 当所述服务器程序调用时间获取API获取时间时,保存所述时间获取API的返回值。所述服务器程序获取时间的时候,调用time、gettimeofday等系统API,本步骤中记录下这些时间获取API的返回值。\n[0059] 当所述服务器程序调用文件读取API(fread、fgets等)读取文件时,保存所述读取操作,并判断读取的文件是否已保存;如果未保存,则保存所述文件,并保存所述文件的修改时间;如果已保存,则判断本次文件读取操作对所述文件的修改时间是否晚于所述文件最近一次保存的修改时间;如果是,则更新已保存的所述文件,并保存所述文件更新后的修改时间;否则,不更新已保存的所述文件。\n[0060] 由于服务器程序对于磁盘读取操作,输入数据就是对应的文件,而写操作是作为服务器程序的输出,除了写操作成功与否外,其他的写操作的数据都不会影响程序的运行。\n因此,只需要保存读取的文件。而对于读取的文件,首先判断文件是否已保存,如果是,则进一步判断保存的文件是否最新,如果不是最新则更新后再保存,以保证保存的文件与读取操作所执行的文件相同。而对于内容不会被改变的文件,则可以无需保存文件内容。因此,可以预先设置一个白名单,所述白名单中记录有需要保存的文件的扩展名,或者不需要保存的文件的扩展名。然后在所述服务器程序调用文件读取API读取文件时,根据预设的白名单,判断读取的文件是否需要保存。\n[0061] 当所述服务器程序调用网络数据接收API接收数据时,保存所述接收数据的操作,并保存接收的数据。服务器程序发送的数据同样是作为服务器程序的输出,因此也无需记录发送的数据,必要时可记录发送成功与否。\n[0062] 当所述服务器程序的信号量接收函数接收到信号量时,记录所述信号量的接收时间和所述信号量的值。对于信号量(Semaphore),首先找到所述信号量的对应的接收函数(通常为程序自带的函数),当所述接收函数被调用时,记录下调用的时间点和对应的信号量的值。\n[0063] 例如,服务器在线运行时,通过hook系统API,获取所述服务器程序接收第一信号量的函数,通过hook所述接收第一信号量的函数,获取所述第一信号量,保存所述函数调用的时间点和对应的第一信号量的值。然后,在需要离线对服务器程序的运行情况进行还原时,通过hook所述接收第一信号量的函数,按照所述函数调用的时间点,将所述第一信号量返回给所述服务器程序,使所述服务器程序执行所述第一信号量对应的操作。\n[0064] 作为本发明的一种优选实施方式,在保存所述返回数据以及所述返回数据的获取时间时,优选将所述返回数据以及所述返回数据的获取时间传输到所述服务器以外的储存设备上保存。因为将记录的数据保存在所述服务器的物理设备之外的其他储存设备上,而不是保存在所述服务器的物理设备上,因此,可以减轻服务器物理设备的负担,实现分布式数据保存。\n[0065] 作为另一种优选实施方式,为使监控更加有针对性,在服务器程序启动时,可根据预设的监控列表,判断所述服务器程序是否属于所述监控列表中记载的程序;\n[0066] 在判断结果为是时,执行所述获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间的步骤;否则,不对该服务器程序进行监控。\n[0067] 因为服务器程序的所有状态包括:系统时间、磁盘IO、IPC通讯、网络通讯、信号量等。所以本发明在对所述服务器程序在线运行状态进行“录制”时,监视服务器程序的函数调用行为,通过注入伪函数,以旁路的方式,按照相应的函数调用的时间顺序,记录下这些调用行为产生的返回数据,同时将这些返回数据输入到服务器程序,保证服务器程序正常的调用功能也会完成。在“回放”的时候,对同样的服务器程序,按照所述调用时间顺序,将录制下来的数据,回填给服务器程序,而不需要经过真正的函数调用,使“回放”过程更加准确,而且更加方便。\n[0068] 本发明在服务器进程运行的时候,记录下服务器程序的所有输入,依据记录下来的数据,可以做到服务器程序在线运行状态的完全还原。并以回放时候的服务器作为基础,进行服务器程序性能的测试分析,服务器程序开发过程中偶现的BUG的重现,或者分析服务器的接入用户行为等等应用。\n[0069] 本发明可以很好的处理现有的服务器程序监控工具导致的服务器的性能损耗问题,针对类似带有C10K(高并发网络服务器的性能)问题的系统,性能表现往往至关重要。\n本发明可以将服务器程序的在线运行行为完全还原,也就是说服务器程序代码的执行路径是完全一致的,以此为出发点,基于本发明的服务器程序性能分析也就可以很大程度上还原服务器程序在线运行时的真实表现。通过在离线状态下“回放”,对服务器程序进行性能分析,没有常规分析软件所带来的性能开销,可以很好的针对运营中的服务器程序进行彻底的问题检查。相对于传统的监控技术,本发明可以以更小的代价完全还原服务器程序的运行状态,那么就可以在回放的时候等效的分析服务器在线运行时候的性能损失,而且可以进行性能优化后的程序在同样输入的情况下的数据对比。\n[0070] 通过本发明记录下用户的行为,可以用于运营阶段的服务器程序的偶现BUG的重现,提高问题解决的效率。由于服务器程序的所有输入状态都被记录下来,那么重现服务器程序在软件开发过程中的BUG,也就非常自然了。可以解决软件开发,尤其是服务器程序开发过程中的偶现BUG难以定位的问题。\n[0071] 同时对于用户的异常行为,以及判断用户是否利用程序漏洞非法获利方面,也可以通过本发明的“录制”和“回放”重现当时的场景,方便检查。通过本发明来做整个系统运行期间的全状态记录。软件开发人员和运营维护人员都可以很方便的知道服务器用户的所有操作,对于安全检查,用户行为分析等都有很大的用处。\n[0072] 同时为了降低因为“录制”数据对服务器程序的影响,通过采取分布式的数据储存方式,将数据压缩,数据保存时的磁盘写文件等操作,通过网络传输到另一台物理机,这样在服务器的本机上仅仅是内存上的数据计算和网络发送,负载相对要小很多,通过实际测算,对于服务器程序的性能影响仅仅为3%~5%左右。\n[0073] 请参阅图4,图4是本发明服务器程序的监控系统的结构示意图。\n[0074] 所述服务器程序的监控系统包括录制模块11和回放模块12。\n[0075] 所述录制模块11用于获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;\n[0076] 所述回放模块12用于在离线状态下,根据所述获取时间,将相应的所述返回数据输入到所述服务器程序。\n[0077] 由于服务器程序的输入都是通过调用相应的函数获取的,因此,所述录制模块11获取这些函数的返回数据,也就获取了所述服务器程序的所有输入数据。\n[0078] 所述服务器程序调用的函数包括系统API(Application Programming Interface,应用程序编程接口)、自定义函数,以及共享内存的读取函数。\n[0079] 所述系统API是指服务器系统中自带的一些预先定义的函数,比如linux系统下的时间获取API,包括time和gettimeofday等;又如文件读取API,包括fread和fgets等,系统API为最常用的函数,通常大部分服务器程序读取文件、获取时间、获取网络信息等的操作都是通过调用系统API来完成。这些系统API都具有固定的接口地址,通过这些接口地址可以调用对应的系统API。\n[0080] 所述自定义函数是指服务器运行商或者服务器程序制作者自定义的一些可供服务器程序调用的函数,这些自定义函数通常用于执行一些系统API无法完成功能,例如信号量接收函数。这些自定义函数也具有指定的接口地址,通过这些指定的接口地址可以调用对应的自定义函数。\n[0081] 所述共享内存的读取函数是指读取进程间的共享内存的函数。shared memory(共享内存)是进程间通信的一种技术,将一块内存映射到两个进程地址中,使得两个进程都可以对同一块内存进行读写,以linux为例子,通过shmget、shmat这两个函数,可以申请一块共享内存,然后进程就可以像使用普通内存一样对这块共享内存进行读写操作,从而完成和其他进程的交互。而对这种共享内存的读取操作通常不是直接通过系统API完成的,而是由专门的共享内存的读取函数完成。这些共享内存的读取函数通常封装在一个函数集中,供应用服务器程序调用。\n[0082] 所述录制模块11可通过hook技术监视所述服务器程序对上述这些函数的调用行为,以及对应的函数的返回结果,就可以获得所述返回数据,以及所述返回数据的返回时间。\n[0083] 所述录制模块11获取所述返回数据之后,一方面要将所述返回数据输入到所述服务器程序,以保证服务器程序的正常运行,减少对服务器在线运行的效率的影响。另一方面,需要将所述返回数据以及所述返回数据的获取时间保存下来,以便在服务器离线时将所述返回数据回填到服务器程序。\n[0084] 所述回放模块12用于在离线状态下,将相应的所述返回数据输入到所述服务器程序。由于服务器离线时的运行情况监控不会影响到服务器的在线运行效率,因此在服务器离线工作状态下,所述回放模块12按照所述获取时间的顺序以及时间间隔,将相应的所述返回数据输入到所述服务器程序,就可以还原服务器程序的在线运行情况。\n[0085] 本发明通过在服务器在线运行时,获取服务器程序所调用的函数的返回数据,记录下所述服务器程序的输入状态,完成了服务器程序在线运行状态的“录制”。并且将所述返回数据输入到所述服务器程序,因此所述服务器程序能够正常运行。又因为只记录所述服务器程序的输入状态,而不需要记录所有的输入、输出和处理时间等状态参数,所以对服务器在线运行的效率影响较少。\n[0086] 所述回放模块12在离线状态下,将保存的所述返回数据再次输入到所述服务器程序,因为程序的动作是由其输入决定的,同样的程序响应相同的输入会作出相同的操作,获得相同的输出。而本发明中保存的所述返回数据即为所述服务器程序在线运行时的输入,在离线状态下将所述返回数据重新输入到所述服务器程序,所述服务器程序将会作出和在线运行时相同的响应,因此可以在离线状态下完成所述服务器程序在线运行状态的“回放”。通过对还原的在线运行状态的分析,可以得到服务器程序在线运行时的分析数据。\n[0087] 作为一个优选实施方式,所述录制模块11利用hook函数监视所述服务器程序在线运行时的函数调用行为,在发生函数调用行为时,调用预设的伪函数获取被调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并且保存所述返回数据;\n[0088] 所述回放模块12在离线状态下,根据所述获取时间,调用所述伪函数将相应的所述返回数据输入到所述服务器程序。\n[0089] 其中,所述预设的伪函数为本发明预设的函数,其从所述被调用的原函数获取所述返回数据,将所述返回数据输入到所述服务器程序,并将所述原函数的返回数据保存下来。\n[0090] 所述伪函数可通过以下方式调用:在发生函数调用行为时,将所述服务器程序所调用的函数的地址替换为承载所述伪函数的动态链接库的地址。\n[0091] 例如在Linux系统下,可通过环境变量LD_PRELOAD将承载所述伪函数的动态链接库注入到服务器程序中,采集所述返回数据。这种操作是linux或者windows操作系统的基础功能都可以完成的,同时方法也是多种多样的,本发明以linux为例,linux提供了一个环境变量LD_PRELOAD,通过将这个环境变量设置为一个动态链接库文件,承载所述预设的伪函数,通过如下shell操作:export LD_PRELOAD=/data/a.so。就可以将a.so这个动态链接库文件注入到所有的这个shell启动的其他程序中。\n[0092] 所述录制模块11在获取到所述返回数据之后,可以执行格式转换、编码压缩等处理,以减少保存的数据量。\n[0093] 所述录制模块11对各种不同的函数的返回数据,采用相应的方式获取。\n[0094] 请参阅图5,图5是本发明服务器程序的监控系统的一个优选实施方式中录制模块的结构示意图。所述录制模块11包括:\n[0095] 第一录制子模块111,用于在所述服务器程序调用时间获取API获取时间时,保存所述时间获取API的返回值。所述服务器程序获取时间的时候,调用time、gettimeofday等系统API,本步骤中记录下这些时间获取API的返回值。\n[0096] 第二录制子模块112,用于在所述服务器程序调用文件读取API(fread、fgets等)读取文件时,保存所述读取操作,并判断读取的文件是否已保存;如果未保存,则保存所述文件,并保存所述文件的修改时间;如果已保存,则判断本次文件读取操作对所述文件的修改时间是否晚于所述文件最近一次保存的修改时间;如果是,则更新已保存的所述文件,并保存所述文件更新后的修改时间;否则,不更新已保存的所述文件。\n[0097] 由于服务器程序对于磁盘读取操作,输入数据就是对应的文件,而写操作是作为服务器程序的输出,除了写操作成功与否外,其他的写操作的数据都不会影响程序的运行。\n因此,只需要保存读取的文件。而对于读取的文件,首先判断文件是否已保存,如果是,则进一步判断保存的文件是否最新,如果不是最新则更新后再保存,以保证保存的文件与读取操作所执行的文件相同。而对于内容不会被改变的文件,则可以无需保存文件内容。因此,可以预先设置一个白名单,所述白名单中记录有需要保存的文件的扩展名,或者不需要保存的文件的扩展名。然后在所述服务器程序调用文件读取API读取文件时,所述第二录制子模块112根据预设的白名单,判断读取的文件是否需要保存。\n[0098] 第三录制子模块113,用于在所述服务器程序调用网络数据接收API接收数据时,保存所述接收数据的操作,并保存接收的数据。服务器程序发送的数据同样是作为服务器程序的输出,因此也无需记录发送的数据,必要时可记录发送成功与否。\n[0099] 第四录制子模块114,用于在所述服务器程序的信号量接收函数获取到信号量时,记录所述信号量的获取时间和获取的信号量的值。对于信号量(Semaphore),首先找到所述信号量的对应的接收函数(通常为程序自带的函数),当所述接收函数被调用时,记录下调用的时间点和对应的信号量的值。\n[0100] 作为一种优选实施方式,所述录制模块11在保存所述返回数据以及所述返回数据的获取时间时,优选将所述返回数据以及所述返回数据的获取时间传输到所述服务器以外的储存设备上保存。因为将记录的数据保存在服务器的物理设备以外的其他储存设备上,而不是保存在服务器的物理设备上,因此,可以减轻服务器物理设备的负担,实现分布式数据保存。\n[0101] 作为另一种优选实施方式,为使监控更加有针对性,本发明服务器程序的监控系统进一步包括判断模块(图未示),用于在服务器程序启动时,可根据预设的监控列表,判断所述服务器程序是否属于所述监控列表中记载的程序;在判断结果为是时,所述录制模块获取服务器程序在线运行时所调用的函数的返回数据,将所述返回数据输入到所述服务器程序,并保存所述返回数据以及所述返回数据的获取时间;否则,不对该服务器程序进行监控。\n[0102] 因为服务器程序的所有状态包括:系统时间、磁盘IO、IPC通讯、网络通讯、信号量等。所以本发明在对所述服务器程序在线运行状态进行“录制”时,监视服务器程序的函数调用行为,通过注入伪函数,以旁路的方式,按照所述函数调用的时间顺序,记录下这些调用行为产生的返回数据,同时将这些返回数据输入到服务器程序,保证服务器程序正常的调用功能也会完成。在“回放”的时候,对同样的服务器程序,按照所述调用时间顺序,将录制下来的数据,回填给服务器程序,而不需要经过真正的函数调用,使“回放”过程更加准确,而且更加方便。\n[0103] 下面举例说明本发明服务器程序的监控方法及其系统的一种软件的实现架构,所述架构由三个主要模块构成,分别为:TRECORD、TWCACHE、TWATCHSVR,如图6所示,下面分别对每个模块的功能做具体的说明。\n[0104] TRECORD:\n[0105] 本模块利用Linux环境变量LD_PRELOAD注入到服务器程序中,负责采集和回填数据。\n[0106] 主要功能是在录制的时候,记录下服务器程序调用函数的返回数据,并将数据状态转化为相应的数据格式,通过共享内存,传输到TWCACHE中。在回放的时候,通过接收TWCACHE传输来的数据,填充到对应的服务器程序,将程序的所有输入状态还原到录制时候的状态。\n[0107] 针对不同的数据,TRECORD采取不同的记录策略:\n[0108] 时间数据:录制的时候,每次服务器程序调用time、gettimeofday等系统函数,TRECORD通过劫持相应的函数,记录下这些函数的返回值。\n[0109] 文件数据:对于进程的磁盘读取操作,TRECORD对于所有的文件读操作(fread、fgets等)首先判断本次读取操作的文件是否已经被记录下来,如果否,则记录文件,并将文件的修改日期保存在内部的表(FILE_TABLE)中;如果是,则比较本次操作的文件的最后修改日期是否晚于FILE_TABLE对于文件的日期,如果完,则记录文件。\n[0110] 网络通讯:TRECORD记录所有的接收操作,并将对应的数据记录下来。\n[0111] 信号量:对于信号量,TRECORD首先找到所有的信号量的对应接收函数,当所述接收函数被调用的时候,TRECORD记录下调用的时间点,和对应的信号量的值。\n[0112] TWCACHE:\n[0113] 本模块也部署在服务器的同一台物理机上,是一个中转机,用于将TRECORD发送过来的数据,通过TCP传输到TWATCH SVR。并且在这个过程中,做初步的数据压缩。在传输过程中TWCACHE会做QoS(Quality ofService,服务质量安全机制)处理,保证通道的可靠性。\n[0114] TWATCH SVR:\n[0115] 本模块负责对采集数据的管理,在录制的时候,接收TCP数据,并利用zlib压缩算法将数据存储在磁盘上。回放的时候,将数据通过磁盘取出,在发送到TWCACHE。通过将磁盘IO分布式部署,进一步降低对于服务器的性能影响。\n[0116] 本领域普通技术人员可以理解实现上述实施方式中的全部或部分流程,以及对应的系统,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各实施方式的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。\n[0117] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
法律信息
- 2016-01-13
专利权的转移
登记生效日: 2015.12.21
专利权人由腾讯科技(深圳)有限公司变更为深圳市腾讯计算机系统有限公司
地址由518044 广东省深圳市福田区振兴路赛格科技园2栋东403室变更为518000 广东省深圳市南山区高新区高新南一路飞亚达大厦5-10楼
- 2015-09-16
- 2014-03-12
实质审查的生效
IPC(主分类): G06F 11/34
专利申请号: 201210241300.X
申请日: 2012.07.12
- 2014-01-29
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2007-07-25
|
2006-11-27
| | |
2
| |
2010-02-03
|
2008-07-31
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |