性能测试常见问题之线程溢出篇
上一篇 /
下一篇 2013-03-28 11:37:28
/ 个人分类:性能测试
做了某一个银行的J2EE项目的性能测试,中间件也采用WEBLOGIC,数据库为ORACLE,并且数据量不大,测试某一个功能在30左右并发时,TPS波动比较大,响应时间比同类型交易高出很多,TPS也要低很多,测试到100并发,运行10min左右,发现应用服务器中的CPU使用率由20%逐渐升到90%,TPS从20一直降到5个,但没有宕机,此时查看操作系统的物理内存,使用正常,其他资源包括JVM也使用正常,唯独应用服务器CPU使用率比较高,再检查数据库服务器,发现其资源使用率比较低,说明数据库基本没有压力,暂时排除数据库的问题。
使用jconsole监控WebLogic发现,线程从80一直增加到200多个,CPU也随着线程的增加,而不断往上涨,初步怀疑由于JAVA程序存在死锁或死循环引起的。
该交易包含了5个子交易,于是检查了相关代码,没有发现有死循环或者死锁的问题,于是在Loadrunner把脚本拆分成5个不同的请求,分别逐一进行测试,测试前面4个,均正常,最后一个交易是查询系统的公告信息,压了不到2分钟,问题就重现了,基本断定由于这个子功能引起的问题,找到了某一段Action的代码,发现:
@Action(value = "ajaxQueryNoticeAll", results = { @Result(name = "success", type = "json") })
public class XxxAction extends XBaseAction{
public String execute() throws Exception {
try{SessionObject sessionObject = (SessionObject) this.getSessionObject();
QueryResultVO result = new QueryResultVO();
result = noticeServiceImpl.forQueryNoticeAll(sessionObject.getUserVO(),pageNo, SysConstants.APP_PAGE_SIZE);
pubNotice = result.getResultList();totalPage=result.getTotalPage();totalNo=result.getTotalNo(
if (!pubNotice.isEmpty())
{return SUCCESS;}
else
{return INPUT;}
}
}
以上代码在结果return SUCCESS的时候进行后续处理,而返回INPUT时,却未定义该返回结果的处理方式,导致处理该请求的线程处于等待,无法回收,随着请求数的增加,系统只能通过不断创建新的线程处理新的请求,创建线程需要消耗大量的CPU资源,直至CPU接近100%,最终导致线程溢出。
收藏
举报
TAG: