servlet 3.0异步处理并发测试的疑问
好吧,写这篇文章是为求教。
行里要上线的一个信用卡积分兑换网站已经开发完毕了,由于我们行的信用卡用户不多大约15000左右,所以给定的系统并发要求是300即可。这个通过编写并发测试案例,已经达到要求。
但闲来无事,能不能在现有硬件以及架构的情况下,进一步提供系统的并发能力呢?
之前关注过servlet3.0的异步处理特性。所以我针对系统中的一个核心的交易做了异步调用的改写,通过与原有的写法做并发测试对比,结果。。。
不使用新特性,直接用原来的一个线程内处理业务逻辑的方式,最大并发能达到900+
采用新的异步特性后,最大并发只能达到700+
我的测试环境:
OS: win 7
CPU i5 4core
内存:4G
服务器:直接在tomcat 7上测试,没有使用apache
测试工具:JMeter
测试交易:单笔兑换交易
tomcat参数设置:
Java代码:
未采用servlet3.0特性,同步处理public class PointsExchangeAction extends Action{public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {AsyncContext context = request.startAsync();context.setTimeout(20000);new Thread(new PointsExchangeExecutor(context)).start();return null;}}public abstract class Executor implements Runnable{private AsyncContext asyncCtx = null;public Executor(AsyncContext ctx){this.asyncCtx = ctx;}@Overridepublic void run() {try{execute((HttpServletRequest)asyncCtx.getRequest(),(HttpServletResponse)asyncCtx.getResponse());asyncCtx.complete();}catch(Exception e){e.printStackTrace();}}public abstract void execute(HttpServletRequest req,HttpServletResponse res);}public class PointsExchangeExecutor extends Executor{public PointsExchangeExecutor(AsyncContext ctx){super(ctx);}@Overridepublic void execute(HttpServletRequest req, HttpServletResponse res) { //这里做了一些业务逻辑,包括连接数据库调用存储过程,日志,向前台返回xml格式的数据等。 }}
附件中是两种方式做并发测试结果的截图
后记:这个问题找到了原因,下面文章中会分析。http://grayrabbit.iteye.com/blog/1422684