之前把自己开发的一个系统中的某个交易做了改造,使用了servlet 3.0的异步处理特性,将每个servlet线程内的业务逻辑改成了非阻塞式的,期望容器线程能够更快速的返回并充分利用处理更多的请求,从而得到更强的并发处理能力。但是测试的结果很不理想,同样的业务逻辑模块,采用新的异步调用之后的并发度甚至赶不上原来的传统方式(在一个servlet线程内处理业务逻辑并返回,属于阻塞式)。
InfoQ上的一位架构师的演讲中的一话提醒了我,是否对于目前的测试案例,瓶颈并不是在线程池,而是在CPU等其他系统资源呢?
测试的这个业务模块中包括有数据库调用,业务数据的计算,日志,以及xml解析返回等等,可能会造成其他系统资源的瓶颈,既然目的是测试异步调用对容器线程充分利用的优势,那么应该突出线程资源这个主要矛盾。
修改需要调用的业务模块,使之只是简单的实现一个返回html的功能,而在其中使用线程休眠等待几百毫秒来模拟业务执行(保证只是时间上的等待而不占用更多的系统资源)。调整服务器配置,减少容器线程池中线程数,使容器线程资源紧张暴露出来。
服务器配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="90" minSpareThreads="15" />
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
processorCache="2000"
acceptCount="100" URIEncoding="GBK" useBodyEncodingForURI="true"/>
Java代码:
传统方式:
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CommonProcessServlet extends HttpServlet{
/**
* 传统方式在同一个servlet线程内处理业务逻辑,处理完毕后返回,属于阻塞式。
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
out.println("<html>");
out.println("Hello,world!");
out.println("</html>");
}
}
servlet 3.0异步方式:
package servlets;
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AsyncProcessServlet extends HttpServlet{
/**
* 3.0异步调用在servlet线程内使用另一个异步线程来调用业务模块,容器线程直接返回,属于非阻塞式
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
AsyncContext ctx = request.startAsync();
new Thread(new Executor(ctx)).start();
}
}
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletResponse;
public class Executor implements Runnable{
private AsyncContext ctx;
public Executor(AsyncContext ctx){
this.ctx = ctx;
}
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
HttpServletResponse res = (HttpServletResponse)this.ctx.getResponse();
res.setContentType("text/html");
PrintWriter out = null;
try {
out = res.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
out.println("<html>");
out.println("Hello,World!");
out.println("</html>");
this.ctx.complete();
}
}
压力测试结果(见附件):
传统方式,700并发:失败0%
传统方式,800并发:失败2.5%
传统方式,1000并发:失败16%
3.0异步方式,900并发:失败0%
3.0异步方式,1000并发:失败0%
3.0异步方式,1100并发:失败0%
后记,对于性能调试而言,要具体应用甚至具体交易具体分析。不能说一定是异步方式要优于同步处理方式,异步方式优势在于其非阻塞式的处理能够更有效的利用容器线程,提供吞吐能力,但是其在业务处理的过程中多启用了更多的线程,从而加大了线程切换时CPU的开销,对于CPU消耗型的应用或交易而言,异步方式便不是一个好的解决方案。所以对于性能问题,要找到当前影响性能的主要瓶颈,针对具体的问题采用不同的解决方案。
- 大小: 33.9 KB
- 大小: 33.6 KB
- 大小: 35.4 KB
- 大小: 32.5 KB
- 大小: 35 KB
- 大小: 33.1 KB
分享到:
相关推荐
【Android性能优化】是Android开发中的重要环节,涵盖了多个关键领域,包括ANR问题解析、crash监控方案、启动速度与执行效率优化、内存优化、耗电优化、网络传输与数据存储优化以及APK大小优化。 **ANR问题解析**是...
具体内容包括:基于用户体验的性能优化要素、前端性能优化实战、网站性能分析、服务端性能优化、TCP优化、DNS优化、CDN优化、大型网站性能监控体系、大型网站容量评估、高性能系统架构模式、大促保障体系、数据分析...
性能优化的目的在于提升系统的容量,具体而言就是提升每秒查询量(QPS)、降低服务器响应时间(ServerRT)、降低服务器成本,以及提升用户体验。通过这些优化,可以降低响应时间、提升用户体验、增加转化率和交易量...
在性能优化时,不仅要关注单个组件的优化,还要考虑系统整体的平衡。例如,过度优化某个部分可能导致其他部分成为新的瓶颈。因此,优化策略应包括资源分配、负载均衡、并行处理、异步通信等多方面。 总结来说,...
本讲座主要由系统性能分析和优化专家童剑在2006年3月21日分享,旨在探讨如何通过理解和分析系统性能来提升系统效率。 首先,性能分析的主要目的是找出系统的性能瓶颈,无论是硬件还是软件层面,以便提出相应的优化...
分布式文件系统GlusterFS性能优化研究中涉及到的关键知识点包括分布式文件系统的基本概念、GlusterFS的架构特点、性能优化策略以及优化测试和实验平台的搭建和分析方法。 首先,分布式文件系统是一种把数据存储在多...
### Linux系统性能问题分析思路指引 #### 一、性能三要素及分析方法 在Linux系统中,当遇到性能问题时,通常需要从以下几个方面进行综合分析: 1. **I/O (Input/Output)**:I/O操作是导致系统性能瓶颈的一个常见...
- **确定问题**: 在进行性能优化之前,首先要明确是否存在真正的性能问题。可以通过监控工具收集数据来判断。 - **验证问题**: 使用性能测试工具对系统进行压力测试,以验证存在的问题是否真实影响到了用户体验。 - ...
7. **案例研究**:为了证明理论的应用性和有效性,论文可能选取了具体的企业或行业案例进行分析,展示了优化运输系统的过程和结果,为读者提供了实际操作的参考。 8. **结论与建议**:最后,论文会总结研究成果,...
以上只是《Linux性能优化实战》案例中涵盖的部分内容,实际操作中还需要结合具体系统环境和应用需求进行细致的分析和调整。优化不仅仅是追求极致性能,还要确保系统的稳定性和响应性,平衡各种资源的使用。
数据库层优化主要包括两个方面:实例性能优化和SQL语句性能优化。实例优化涉及内存配置、后台进程调整和初始化参数设置,以确保数据的高效读写和处理。SQL优化则侧重于通过分析SQL执行计划,识别慢查询并应用索引、...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其性能分析和优化是数据库管理员及开发者日常工作中至关重要的一环。本文将深入探讨MySQL性能分析的关键技术、优化策略以及如何进行调整。 一、性能分析 1....
### 性能优化基础知识 #### 一、性能与性能优化概览 在IT领域中,特别是在软件开发和系统管理方面,“性能”是一个极为关键的概念。根据给定文档中的标题“性能优化pdf(pdf格式ppt)”及描述“性能优化专题之什么...
综上所述,Linux性能优化涉及多个层面,从监控工具的选择到性能分析,再到具体调优策略的实施,都需要深入理解和实践经验。通过对这些知识点的掌握,IT专业人员可以更好地管理和优化Linux系统的性能,提升整体工作...