第一篇:(总结)Web性能压力测试工具之ApacheBench(ab)详解
PS:网站性能压力测试是性能调优过程中必不可少的一环。只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题。Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网站访问压力测试。ApacheBench命令原理:
ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。ab命令对发出负载的计算机要求很低,既不会占用很高CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也须注意,否则一次上太多的负载,可能造成目标服务器因资源耗完,严重时甚至导致死机。ApacheBench参数说明
格式:ab [options] [http://]hostname[:port]/path 参数说明:
-n requests Number of requests to perform //在测试会话中所执行的请求个数(本次测试总共要访问页面的次数)。默认时,仅执行一个请求。
-c concurrency Number of multiple requests to make //一次产生的请求个数(并发数)。默认是一次一个。-t timelimit Seconds to max.wait for responses //测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。-p postfile File containing data to POST //包含了需要POST的数据的文件,文件格式如“p1=1&p2=2”.使用方法是-p 111.txt。(配合-T)
-T content-type Content-type header for POSTing //POST数据所使用的Content-type头信息,如-T “application/x-transferred: 203479961 bytes #整个过程中的HTML内容传输量
Requests per second: 337.67 [#/sec](mean)#最重要的指标之一,相当于LR中的每秒事务数,后面括号中的mean表示这是一个平均值
Time per request: 2961.449 [ms](mean)#最重要的指标之二,相当于LR中的平均事务响应时间,后面括号中的mean表示这是一个平均值
Time per request: 2.961 [ms](mean, across all concurrent requests)#每个连接请求实际运行时间的平均值
Transfer rate: 16866.07 [Kbytes/sec] received #平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Connection Times(ms)min mean[+/-sd] median max Connect: 0 483 1773.5 11 9052 Processing: 2 556 1459.1 255 11763 Waiting: 1 515 1459.8 220 11756 Total: 139 1039 2296.6 275 11843 #网络上消耗的时间的分解,各项数据的具体算法还不是很清楚 Percentage of the requests served within a certain time(ms)50% 275 66% 298 75% 328 80% 373 90% 3260 95% 9075 98% 9267 99% 11713 100% 11843(longest request)#整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于275毫秒,66%的用户响应时间小于298毫秒,最大的响应时间小于11843毫秒。对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数。总结:在远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大),建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。如果只有单独的一台服务器,可以直接本地测试,比远程测试效果要准确。
Apache下载
进入apache服务器官网http://httpd.apache.org/,这里我们以下载稳定版的
httpd 2.2.29为例,点击download。 2 由于官方网页改版,以前的方式可能五法进行下载,为了不浪费大家的时间,特此修正2015-01-24 第一步依旧是点击download 3 点击链接Files for Microsoft Windows 步骤阅读 4 The Apache HTTP Server Project itself does not provide binary releases of software, only source code.Inpidual committers may provide binary packages as a convenience, but it is not a release deliverable.If you cannot compile the Apache HTTP Server yourself, you can obtain a binary package from numerous binary distributions available on the Internet.Popular options for deploying Apache httpd, and, optionally, PHP and MySQL, on Microsoft Windows, include: ApacheHaus Apache Lounge BitNami WAMP Stack WampServer XAMPP 大致意思是说apache本身不提供已编译的安装包,只提供源码,如果你自己无法编译,可以选择下面这些官方推荐的第三方提供编译的网站。
其中后两个是有名的wamp以及xampp集成环境,如果只想下载apache可以选择前三个网站,这里我们第一个ApacheHaus为例。 5 打开ApacheHaus之后你会发现这个网站上有各种windows版本,可以尽情选择你要下载的版本。 6 点击红框中的图标即可开始下载,x86是32位的,x64是64位的,根据自己的操作系统选择下载
Apache安装
2 打开ApacheHaus之后你会发现这里有许多的windows版的Apache版本 这里简单的介绍一下:x86代表32位,x64代表64位。根据自己安装的系统选择
关于vc9与vc11,这里的选择要跟PHP对应才能稳定的运行。(按照PHP官方提供的资源来看,PHP 5.5以后的版本官方只提供了VC11版本的产品程序,PHP5.3/5.4版还有VC9版本的产品程序) 3 注意建立好自己的文件存放方式,方便以后管理
下 载完毕后解压,将解压的 Apache24文件夹复制到自己的项目目录里面。你的项目根目录为E:/wamp/Apache24/htdocs即DocumentRoot的定义。如果想放到其他目录下,需要修改httpd.conf,包括ServerRoot、DocumentRoot、Directories,ScriptAlias。需要改为你的Apache目录的地址。 4 因为这里我们下载的是官方源码包,所以需要把Apache服务安装到我们的计算机上面
开启控制台:win+R 输入cmd 命令行下进入到apache下面的bin目录,输入
httpd-k install 把apache安装成windows后台服务。 5 所有基本的命令都可以在Apache官网上找到,下面是一些常用的命令 6 最后使用ApacheMonitor来管理apache服务器 访问测试是否成功
对大家遇到的一些问题做下简单总结
1、由于apache默认是监听80端口,如果你的电脑iis是启动状态,并且也使用了80端口,apache将无法正常启动,需要先停止iis,另外迅雷也可能会使用80端口,所以也要关闭迅雷。查看80端口是否被占用,命令行下输入: netstat-aon|findstr “80” 如果看到如图的结果,说明80端口已被使用,需要先关闭相关软件,或者修改apache默认的监听端口
打开apache目录下的conf/httpd.conf 搜索 “Listen 80” 修改为Listen 8088 保存之后再重新启动apache
2、httpd-k install 输入该命令后查看服务是否安装成功 开始-->运行-->services.msc-->确定
打开后如果在服务列表能够看到apache字样,说明,服务安装成功,可以直接点击左边的启动按钮来启动服务 13
3、服务无法正常安装,首先确定软件32位和64位是否和自己的系统匹配 其 次,看电脑有没有安装软件相应的运行包,比如你下载的是VC9版本,那么你需要先安装Microsoft Visual C++ 2008 Redistributable,同理VC11版本你需要安装Microsoft Visual C++ 2012 Update 4 Redistributable Package(X86 & x64)在ApacheHaus网站的最底部提供了相应的Visual Studio Redistributable Packages下载链接
第二篇:Web测试工具小结
Web测试工具小结
单元测试方面:(对开发人员比较有用)J-Unit工具。
功能测试方面:E-test是个不错的选择,功能很强大,由于不是采用Post URL的方式回放脚本,所以可以支持多内码的测试数据(当然要程序支持)。基本上可以应付大部分的Web Site。
如果只是利用脚本回放代替手工劳动,或者做对页面响应数的性能测试,Microsoft Web Application Stress Tool是个不错的选择。
另外,在性能测试方面,PureLoad也是一个不错的工具,完全用Java写成,可以测试各种C/S程序,如SMTP Server等。这两个工具都是使用Post URL的方法测试Web Application的。对大量使用JavaScript的页面不太适合。当然,如果程序在Unix,linux下面运行的话,可以直接编写Shell脚本程序,更加方便。
另外,还有很多专门的工具,比如说Linkbot是专门作页面链接测试的。
另外,测试流程管理工具也有不少,个人用过也一直在用的是Test Plan Control,短小精悍,不错。
至于WinRunner和LoadRunner之类,因为没有License,所以都没怎么用过,惭愧。不过我看过一篇英国人评价英国测试市场上最流行的五个软件的文章。WinRunner得分最高。
测试工具从测试的方法上可以分为两种:白盒测试和黑盒测试
白盒测试工具主要有:
内存资源泄漏检查:Numega中的bouncechecker,Rational的Purify等
代码覆盖率检查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope, Macabe公司的Macabe等
代码性能检查:Numega中的truetime,Rational的Quantify等
代码静态度量分析质量检查工具:logiscope和Macabe等
黑盒测试工具主要有:
客户端功能测试:MI公司的winrunner,compuware的qarun,Rational的SQA robot等等
服务器端压力性能测试: MI公司的winload,compuware的qaload,Rational的SQA load等等
Web测试工具:MI公司的Astra系列,rsw公司的e-test suite等等
测试管理工具:rational的test manager,compuware的qadirector等等,此外还有缺陷跟踪工具 trackrecord等。
数据库测试工具:TestBytes
黑盒测试工具:QACenter、SQATeamTest,Rational Viaual Test。
回归测试工具:Rational TeamTest,WinRunner(MI公司)
WEB系统测试工具:TEST,Workberch,Web Appication Stress Tool(WAS)
白盒测试工具:Numega、PuRe、软件纠错工具(Rational Purity)。
嵌入式测试工具:Logiscope(静态测试工具)、CodeTest。
系统负荷测试工具:RationalPerformance
涵盖测试工具范围评估工具
软件性能测试工具:LoadRunner(MI产品)、Rational Visual Qantify
测试管理工具:TestDirector(MI产品支持整个生命周期中测试流程管理)
第三篇:WEB测试总结
WEB测试总结(架构,设计)精华部分
1、总计架构测试
1)瘦客户端,业务逻辑规则多数在服务器端执行。如新闻站点、门户网站、信息发布网站等。
2)胖客户端,安全性要求较高、交互操作频繁、业务逻辑复杂。银行系统、网络游戏、网上办公系统等。
2、Web架构组成部分是否满足需求
成本、功能、安全性要求、容量要求、传输实时性。
3、服务器配置分布是否满足要求
Web服务器、应用服务器、数据库服务器可以分布在不同物理机器上也可以分布相同的物理机器上,一般优先考虑独立数据库服务器,Web服务器、应用服务器可以在相同的机器上。
4、客户端设计测试
1)功能设置测试:信息服务、办公自动化、Internet支持; 2)信息组织结构测试:线性结构、分层结构、非线性结构; 3)页面设计测试:a.页面一致性测试
b.用户界面友好性及导航直观性测试;、c.是否适合多种浏览器; d.页文件的命名; e.页面布局技术。
5、服务器端设计测试
1)容量规划测试:点击率、延迟和流量、服务器资源;
2)系统安全测试:a.常识性安全策略,取消不必要的协议、控制写权限、取消服务器目录浏览属性、记录日志等; b.使用加密技术;
c.构造防火墙,网络级、应用级、电路级; d.构建网络防毒体系。3)数据库设计测试。
6、Web开发测试
1)源代码分析,主要是使用检查工具来完成; 2)链接测试,主要借助工具来完成; 3)框架测试:a.自动调整窗口大小; b.是否提供滚动条;
c.打开新页面是否正常。4)表格测试,随窗体变化自动调整大小; 5)图形测试:a.颜色饱和度及对比度; b.链接标识;
c.图形显示是否正确。
1、与一般应用软件相比,Web测试有以下区别:
第一、Web测试的侧重点是性能、安全、易用性、兼容
第二、测试工具有所不同,如链接测试、表单测试、界面测试
2、功能测试
一、客户端的选择,优先测试流行的客户客户端;
二、客户端浏览器的配置
三、客户端的显示设置
四、内容测试
3、链接测试
一、该链接将用户带到它所说明的地方
二、被链接的页面是存在的
三、保证没有孤立页面
工具有WEBCHECK、LINKBOT、TESTPARTNER、XENU等
4、链接测试工具的优势:
一、简单易用
二、在实现上采用多线程技术,检查速度特别快;
三、对断开的链接可以再次测试,可以避免误判;
四、没有检查链接的数量限制,只受系统资源的约束;
五、可以分析Web应用的结构;
六、检查结果可以分类查看,自动生成HTML格式的报告;
5、Web应用链接主要测试点如下
一、测试内部链接和外部链接中成功和失败的链接点,以及应用中不被其他链接调用的页面;
二、测试链接中新网页、老网页、慢网页以及丢失的图象标题标签和属性标签等;
三、分析Web应用的结构是否合理,包括显示和某个URL相关的链接以及按照标题、描述、作者、大小、最后修改时间、类型为URL链接分类等。
6、易用性测试
易用性测试要考虑以下几个方面: 1)用户的计算机使用经验;
2)用户对浏览器以及Web的使用经验; 3)用户的业务专业知识。
7、Web系统的易用性测试分为三个方面: 1)界面测试
2)辅助功能测试 3)图形测试
一、界面测试要考虑以下几个问题 A.WEB应用系统的最终用户群是谁? B.WEB应用界面的设计策略是什么? C.页面中各元素布局的协调性 a.各元素位置的协调性 b.各元素颜色的协调性
c.各元素大小比例的协调性 D.不同页面风格的统一性
E.用户在界面中操作的便利性 F.界面动态操作测试
a.屏幕分辩率设置的影响
b.浏览窗口最大化/最小化的影响 c.选定目标元素的置中与缩放
二、辅助功能测试 A.使用说明,这个没有多大意义,WEB网页按F1弹出来的页面都是IE的帮助页面,除非有特定的帮助说明内容; B.导航功能 C.站点地图
D.帮助,这个没有多大意义,WEB网页按F1弹出来的页面都是IE的帮助页面,除非有特定的帮助说明内容;
第四篇:服务器性能测试典型工具介绍
服务器整机系统性能测试工具
一台服务器系统的性能可以按照处理器、内存、存储、网络几部分来划分,而针对不同的应用,可能会对某些部分的性能要求高一些。
Iometer(www.teniu.cc):存储子系统读写性能测试
Iometer是Windows系统下对存储子系统的读写性能进行测试的软件。可以显示磁盘系统的最大IO能力、磁盘系统的最大吞吐量、CPU使用率、错误信息等。用户可以通过设置不同的测试的参数,有存取类型(如sequential ,random)、读写块大小(如64K、256K),队列深度等,来模拟实际应用的读写环境进行测试。
Iometer操作简单,可以录制测试脚本,可以准确有效的反映存储系统的读写性能,为各大服务器和存储厂商所广泛采用。
Sisoft Sandra(www.teniu.cc):linux下I/O性能测试
现在有很多的服务器系统都是采用linux操作系统,在linux平台下测试I/O性能可以采用iozone。
iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread ,mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。测试所有这些方面,生成excel文件,另外, iozone还附带了用gnuplot画图的脚本。该软件用在大规模机群系统上测试NFS的性能,更加具有说服力。
Netperf(www.teniu.cc):网络性能测试
Netperf可以测试服务器网络性能,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。
Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是 netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。
针对应用的测试工具
系统的负载和压力需要采用负载测试工具进行,虚拟一定数量的用户来测试系统的表现,看是否满足预期的设计指标要求。负载测试的目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等如何决定系统的性能,例如稳定性和响应等。
负载测试一般使用工具完成,有LoadRunner,Webload,QALoad等,主要的内容都是编写出测试脚本,脚本中一般包括用户常用的功能,然后运行,得出报告。
使用压力测试工具对web服务器进行压力测试。测试可以帮助找到一些大型的问题,如死机、崩损、内存泄漏等,因为有些存在内存泄漏问题的程序,在运行一两次时可能不会出现问题,但是如果运行了成千上万次,内存泄漏得越来越多,就会导致系统崩滑。
Loadrunner:预测系统行为和性能的负载测试工具
目前,业界中有不少能够做性能和压力测试的工具,Mercury(美科利)Interactive公司的LoadRunner是其中的佼佼者,也已经成为了行业的规范,目前最新的版本8.1。
LoadRunner 是一种预测系统行为和性能的负载测试工具,通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试,LoadRunner 适用于各种体系架构,能支持广范的协议和技术(如Web、Ftp、Database等),能预测系统行为并优化系统性能。它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。Loadrunner是一个强大有力的压力测试工具,它的脚本可以录制生成,自动关联。测试场景面向指标,实现了多方监控。而且测试结果采用图表显示,可以自由拆分组合。一般来说可以按照服务器硬件、网络、应用程序、操作系统、中间件的顺序进行分析。
Webload:WEB性能压力测试
webload是RadView公司推出的一个性能测试和分析工具,它让web应用程序开发者自动执行压力测试;webload通过模拟真实用户的操作,生成压力负载来测试web的性能。
用户创建的是基于javascript的测试脚本,称为议程agenda,用它来模拟客户的行为,通过执行该脚本来衡量web应用程序在真实环境下的性能。当前最高版本是6.0。webload提供巡航控制器cruise control的功能,利用巡航控制器,可以预定义web应用程序应该满足的性能指标,然后测试系统是否满足这些需求指标;cruise control能够自动把负载加到web应用程序,并将在此负荷下能够访问程序的客户数量生成报告。
webload能够在测试会话执行期间对监测的系统性能生成实时的报告,这些测试结果通过一个易读的图形界面显示出来,并可以导出到excel和其他文件里。
第五篇:性能测试总结之内存泄露和内存溢出
性能测试总结之内存泄露和内存溢出
主要从以下几部分来说明,关于内存和内存泄露、溢出的概念,区分内存泄露和内存溢出;内存的区域划分,了解GC回收机制;重点关注如何去监控和发现内存问题;此外分析出问题还要如何解决内存问题。
下面就开始本篇的内容:
第一部分 概念
众所周知,java中的内存java虚拟机自己去管理的,他不想C++需要自己去释放。笼统地去 讲,java的内存分配分为两个部分,一个是数据堆,一个是栈。程序在运行的时候一般分配数据堆,把局部的临时的变量都放进去,生命周期和进程有关系。但 是如果程序员声明了static的变量,就直接在栈中运行的,进程销毁了,不一定会销毁static变量。
另外为了保证java内存不会溢出,java中有垃圾回收机制。System.gc()即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。
而其中,内存溢出就是你要求分配的java虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越 多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。
第二部分 原理
JAVA垃圾回收及对内存区划分
在Java虚拟机规范中,提及了如下几种类型的内存空间:
◇ 栈内存(Stack):每个线程私有的。
◇ 堆内存(Heap):所有线程公用的。
◇ 方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。
◇ 原生方法栈(Native Method Stack):主要用于JNI中的原生代码,平时很少涉及。
而Java的使用的是堆内存,java堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,“垃圾回收”也是主要是和堆内存(Heap)有关。
垃圾回收的概念就是JAVA虚拟机(JVM)回收那些不再被引用的对象内存的过程。一般我们认为正在被引用的对象状态为“alive”,而没有 被应用或者取不到引用属性的对象状态为“dead”。垃圾回收是一个释放处于”dead”状态的对象的内存的过程。而垃圾回收的规则和算法被动态的作用于 应用运行当中,自动回收。
JVM的垃圾回收器采用的是一种分代(generational)回收策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍,这种策略有利于实时观察和回收。
(Sun JVM 1.3 有两种最基本的内存收集方式:一种称为copying或scavenge,将所有仍然生存的对象搬到另外一块内存后,整块内存就可回收。这种方法有效率,但需要有一定的空闲内存,拷贝也有开销。这种方法用于minor collection。另外一种称为mark-compact,将活着的对象标记出来,然后搬迁到一起连成大块的内存,其他内存就可以回收了。这种方法不 需要占用额外的空间,但速度相对慢一些。这种方法用于major collection.)
一些对象被创建出来只是拥有短暂的生命周期,比如 iterators 和本地变量。
另外一些对象被创建是拥有很长的生命周期,比如 高持久化对象等。
垃圾回收器的分代策略是把内存区划分为几个代,然后为每个代分配一到多个内存区块。当其中一个代用完了分配给他的内存后,JVM会在分配的内存 区内执行一个局部的GC(也可以叫minor collection)操作,为了回收处于“dead”状态的对象所占用的内存。局部GC通常要不Full GC要快很多。
JVM定义了两个代,年轻代(yong generation)(有时称为“nursery”托儿所)和老年代(old generation)。年轻代包括 “Eden space(伊甸园)”和两个“survivor spaces”。虚拟内存初始化的时候会把所有对象都分配到 Eden space,并且大部分对象也会在该区域被释放。当进行 minor GC的时候,VM会把剩下的没有释放的对象从Eden space移动到其中一个survivor spaces当中。此外,VM也会把那些长期存活在survivor spaces 里的对象移动到 老生代的“tenured” space中。当 tenured generation 被填满后,就会产生Full GC,Full GC会相对比较慢因为回收的内容包括了所有的 live状态的对象。pemanet generation这个代包括了所有java虚拟机自身使用的相对比较稳定的数据对象,比如类和对象方法等。
关于代的划分,可以从下图中获得一个概况:
如果垃圾回收器影响了系统的性能,或者成为系统的瓶颈,你可以通过自定义各个代的大小来优化它的性能。使用JConsole,可以方便的查看到当前应用所配置的垃圾回收器的各个参数。想要获得更详细的参数,可以参考以下调优介绍:
Tuning Garbage collection with the 5.0 HotSpot VM
http://java.sun.com/docs/hotspot/gc/index.html
最后,总结一下各区内存:
Eden Space(heap): 内存最初从这个线程池分配给大部分对象。
Survivor Space(heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation(heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。
Permanent Generation(non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,Code Cache(non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)
第三部分 监控(工具发现问题)
谈到内存监控工具,JConsole是必须要介绍的,它是一个用JAVA写的GUI程序,用来监控 VM,并可监控远程的VM,易用且功能强大。具体可监控JAVA内存、JAVA CPU使用率、线程执行情况、加载类概况等,Jconsole需要在JVM参数中配置端口才能使用。
由于是GUI程序,界面可视化,这里就不做详细介绍,具体帮助支持文档请参阅性能测试JConsole使用方法总结:
http://
http://Java.sun.com/javase/6/docs/technotes/tools/share/jconsole.html
在实际测试某一个项目时,内存出现泄露现象。起初在性能测试的1个小时中,并不明显,而在稳定性测试的时候才发现,应用的HSF调用在经过几个 小时运行后,就出现性能明显下降的情况。在服务日志中报大量HSF超时,但所调用系统没有任何超时日志,并且压力应用的load都很低。经过查看日志后,认为应用可能存在内存泄漏。通过jconsole 以及 jmap 工具进行分析发现,确实存在内存泄漏问题,其中PS Old Gen最终达到占用 100%的占用。如图所示:
从上图可以看到,虽然每次Full GC,JVM内存会有部分回收,但回收并不彻底,不可回收的内存对象会越来越多,这样便会出现以上的一个趋势。在Full GC无法回收的对象越来越多时,最终已使用内存达到系统分配的内存最大值,系统最后无内存可分配,最终down机。
第四部分 分析
经过开发和架构师对应用的分析,查看此时内存队列,看哪个对象占用数据最多,再利用jmap命令,对线程数据分析,如下所示:
num #instances #bytes class name
1: 9248056 665860032 com.taobao.matrix.mc.domain.**
2: 9248031 295936992 com.taobao.matrix.**
3: 9248068 147969088 java.util.**
4: 1542111 37010664 java.util.Date
前三个instances不断增加,指代的是同一个代码逻辑,异步分发的问题,堵塞消息,回收多次都无法回收成功。导致内存溢出。
此外,对应用的性能单独做了压测,他的性能只能支撑到一半左右,故发送消息的TPS,应用肯定无法处理过来,导致消息堆积,而JAVA垃圾回收期认为这些都是有用的对象,导致内存堆积,直至系统崩溃。
调优方法
由于具体调优方法涉及到应用的配置信息,故在此暂不列出,可以参考性能测试小组发布的《性能测试调优宝典》
第四部分 总结
内存溢出主要是由于代码编写时对某些方法、类应用不合理,或者没有预估到临时对象会占用很大内存量,或者把过多的数据放入JVM缓存,或者性能 压力大导致消息堆积而占用内存,以至于在性能测试时,生成庞大数量的临时对象,GC时没有做出有效回收甚至根本就不能回收,造成内存空间不足,内存溢出。
如果编码之前,对内存使用量进行预估,对放在内存中的数据进行评估,保证有用的信息尽快释放,无用的信息能够被GC回收,这样在一定程度上是可以避免内存溢出问题的。