性能测试常见问题之线程溢出篇

上一篇 / 下一篇  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:

 

评分:0

我来说两句

Open Toolbar