1、1J2EE 应用服务器的软件老化和恢复 近年来,软件老化和恢复在工业领域和学术领域被广泛的研究,软件老化的特点是先进的性能退化或者长期运行的软件系统突然停止导致操作系统的资源枯竭。软件恢复是一项主动性的和预防性的再次连接软件的恢复技术。在这个工作中,首先分析 Java 虚拟机的内存泄漏(JVM),然后检查 J2EE 应用程序软件老化现象。为了缓和软件老化的影响和防止系统失败,通过分层局部的或者全局的重启系统软件恢复方法。最后,实验结果证明计划的方法比周期恢复的方法优越。版权 2014 年约翰威利& Sons 有限公司1 介绍可靠的报告报导在一个长期运行的软件系统里软件老化现象,系统性能随着时间
2、逐渐衰退甚至突然导致故障。在安全系统里软件老化会导致巨大的损失,包括失去人类的生命。内存泄漏和存储残片,操作系统资源枯竭和数值四舍五入错误是导致软件老化的重要原因。除了例如系统重启这样的反应式方法,阻碍软件老化的预防性恢复技术是软件恢复。包含临时停止软件系统,消除错误情况然后在一个干净的环境里重启系统。这个方法比进程消除累积错误还要高明,并且释放系统资源,除此之外还可以改善系统的重用性和可用性,推迟或者预防无计划的昂贵的未来系统故障。目前软件老化现象在许多系统已经被广泛的观察和注意到。Garg 等人,第一个提议基于测量的方法去估计软件老化,在一个网络化的 UNIX(一种多用户的计算机操作系统)
3、工作站通过设计和实施一个基于 snmp(简单网络管理协议)的分散监控工具去收集操作系统资源使用和系统活跃数据。Cassidy 等人。在一个大型OLTP DBMS 服务器里采用统计学模式识别法去检查软件老化。Grottke 等人。在一个 Apache web 服务器采用非参数统计分析方法估计(软件)老化趋势。通过收集的数据交换使用空间、响应时间和空闲物理内存。Cotroneo 等人。再 Sun Hotspot JVM 里通过采用参数和非参数统计技术来分析吞吐量损失的趋势和记忆损耗来显示了软件老化的存在。Alonso 和 Torres 提出了一种基于在一个 web 应用程序面向方面编程监控资源每个
4、组件的使用的监测框架,因此决定出哪一个组件和J2EE 应用服务器的软件老化和恢复1软件老化有关系。在云计算基础设施研究软件老化影响,虚拟和常驻内存用法都是被监控的。RAM(随机访问内存)内存耗尽、交换内存消耗、相应时间随后的增加都被检测到。软件恢复的重大问题之一是何时去触发它,导致其工作线程的消耗。两种主要的方法去确定软件恢复花费时间是基于模型方法和基于测量方法。基于模型方法通过分析软件系统和系统故障分布假设的状态关系决定最优再生时机。大多数研究只考虑 OS(操作系统)级别的恢复。Xie 等人,提出了一个有趣的两级恢复策略就是全部重启和部分重启。来自硬件预防性维护的灵感,Koutras 和 P
5、latis 在客户端/服务器系统里提出了一个最小的和完美的软件恢复技术。最小的恢复技术事停止系统服务、保存任何必要的而数据和重新开始系统到一个可使用的状态。完美的软件恢复技术包含关掉操作系统,为了释放资源,连同所有的正在运行的应用也关掉。Ning 等人,连续时间使用马尔可夫链的方法去学习一个多粒度的软件恢复政策,并且可用性最大化和成本最小化获得最佳的检查速率和缓和期。在一个基于测量方法关于资源使用(比如,释放物理内存和交换使用空间)和性能(比如,相应时间和吞吐率)的系统数据,是监控找到软件老化的一个重要趋势,因此决定软件恢复的触发条件。Jia 等人,他们学习软件老化影响和在一些不同的性能指标(
6、例如相应时间、物理内存、交换空间)之间的联系,然后估计在一个简单的使用主成分分析的参数中软件老化的影响。Matias 等人,探讨操作系统内核仪器技术测量软件老化效应相关的记忆问题,特别是内存泄漏和记忆碎片。这项工作是更好的理解软件老化现象非常重要的一步。Avritzer 等人,提出了几个软件老化的检测方法和基于测量软件恢复算法随着响应时间的变化。Alonso 等人,提出了一个不同的恢复策略的涵盖了五个恢复层次比较实验研究:应用粒度、粒度操作系统、虚拟机的粒度, 和物理机的粒度。实验结果表明不同层次的恢复策略处理不同的软件老化影响,并产生了不同的成本。所以悬着适当的恢复策略去减轻软件老化的影响在
7、不同的的层次是非常重要的。J2EE(JAVA 平台环境)应用服务器是 Web 应用程序的一个流行的服务器端解决方案。它提供了高度声明式设计、部署模型和各种软件组件为了简化复杂应用程序的开发。一个长时间运行的 J2EE 应用程序服务器可能累积内存泄漏引起一些变量声明缺乏或者类似的软件故障,导致物理内存不能用。通常情况下,软件故J2EE 应用服务器的软件老化和恢复2障应该是在测试过程中删除。但是,即使软件可能被彻底的进行测试,仍然会有一些设计错误在实践中尚未暴露。本文中,首先分析了在 JVM 里内存泄漏和垃圾回收机制有联系,然后在 J2EE应用服务器里使用一个简单的方法去检测软件老化去证明通过 J
8、VM 堆内存使用的数据和 CPU 使用数据。此外,分层的软件恢复方法提出了阻碍软件老化。最后,实验结果显示这个恢复方法是有效的。2 J2EE 应用程序服务器的体系结构应用服务器是一种独立于软件系统或者提供了计算的管理资源和网络通信的服务程序。他掩饰底层网络和操作系统之间的复杂性和异构性,所以整个系统给对于客户是透明的。图 1 展示了 J2EE 应用服务器的架构,通过负载均衡理论,负载分配器分散客户端请求 HTTP 服务器到 J2EE 应用服务器。其后,应用服务器连接和查询数据库服务器通过 Java 数据库连接技术,然后把结果返回给客户端。图 2.1 体系结构图3 JVM 中的内存泄漏在长期运行
9、的软件系统里内存泄漏会严重影响系统的性能和可靠性,并且经常是软件老化起作用的因素。程序员不正确的使用软件管理习惯(比如,不均衡J2EE 应用服务器的软件老化和恢复3的使用内存在 C 盘 program)经常导致内存泄漏。关于 JAVA 程序,尽管在 JVM 的有垃圾回收机制,在 JAVA 应用里内存泄漏仍然存在。下文中,首先介绍 JVM 的内存管理和垃圾回收机制是分析内存泄漏问题。JVM 的存储区也叫作数据运行区,负责储存数据(例如,字节码,对象和参数)和当 JVM 里的程序运行时返回值、本地变量和中间结果。JVM 的内存泄漏可以分为面积法、堆内存堆栈、寄存器堆栈和本地代码。其中,在运行的 J
10、AVA 应用里堆内存用来存储一个类的实例或者数组的实例。内存管理本质上是需要提供动态方法去响应程序当它请求时,然后释放它们当它们长时间不需要,这样可以重新使用。JVM 内存管理对一个新对象提供内存分配的指令,但是不支持指令的内存释放,这个是垃圾回收机制实现的。当 JVM 内存随着时间被连续不断的使用并且达到最大,垃圾回收机制会自动启动并释放内存。然而,如图二所示,垃圾回收机制只能回收无用的并且未被引用对象,而无用的但被引用的对象不能从内存区域被释放,因此产生内存泄漏。与此同时,系统资源有限并且垃圾回收机制会占用了大量的 CPU 时间去释放内存和系统资源。因此,连续出现内存泄漏现象的累积影响会直
11、接导致内存不足和老化导致的系统故障。4 J2EE 应用服务器里老化现象的检测和分析检测和减轻软件老化现象的本质是当系统出现软件老化现象时达到高度的可靠性和可用性。然而,软件老化现象可能在系统长期运行后才被发现到。因此,我们在 J2EE 应用服务器里检测老化现象通过一个加速老化测试。4.1 实验环境正文省略J2EE 应用服务器的软件老化和恢复4图 4.1 jvm 图图 4.2 分布图4.2 老化测试和分析 正文省略5 分层软件恢复管理机制为了减轻在 J2EE 应用服务器里的软件老化,我们采取分层软件恢复技术去主动地和预防地重启全局或者局部系统在它发生故障前,这样可以避免巨大的损失。J2EE 应用
12、服务器的软件老化和恢复5图 5.1 数据图图 5.2 数据图5.1 基本想法正文省略J2EE 应用服务器的软件老化和恢复6图 5.3 流程图5.2 分层软件恢复方法正文省略J2EE 应用服务器的软件老化和恢复7图 5.4 流程图5.3 评估分层软件恢复方法正文省略图 5.5 数据图J2EE 应用服务器的软件老化和恢复8图 5.6 柱状图6 结论和未来工作软件系统的老化(现象) ,就和人类身体一样,是一个累积的过程。在一个长期直接运行的应用程序服务器里内存泄漏连续出现的累积现象导致老化带来的故障或崩溃。尽管垃圾回收机制可以被当做一个特殊的 JAVA 函数去自动释放对象,内存泄漏的问题仍然存在于
13、JAVA 应用里。本文中,我们在 J2EE 应用服务器里研究软件老化现象。通过收集和分析 JVM 堆内存使用和 CPU 利用率的数据,在 J2EE应用服务器里软件老化现象证明它性能逐渐退化。而且,为了减轻老化现象和改善系统的性能和可用性, (我们)提出分层的软件恢复方法。最后,实验结果表明(分层的软件恢复方法)在处理客户端请求和事务有这 一个很好的表现。 然而,当前的工作仍然有一些限制:每个组件恢复水平的百分比、分层软件恢复方法在 JVM 和操作系统级别相关的有效性还没有被发现。未来的工作,我们会设计各种各样的恢复技术去测量软件老化效果比例。此外,自从我们在 J2EE 应用服务器里专注于系统的性能,在实验里,只有模拟业务逻辑方法的远程调用进程。未来工作里,我们会包含 Web 应用的用例。1