最近做的项目系统即将上线,一直在搞性能压力测试。由于WAS7 也是第一次在项目上使用,发现了不少问题,也积累了一些经验。下面就发现的一些问题做一些总结。
首先环境描述:
操作系统: RHEL 5.5
应用服务器: WAS 7ND + IHS7
数据库:Orcale 11g RAC
应用服务器 3台机器,一台运行IHS,并当文件服务器运行。 另外2台 WAS7 集群,每台机器3个Server 。2台数据库服务器集群。
先说一下压力测试的几个测试重点和其中发现的问题:
1、用户并发登录测试
用户并发登录测试,项目要求达到的最低要求是200的并发登录。 我们自己的预想的要求是每个单节点最少并发50,集群环境并发300左右。并能够持续承受压力8小时。
这个地方的压力测试出了非常低级、
搞笑的错误,导致压力测试结果非常不理想。现象就是单节点压力测试,50并发,基本上半个小时后就内存溢出,然后宕机。 LoudRunner 显示的成功完成事务数量是12000次左右。 这个问题查了很久,也找了IBM的服务,花了1个多星期的时间,最后分析了内存溢出的dump文件,才发现导致内存溢出的是因为session对象太多,占用了系统大量内存。
后来问测试人员,压力测试的脚本是怎么录的,才发现原来压力测试的时候,只录入了登录,没有录入退出。这种测试脚本一运行,就会不断的在WAS服务器上产生session以及应用
系统中缓存在session中的对象,不点退出session 释放不了,内存无法回收,结果导致怎么压都是死。修改测试脚本,加上退出的动作之后,重新测试,结果就比较理想了,没再出过内存溢出的问题。
呜呼哀哉。。。 希望压力测试的时候,测试人员以后别犯这种低级错误了。真是浪费人力。不过话说回来,我们的平台框架在
设计的时候应该也是有点问题的。因为在session中存入了大量的对象,这肯定会限制单个节点的最大用户在线数量。就目前的压力测试情况来看,如果系统有12000个用户在线的话,系统就死翘翘了。
这个就是属于登录平台的
问题,不是简单可以解决的。
2、工作流业务提交并发测试
工作流的测试也分为2块,单节点的流程提交和集群环境下的流程数据提交。单点测试50并发,基本上通过测试。
但是集群环境下就出现了问题。压力测试到一定时间之后,在后台就会出现线程挂起的异常。从而导致WAS的某个节点宕机,最终也会导致IHS也死掉。
下面是出错日志摘要:
IHS error.log :
[Thu Oct 20 10:58:24 2011] [notice] mpmstats: reached MaxClients (4000/4000)
[Thu Oct 20 10:58:24 2011] [notice] mpmstats: rdy 0 bsy 4000 rd 0 wr 4000 ka 0 log 0 dns 0 cls 0
[Thu Oct 20 10:59:54 2011] [notice] mpmstats: reached Max
Clients (4000/4000)
[Thu Oct 20 10:59:54 2011] [notice] mpmstats: rdy 0 bsy 4000 rd 0 wr 4000 ka 0 log 0 dns 0 cls 0
[Thu Oct 20 11:01:24 2011] [notice] mpmstats: reached MaxClients (4000/4000)
[Thu Oct 20 11:01:24 2011] [notice] mpmstats: rdy 0 bsy 4000 rd 0 wr 4000 ka 0 log 0 dns 0 cls 0
[Thu Oct 20 11:02:54 2011] [notice] mpmstats: reached MaxClients (4000/4000)
[Thu Oct 20 11:02:54 2011] [notice] mpmstats: rdy 0 bsy 4000 rd 0 wr 4000 ka 0 log 0 dns 0 cls 0
其中最明显的错误就是: mpmstats: reached MaxClients 这段了。 表示IHS的已经达到最大连接数,无法接受新的请求。 而且即使停掉压力测试,连接也无法释放。最后只能重启IHS。
对应WAS后台,一般只有一个节点出现线程挂起的异常。SystemOut.log 日志如下:
[11-10-21 3:28:12:760 CST] 000001f1 ThreadMonitor W WSVR0605W: 线程“WebContainer : 662”(000002f4)已保持活动状态 621688 毫秒,此线程可能已挂起。在服务器中共有 177 个线程可能处于挂起状态。
at java.util.Collections$SynchronizedSet.hashCode(Collections.java:835)
at com.ib