标题 | 一种新的数字集群通信系统网关内存测试方法 |
范文 | 董昕 摘 要: DIMETRA IP系统是一种在广泛的地理区域为无线用户提供语音和数据服务的公共安全的数字集群通信系统。摩托罗拉电话互连网关(MTIG)提供DIMETRA IP系统与外部程控交换机(PABX)之间的语音编码转换,支持对讲机与固定电话或移动电话的通信。这里介绍了进行MTIG内存性能测试的一种创造性的方法,该方法不仅能进行系统级和进程级的内存检测而且支持超长时间的内存测试。测试实践证明,该方法可以提高测试效率,是可行的有益的,值得推广和部署。 关键词: 数字集群通信; 电话互连网关; 性能测试; 内存泄漏 中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2015)07?0034?05 0 引 言 MTIG作为实现对讲机与电话互联互通的网关,提供DIMETRA IP系统(见图1)与外部PABX之间的语音编码,支持DIMETRA系统内的对讲机与外部电话之间通信。 内存是计算机/服务器的重要部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的。内存的运行也决定了计算机的稳定运行,因此内存的性能对计算机的影响非常大。 内存包括物理内存和虚拟内存。物理内存是指存储区映射到实际的存储芯片,提供最快的访问速度。虚拟内存是指操作系统可以使用外部存储器(硬盘等)来存储数据[1]。 内存性能测试主要是通过测试判断程序有无内存泄漏现象。内存泄漏是指用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,导致整个系统崩溃[2]。可见内存泄漏的后果相当严重,因此通过内存测试来检测内存泄露十分重要。 在数字集群通信系统中最常见的是隐式内存泄漏:程序在运行过程中不停地分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存[3]。但是对于一个服务器程序,需要运行几天、几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,这类内存泄漏称为隐式内存泄漏。 隐式内存泄漏危害在于内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为它更难被检测到。所以测试环境和测试方法对检测内存泄漏至关重要[4]。 图1 DIMETRA IP系统概述 本文主要介绍数字集群通信系统电话互联网关MTIG检测的内存泄漏的一种新的方法。 1 现有测试方法 1.1 EPO工具 EPO(Enhanced Performance Optimized)是一种由C,Perl和UNIX shell开发的工具,它能捕捉内核性能统计数据并存储在一个圆罗宾数据库(RRDtool)中。该方法适用于Linux 及SunOS / Solaris系统[5]。 一旦数据被EPO工具获取,该工具就能利用数据画出内存消耗图。这种方式能容易地获得一个清晰的实时的内存使用情况。 EPO的主要功能包括: (1) 如果分析过程的一个子函数失败,告知用户; (2) ANOVA(方差分析); (3) 贝叶斯分析; (4) 找到硬件的限制:如存储限制等; (5) 创建一个内存使用图。 EPO工具的数据流如图2所示。 (1) 所有数据由epo_se服务从内核提取并存储于XML文件; (2) epo_se2rrd导入数据到epo.rrd文件。所有的统计都基于在epo.rrd文件中的数据。 1.2 GetMem工具 EPO工具的缺点是它只能表明系统级的内存消耗,如何定位到是哪个进程发生了内存泄漏是个问题。 图2 EPO数据流 由此引入了一个新的工具GetMem,该工具可以显示应用或进程级的内存消耗。GetMem工具是由Perl脚本分析Linux PMAP数据文件pmap.out从而得出内存使用情况[6]。Linux PMAP命令可由进程号得到这个进程号对应进程的内存映射。下面是GetMem部分脚本: #!/usr/bin/perl use strict; … System("$PS -eo ′pid=′| $XARGS $PMAP -x | $TR -d ′[]′ > $PMAP_FILE" ); open (PMAP_LISTING, $PMAP_FILE ) or die "Cannot read $PMAP_FILE"; while ($line= { chomp($line); @data=split(/\s+/, $line); if($data[0] =~ m/^\-+/ || $data[0] =~ m/Address/ || $data[0] =~ m/total/) { # Filter junk lines } elsif ($data[0] =~ m/(\d+):/ ) { $procid = $1; $process = $data[1]; 1.3 vSpherePM工具 前面两种工具能支持系统级和进程级内存测试,但不能很好地支持超长时间的内存测试。如果进行超长时间的内存测试就需要引入其他工具。作者将介绍内存消耗监视应用程序vSpherePM,该程序可以实现超过48天的长期测试。作为全新的性能监测工具,vSpherePM只需安装到一台Linux的服务器上,就能实现同时对多个系统中多台VMware ESXi服务器进行长时间的监控,将收集到的性能数据进行分析,生成相应的图表和错误报告,同时将错误报告以警报的方式发送给错误管理器,以便系统管理员实时监控系统中每台服务器的性能状态,及时采取必要措施[7]。 vSpherePM原理图如图3所示,此工具可用于跟踪和记录远程UNIX,Linux,SunOS等的性能变化。它的主要用途如下: (1) 监控服务器的内存状态; (2) 总体的物理/虚拟内存状态; (3) 关键过程的物理/虚拟内存状态; (4) 根据测试报告中的实时数据生成图表。 图3 vSpherePM原理图 1.4 三种工具小结 以上三种工具的特性比较,如表1所示。 表1 三种工具的特征比较 [工具名称\&数据源\&优点\&缺点\&EPO \&/proc/meminfo\&能够画出内存 消耗图;得出清楚的系统内存使用情况\&只能生成系统 级的结果\&GetMem\&Linux /proc/meminfo 文件\&易于使用; 轻量级,可嵌入 测试用例中使用; 生成进程级的数据\&不能支持超长时 间的内存测试\&vSpherePM\&VMware ESXi 服务器\&支持超长时间的 内存测试\&需要在VMware ESXi环境下使用\&] 每一个工具都可以重复进行回归测试。然而,单一工具都有其局限性,在某些特定情况下不能及时发现内存的异常消耗。为了提高测试效率,软件测试工程师可以根据实际情况将这些工具灵活使用[8]。 2 一种新的测试方法 基于以上三种工具的特性,作者提出了一种新的内存测试方法。测试开始用EPO工具获得系统级内存信息。如果发现系统级内存泄漏,通过GetMem检测重点怀疑的某些线程的内存信息。 如果发现某线程内存泄漏,定位引发该问题的代码并解决问题。 如果前面的测试都没发现内存泄漏,可以通过超长时间测试工具vSpherePM发现隐藏的细微的内存泄漏。 这个方法基于三种工具的优缺点取长补短,进行了优化和创新,是一种切实可行的方法。新方法流程图如图4所示。 图4 新方法流程图 这个新方法的创新与价值在于: (1) 超长时间连续的性能监控 即使被监控的服务器重启、关机甚至重装,都不影响该方法对其状态的监控,一旦服务器正常运行,就会继续获取性能数据,无需重启; 支持超过48天的长时间测试。 (2) 覆盖范围广 可以同时对多达70台的VMware ESXi服务器,超过400台的虚拟机进行监测; 不仅仅局限于摩托罗拉数字集群通信系统,可以对所有基于VMware ESXi的服务器进行监测。 (3) 帮助测试人员快速发现系统问题,定位问题原因。 (4) 数据智能分析 发现潜在的系统问题,并向错误管理器发送报警信息。 在下面的测试实例中,作者通过观察总体的和关键进程的内存数据来判断是否存在内存泄漏问题。如果内存使用大小在测试过程中随时间增长,那么系统极有可能隐藏着内存泄漏问题。 为了模拟DIMETRA IP系统的真实应用场景,测试步骤如下: (1) 同时拨打60路对讲机与电话通话,采集系统内存信息; (2) 每个通话将持续1 min; (3) 取消所有的通话; (4) 重复以上步骤多次; (5) 比较这个过程中系统内存使用情况。 首先EPO工具绘制结果如图5所示,显示了系统级的内存消耗。可以发现系统的内存消耗持续增加,系统出现了明显的内存泄漏。 图5 系统级测试结果 在呼叫期间作为系统的电话互联网关,MTIG成为测试重点。而作为其中的媒体网关MG会经历分配/释放大量内存的过程,作者将测试重点进一步锁定为MG (Mediagateway)。作者重复之前的测试步骤,通过GetMem工具采集进程内存信息,比较这个过程中媒体网关MG的内存使用情况。 图6所示图像显示在约40 h内MG物理内存的变化。从图6中可以看到MG的物理内存持续增长,发生了明显的内存泄漏。 图6 进程级测试结果 经过测试发现MG这个进程不仅在通话结束后并不返回到原来的内存使用量,而且随着时间推移仍然不断增长。 如果进行较长时间的性能测试,就可能检测到微小的内存泄漏。通过这个新方法可以监控所有进程中潜在的内存泄漏风险。在另一个测试实例中通过这个新方法经过长达12天的连续测试,发现系统虚拟内存存在持续微小增长。进而经过长达48天的超长时间连续测试定位到是MTIG中CMA进程存在内存泄漏,如图7所示。 由此可见用该方法进行内存性能测试很有效。适当的测试场景和工具能大大地提高测试效率。 检测到内存泄漏之后,可以选择通过使用Valgrind,Mtrace或Klockwork等工具来帮助定位引起内存泄漏的代码段并解决该问题[9]。图8是内存泄漏问题解决后1个月内存使用情况,可以看出内存保持稳定。 图7 长期测试结果 图8 内存泄漏解决后长期测试图 3 结 论 本文测试实践表明,根据具体的测试目的和环境,可以灵活地选择测试方法进行内存性能测试。 测试人员可为新功能设计并执行专用的性能测试来发现潜在的内存泄漏问题。并且在负载较大情况下运行长期试验以查看是否有任何明显的或者是细微的内存泄漏[10]。 总之,该新方法在测试工作中已被证明是可行的和非常有益的。测试人员可以根据自身情况使用和部署。 参考文献 [1] HU Yue, WANG Yue?dong. Process?level virtual machine embedded chain mode memory management method [C]// 2011 International Conference on Computer Science and Network Technology (ICCSNT). [S.l.]: [s.n.], 2011, 1: 302?305. [2] WUYTACK S, DA SILVA J L, Jr., CATTHOOR F, et al. Memory management for embedded network applications [J]. IEEE Transactions on Computer?Aided Design of Integrated Circuits and Systems, 1999, 18(5): 533?544. [3] CHENG Xiao?hui, GONG You?min, WANG Xin?zheng. Study of embedded operating system memory management [C]// ETCS [′09] First International Workshop on Education Technology and Computer Science. [S.l.]: IEEE, 2009, 3: 962?965. [4] SHAHRIAR H, NORTH S, MAWANGI E. Testing of memory leak in android applications [C]// 2014 IEEE 15th International Symposium on High?Assurance Systems Engineering (HASE). [S.l.]: IEEE, 2014: 176?183. [5] NI Qin?qin, SUN Wei?zhen, MA Sen. Memory leak detection in sun solaris OS [C]// ISCSCT ′08. International Symposium on Computer Science and Computational Technology. [S.l.]: IEEE, 2008, 2: 703?707. [6] CARROZZA G, COTRONEO D, NATELLA R, et al. An experiment in memory leak analysis with a mission?critical middleware for air traffic control [C]// IEEE International Conference on Software Reliability Engineering Workshops. [S.l.]: IEEE, 2008: 1?6. [7] MORAES R L O, DURAES J, BARBOSA R, et al. Experimental risk assessment and comparison using software fault injection [C]// Proceedings of the 37th International Conference on Dependable Systems and Networks (DSN). [S.l.]: [s.n.], 2007: 111?120. [8] CHEREM S, PRINCEHOUSE L, RUGINA R. Practical memory leak detection using guarded value?flow analysis [C]// Proceedings of the 2007 ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI). [S.l.]: ACM, 2007: 22?28. [9] XU G, ROUNTEV A. Precise memory leak detection for Java software using container profiling [C]// Proceedings of the 30th International Conference on Software Engineering (ICSE). [S.l.]: [s.n.], 2008: 123?129. [10] MAJI A, ARSHAD F, BAGCHI S, et al. An empirical study of the robustness of inter?component communication in Android [C]// Proceedings of the 42nd Annual IEEE International Conference on Dependable Systems and Networks (DSN). [S.l.]: IEEE, 2012: 1?12. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。