小研究 - J2EE 应用服务器的软件老化测试研究

软件老化现象是影响软件可靠性的重要因素,长期运行的软件系统存在软件老化现象,这将影响整个业务系统的正常运行,给企事业单位带来无可估量的经济损失。软件老化出现的主要原因是操作系统资源消耗殆尽,导致应用系统的性能下降甚至崩溃或宕机。文中监测J2EE 应用服务器系统资源的使用情况,考虑外界的负载变化,检测系统中软件老化现象,分析系统资源消耗何时达到临界值,从而帮助软件工程人员及时采取预维护手段,预防运行时系中重大故障的发生。

目录

1  引 言

2  J2EE 应用服务器老化测试和分析

2.1  实验环境

2.2  J2EE 应用服务器的老化测试

3  结束语


1  引 言

大型软件系统在持续平稳运行一段时间之后,系统资源大量消耗,服务性能和质量下降甚至挂起或宕机,称为软件老化现象。软件老化可能造成安全关键系统的重大损失,甚至人员伤亡。引起软件老化的原因有内存泄漏、各种类型的逻辑错误、致命的安全缺陷、死锁、状态冲突等。

目前,很多计算系统中已经检测到软件老化现象。文件系统中存在软件老化现象,发现存储空间碎片较多的文件系统存取吞吐量较正常情况下降低 40%。文献中,第一次提出了基于测量方法估测软件老化情况,首先监测导致系统低效或宕机的资源,如内存使用、交换区使用、CPU 占用率、空闲通信通道等,然后用统计学模型估算和验证软件老化,根据不同的策略决定是否及何时进行软件维护。文献中,采用统计模式识别方法,检测在线事务处理服务器系统中的软件老化现象。文中,以响应时间和响应率为系统性能的衡量依据,考虑负载变化因素,提出 Web 服务器系统中软件老化的检测方法。文献中,通过收集 Apache Web 服务器中对换区数据、内存使用量以及响应时间等信息,利用非参数统计学方法进行老化预测。通过收集 Web 服务器中的资源使用参数,发现系统性能逐步下降,然后计算系统平均负载时间序列的最大李亚普诺夫指数,证明系统的老化现象具有混沌性。针对 SunHotSpot Java 虚拟机系统,考察系统负载对老化的影响以及系统内存资源和吞吐量的变化,采用统计分析的方法评估系统的老化趋势。一种基于AOP(Aspect - Oriented Programming)技术的系统性能监测机制,通过监测服务器系统中每个组件的资源使用情况,从而分析判定引起软件老化的组件。文献分析并研究云计算系统中存在软件老化现象的影响因素,通过监测系统虚拟内存和物理内存的使用情况,发现系统内存资源逐渐消耗、CPU 占有量逐步增加,并且系统响应时间随之增长。此外,常用软件如Netscape 和 XRN 中也存在软件老化现象。

2 J2EE 架构的应用服务器系统

应用服务器是中间件最大的一个分支,其基于组件的中间层集成框架,为组件的运行提供运行时环境、基础服务和管理等功能。应用服务器位于企业应用与操作系统之间,屏蔽底层操作系统、网络以及数据库的异构性和复杂性,通过组件容器方式提供应用部署、运行平台。图 1 是一个基于 J2EE 平台的应用服务器结构示意图。客户端向应用服务器端提交服务请求,负载分配器根据服务请求的类型分配到合适的 HTTP 服务器上,然后将服务请求转交给应用服务器上,该应用服务器查询数据库,分析处理服务请求后将结果返回给客户端。J2EE 架构的应用服务器建立在 JVM(Java虚拟机)之上,JVM 的内存泄露是导致应用服务器老化的一个重要原因,因此需要对 JVM 的内存管理与内存泄漏进行分析。

JVM 内存区域,也叫运行时数据区,分为方法区、堆、栈、寄存器、本地码栈,在 JVM 运行程序时,存储字节码、对象、参数、返回值局部变量以及中间结果等数据。内存堆用来存放 Java 程序运行时创建的类实例或数组。每个虚拟机实例中只存在一个堆空间。JVM可以为新对象分配内存,但释放内存的任务由垃圾回收机制完成。垃圾回收机制回收不再被引用的无用对象,即当一个对象不再被引用的时候,内存回收它占用的空间,以便腾出空间被后来的新对象使用。但是有些可达的无用对象也可能成为不能回收的垃圾对象,如图 2 所示,垃圾回收机制这种潜在的缺陷造成内存泄漏的出现。

内存泄漏问题如果不加解决,随着时间的积累,造成 JVM 的内存使用量的持续增加,当 JVM 内存使用达到其最大堆栈大小时,JVM 自动的垃圾回收机制会进行垃圾收集。但每次执行垃圾收集后,无用对象所占的内存释放的百分比相对较小,最终会导致 JVM 连续地进行垃圾回收,占用大量的 CPU 时间,即 CPU 使用率持续增加。而系统资源是有限的,JVM 内存和 CPU使用率持续增加,最终将导致系统低效或宕机等老化现象。因此,需要专门的工具来实现 JVM 内存监测,提取内存相关信息,程序开发者能比较容易地判断程序是否有内存泄漏及其产生的原由,从而更好地进行软件老化现象的分析。

2  J2EE 应用服务器老化测试和分析

2.1  实验环境

测试的实验环境包括 J2EE 应用服务器和数据库服务器,运行在同一个局域网内,通过 100 Mbps 局域网连接,每个机器的配置为 P4 2. 4 G Intel CPU,运行环境采用 Sun JDK Hotspot 1. 4. 1_02 - b06。测试时首先在 IBM 的应用服务器 Websphere Application Server5. 1 上部署测试用例 Petstore 1. 3. 1 - 02,同时模拟多用户请求的应用客户端远程调用 EJB 模块中业务逻辑方法,业务逻辑方法包括了对数据库服务器中的数据的增加、删除、更新等操作,数据库系统是 IBM 的CloudScape4. 0。客户端负载发生器开始发送 SOAP/HTTP 服务请求时,在客户端实时地记录响应时间等系统性能参数信息,同时激活服务器端 Tivoli 性能查看器,记录应用服务器动态参数,基本的调用过程如图3 所示。负载发生器尽量模拟用户真实情况,采用一个星期为一个周期的形式,区分实际情况工作日和休息日的各个时段负载密度不同,模拟客户在某个小时间段内服从泊松分布,产生泊松序列的种子可自己设定。

数据采集工具使用 WAS 自带的 Tivoli 性能查看器(Tivoli Performance Viewer),它可以监控系统资源的使用情况,也可以从 WAS 内部获取 J2EE 架构的服务器中相关参数。采集的数据来自四个模块:JVM 运行时模块,提取 JVM 内存的总大小和使用内存的大小;系统数据模块,提取 CPU 使用率和系统可用内存;Web 线程模块,提取创建的线程总数、破坏的线程总数、并发活动的线程数及线程池的大小;事务管理器,提取开始的全局事务、活动的全局事务、全局事务持续时间及全局事务回滚等。其中,JVM 运行时模块和系统数据模块是最为重要的两个模块。Tivoli 性能查看器和 WAS 同时运行在应用服务器上,占用系统部分资源,采用这种方法得到的老化预测模型实际上是数据采集软件和 J2EE 应用服务器的老化现象叠加。由于Tivoli 性能查看器占用的系统资源很少,影响程度可以忽略,可把结果看作是 J2EE 应用服务器老化的结果。

2.2  J2EE 应用服务器的老化测试

为了测试 J2EE 应用服务器中是否存在软件老化现象,分析导致应用服务器老化的原因,设计了不同强度的负载情况,监测应用服务器的运行时参数情况,并进行老化分析。这里,单位时间发送请求的数量和平均服务持续时间是影响负载强度的两个重要因素。应用服务器的负载峰值是指应用服务器在单位时间内能够响应的最大用户数量。首先在较短周期内向服务器发送等值强度的请求任务,同时在客户端记录响应时间等参数信息,若客户端的请求全部得到响应,则增加负载强度,直到出现应用服务器无法响应所有请求时停止,此时的负载强度即为负载峰值。在老化测试时,根据服务器负载峰值设计发送请求的负载强度。

1)重负载测试。

重负载测试中,平均负载强度设定为负载峰值的30%,其中负载任务高峰期时的负载强度设定为负载峰值的 50%。JVM 内存使用量的初始大小为 128 M,最大值为 256 M。如图 4 所示,随着系统运行时间的推移,应用服务器系统内存使用量逐步增加,最终系统在运行 43 小时后,JVM 内存使用量临近 256 MB,导致JVM 内存资源不足而出现宕机,此时系统无法响应客户端请求。图 4 中内存使用量变化呈锯齿状,是 JVM垃圾回收机制作用的结果,当可用内存出现暂时不足,不能满足程序的内存需求时,系统将自动调用垃圾回收机制,释放更多的可用内存空间。然而,随着应用服务器的长期运行,其性能不断下降,JVM 自动内存管理机制所起的作用越来越小,最终导致系统宕机。

为验证应用服务器是否存在老化现象,即系统性能是否随时间的推移而缓慢下降,采用一元线性回归方法,分析 JVM 内存使用量 Y(单位:kB)和应用服务器运行时间 X(单位:min)的关系,得到式(1)描述的拟合直线方程。

Y = 25.852 7*X + 137 920 (1)

式(1)中回归直线的斜率为正,表示 JVM 内存使用量随着应用服务器运行时间的推移而增加,应用服务器存在老化现象。

2)轻负载测试。

轻负载测试中,平均负载强度和负载任务高峰期时的负载强度都设定为重负载测试中的 20%。应用服务器 JVM 内存使用情况如图 5 所示。

图 5 轻负载情况下应用服务器 JVM 内存使用量从图中可以看出,与重负载老化测试时情况相似,JVM 内存使用占250 M 左右时,应用服务器宕机,无法响应客户端请求,此时系统运行 140 小时。可得到内存使用量与服务器运行时间的一元线性关系式:

Y =11.736 5 * X +139 380 (2)

式(2)中回归直线的斜率为正,意味着内存耗尽引起服务器系统出现软件老化。此外,轻负载老化测试中负载强度减少,应用服务器运行时间增加三倍,可见负载强度是影响软件老化的主要因素。

3)延长平均服务持续时间的老化测试。此次老化测试中,平均服务持续时间为原来的六倍,且单位时间内发送请求的数量与轻负载测试中相同。应用服务器 JVM 内存使用情况如图 6 所示。

与前两种老化测试情况相同,JVM 内存使用量在250 M 左右时,应用服务器系统运行 8 小时后宕机,此时系统无法响应客户端请求。JVM 内存使用量与应用服务器运行时间的一元线性关系如式(3)。

Y =174.847 2 * X + 160 260 (3)

式(3)中回归直线的斜率为正,且斜率较上述两种情况增幅较大。这是因为延长服务持续时间,意味着应用服务器中 EJB 容器需为用户较长时间保留系统资源,这将加速耗尽应用服务器的系统资源,从而加快软件老化速度。

3  结束语

文中监测 J2EE 应用服务器系统中的资源使用情况,考虑外界负载变化,收集系统资源消耗的数据,检测系统的老化现象,分析系统资源消耗何时达到临界值,以帮助软件工程人员及时采取预维护手段,预防运行时系统中未来重大故障的发生。

下一步工作包括对系统老化机理和软件再生随机模型的研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器:本地私有仓库、harbor私有仓库部署与管理

文章目录 一.本地私有仓库1.本地私有仓库概述2.搭建本地私有仓库3.容器重启策略简介 二.harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3、Harbor的构成4.Harbor私有仓库架构及数据流向5.harbor部署及配置(192.168.198.11)(1&#xf…

Postman中参数区别及使用说明

一、Params与Body 二者区别在于请求参数在http协议中位置不一样。Params 它会将参数放入url中以?区分以&拼接Body则是将请求参数放在请求体中 后端接受数据: 二、body中不同格式 2.1 multipart/form-data key - value 格式输入,主要特点是可以上…

UG\NX二次开发 使用录制功能录制操作记录时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用…

初识 Redis

初识 Redis 1 认识NoSQL1.1 结构化与非结构化1.2 关联和非关联1.3 查询方式1.4. 事务1.5 总结 2 Redis 概述2.1 应用场景2.2 特性 3 Resis 全局命令4 Redis 基本数据类型4.1 String4.1.1 常用命令4.1.2 命令的时间复杂度4.1.3 使用场景 4.2 Hash4.2.1 常用命令4.2.2 命令的时间…

芯片行业震荡期,数字后端还可以入吗?

自去年开始,芯片行业仿佛进入了动荡期,经历了去年秋招和今年春招的小伙伴都知道,如今找工作有多难。 半导体行业人才缩减、各大厂裁员,在加上高校毕业生人数破千万,对于即将踏入IC这个行业的应届生来说,今…

文旅景区vr体验馆游乐场vr项目是什么

我们知道现在很多的景区或者游玩的地方,以及学校、科技馆、科普馆、商场或公园或街镇,都会建一些关于游玩以及科普学习的项目。从而增加学习氛围或者带动人流量等等。这样的形式,还是有很好的效果呈现。 普乐蛙VR体验馆案例 下面是普乐蛙做的…

单片机学习-蜂鸣器如何发出声音

硬件电路 软件编写 ①发出声音 #include "reg52.h" typedef unsigned int u16; // 重新定义 类型 typedef unsigned char u8; // 重新定义 类型sbit BEEP P2^5; //定义 P2第五个管教 为BEEP // 延时函数 void delay_time(u16 times) {while(times--); } vo…

UI位置与布局

UI位置与布局 引言 发现UGUI的RectTransform定位还是很复杂的,感觉有必要详细了解一下 RectTransform 继承自Transform。他的local position由其他几个变量控制。建议不要直接设置position 目的是为了实现UI自动布局。这套方法将绝对定位,相对定位&a…

CH02_重构的原则(什么是重构、为什么重构、何时重构)

什么是重构 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 重构(动词):使用一系列重构手法&#xff0…

VScode的PHP远程调试模式Xdebug

目录 第一步、安装VScode中相应插件 remote-ssh的原理 ssh插件: PHP相关插件: 第二步、安装对应PHP版本的xdebug 查看PHP具体配置信息的phpinfo页面 1、首先,打开php编辑器,新建一个php文件,例如:inde…

iOS App签名与重签名:从开发者证书到重新安装运行

前文回顾: iOS脱壳技术(二):深入探讨dumpdecrypted工具的高级使用方法 iOS逆向:越狱及相关概念的介绍 在本文中,我们将详细介绍iOS应用的签名过程,包括开发者证书的种类、证书与App ID、Provisi…

一种IDEA疑难杂症的解决办法

解决办法 重启IDEA 针对于IDEA各种解析,运行时问题,但是无法通过搜索引擎得到答案的问题请试试此方法。 删除根目录下[.idea]文件夹后重启 此文件夹为idea首次导入项目时根据项目情况自动生成的配置文件。方便idea下次更快的解析项目。但是某些情况&a…

用MFC打开外部程序

在MFC(Microsoft Foundation Classes)中,你可以使用ShellExecute函数来打开Notepad并加载指定的文件。ShellExecute函数是Windows API的一部分,它可以执行与操作系统相关的操作,例如打开文件、运行程序等。 以下是在M…

牛客练习赛 114

C.Kevin的七彩旗 思路:贪心和dp均可以解决。 贪心:我们可以发现,最终想要获得合法的序列,我们必须是通过把几段连续的序列拼凑起来,但序列之间可能有重合,因此我们就转化为了,记录每一段最大的…

【C++】4、Preprocessor 预处理:条件编译、源文件包含、宏替换、重定义行号、错误信息、编译器预留指令

文章目录 一、概述二、格式2.1 条件编译2.2 源文件包含2.3 宏替换2.3.1 语法2.3.2 C标准内置的预定义宏 2.4 重定义行号和文件名2.5 错误信息2.6 编译器预留指令 三、应用场景 C的 Build 可分为4个步骤:预处理、编译、汇编、链接。 预处理就是本文要详细说的宏替换…

基于Red Hat Enterprise Linux 7操作系统的PostgresSql15的备份恢复(实践笔记)

零、前言 本文是基于阿里云ECS服务器进行的实践操作,操作系统版本:Red Hat Enterprise Linux 7 PG数据库版本:PostgresSql 15 PG安装方式:yum 由于本人新接触pg数据,本次也是出于好奇,就对pg数据库的pg_du…

C#,《小白学程序》第五课:队列(Queue)

1 文本格式 /// <summary> /// 《小白学程序》第五课&#xff1a;队列&#xff08;Queue&#xff09; /// 日常生活中常见的排队&#xff0c;软件怎么体现呢&#xff1f; /// 排队的基本原则是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先进先出 /// </su…

深度学习8:详解生成对抗网络原理

目录 大纲 生成随机变量 可以伪随机生成均匀随机变量 随机变量表示为操作或过程的结果 逆变换方法 生成模型 我们试图生成非常复杂的随机变量…… …所以让我们使用神经网络的变换方法作为函数&#xff01; 生成匹配网络 培养生成模型 比较基于样本的两个概率分布 …

CSS 属性值计算过程

目录 例子1&#xff0c;确定声明值2&#xff0c;层叠冲突2.1&#xff0c;比较源重要性2.2&#xff0c;比较优先级2.3&#xff0c;比较源次序 3&#xff0c;使用继承4&#xff0c;使用默认值其他 例子 我们来举例说明<h1> 标签最终的样式&#xff1a; <div><h1…

记录一个诡异的bug

将对接oa跳转到会议转写的项目oa/meetingtranslate项目发布到天宫&#xff0c;结果跳转到successPage后报错 这一看就是successPage接口名没对上啊&#xff0c;查了一下代码&#xff0c;没问题啊。 小心起见&#xff0c;我就把successPage的方法请求方式从Post改为Get和POST都…