记一次tomcat web应用压测调优

本文记录了一次针对tomcat web应用的性能调优过程,包括解决CLOSE_WAIT连接问题、调整线程池配置、优化GC策略、处理session溢出以及分析CPU瓶颈等,最终稳定了压测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

该tomcat web应用承担集团登录注册页面功能,对性能有一定要求,由于先前没有太多相关经验(只压测过一个dubbo服务),这次调得比较艰辛,便做个记录。

2. 调优过程

由于该次部署是两个不同团队的初次合作,起初没有给运维任何tomcat配置要求,同时也没留意去确认tomcat配置,这个导致了后续压测过程各种诡异的问题。

a.在压测初期,持续请求10分钟左右出现无请求进来,netstat查看的tomcat所在服务器存在大量CLOSE_WAIT的连接。
CLOSE_WAIT的连接一般是自己程序中缺少关闭连接等引起,但是查看程序也没发现哪里没有关闭,而且大多CLOSE_WAIT是与浏览器端的http协议下的tcp连接。后经运维排查是centos自身的BUG引起,升级到centos-release-6-6.el6.centos.12.2.x86_64后解决。

其中对于CLOSE_WAIT和TIME_WAIT的TCP连接起初一直不太理解是怎么出现,怎么解决,后查看TCP四次挥手断开连接了解了整个过程。
TCP四次挥手
比如客户端应用程序发起CLOSE信息,服务端接收到后进入CLOSE_WAIT状态并做ACK,之后服务端程序发起CLOSE信息,客户端接收到之后进入TIME_WAIT,服务端收到客户端的ACK之后进入CLOSED状态,客户端TIME_WAIT需要等待到超时才进入CLOSED状态。

基于此,服务器端出现大量CLOSE_WAIT不是一个正常的状态,首先需要确认CLOSE_WAIT状态对方的IP,再查看这个IP对应的代码是否缺少关闭连接。
但是如果出现大量TIME_WAIT,不是太要紧,只要不占满句柄就行,如果真的占满了可以尝试修改内核TCP超时时间和TCP的TIME_WAIT重用。

b.然后压测500个并发出现connection timeout和read timeout,这种情况基本是在请求数超过了配置的最大值,一开始找运维排除nginx和vm的限流,然后再查看tomcat的限制,发现tomcat未配置最大线程数,默认情况最大线程数是200,最大等待队列100,然后修改tomcat的server.xml配置

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"</
<think>嗯,用户想了解主流J2EE应用服务器的配置方法和性能技巧,特别是WebLogic、JBoss和Tomcat。首先,我需要回忆一下这些应用服务器的基本区别和各自的特性。根据引用内容,Tomcat主要支持Servlet和JSP,而JBoss和WebLogic是功能更全的应用服务器,支持EJB等J2EE特性。 接下来,配置方法方面,可能需要分每个服务器来说。比如Tomcat的配置通常涉及server.xml和web.xml,整线程池、连接器参数。而JBoss和WebLogic可能有更复杂的配置,比如子系统设置和集群配置。的话,内存管理、线程池整、缓存机制都是关键点。引用里提到JBoss和Tomcat集成可以实现全部J2EE功能,这可能涉及到集群配置,如引用3中提到的群集技术对扩展性的重要性。 然后,性能需要考虑JVM参数,比如堆大小、垃圾回收策略。WebLogic可能有自己的工具,JBoss的子系统化,比如EJB池大小。Tomcat作为轻量级服务器,可能需要化连接器参数,比如maxThreads和acceptCount。另外,缓存策略也很重要,比如静态资源缓存和会话复制。 用户可能还希望知道具体的最佳实践,比如如何监控服务器性能,使用哪些工具,或者常见的配置错误。需要确保每个服务器的方法分开说明,同时比较它们的异同。比如引用2提到Tomcat与JBoss集成,这可能是一个化方案,而引用4的比较分析可能提供更多细节。 还要注意引用来源的可信度,比如引用4是转载的博客,可能需要谨慎处理。但其他引用如1、2、3看起来来自技术分析文章,比较可靠。最后,生成的相关问题要围绕配置、、监控和比较,帮助用户深入理解。</think>### 主流 J2EE 应用服务器配置与实践 #### 一、WebLogic 配置与 1. **核心配置** - **内存分配**:通过修改 `setDomainEnv.sh`(Linux)或 `setDomainEnv.cmd`(Windows)整 JVM 堆大小,例如: ```bash -Xms4096m -Xmx8192m -XX:MaxPermSize=2048m ``` - **线程池化**:在管理控制台中整“执行线程数”(默认 16),根据并发量设置 `MaxThreads` 和 `MinThreads`,避免线程竞争[^3]。 - **数据源连接池**:配置 `Initial Capacity` 和 `Max Capacity`,启用连接泄漏检(`Test Connections on Reserve`)。 2. **性能** - **启用集群**:通过横向扩展提升负载能力,配置会话复制(如内存复制或数据库持久化)。 - **缓存化**:启用 `WebLogic 二级缓存`,整 `Cache Size` 和 `Cache Timeout`。 - **垃圾回收策略**:使用 G1 或 CMS 垃圾收集器,减少 Full GC 频率。 --- #### 二、JBoss 配置与 1. **核心配置** - **子系统化**:在 `standalone.xml` 中整 `web` 子系统的 `max-connections` 和 `worker线程池`。 - **内存管理**:修改 `standalone.conf` 设置堆内存,例如: ```bash -Xmx4g -XX:MetaspaceSize=256m ``` - **EJB 池配置**:整 `ejb3` 子系统的 `max-pool-size`,避免资源耗尽。 2. **性能** - **分布式缓存**:集成 Infinispan 缓存,配置分布式会话存储[^1]。 - **JVM 参数化**:启用缩指针(`-XX:+UseCompressedOops`)和分层编译(`-XX:+TieredCompilation`)。 - **日志化**:关闭 DEBUG 日志级别,减少 I/O 开销。 --- #### 三、Tomcat 配置与 1. **核心配置** - **连接器化**:在 `server.xml` 中整 `Connector` 参数: ```xml <Connector port="8080" maxThreads="200" acceptCount="100" /> ``` - **内存设置**:修改 `catalina.sh` 设置堆内存: ```bash -Xms512m -Xmx2048m ``` - **会话持久化**:配置 `Manager` 组件实现会话存储(如 Redis)。 2. **性能** - **静态资源缓存**:启用 `DefaultServlet` 的 `cacheMaxSize` 和 `cacheTTL`。 - **NIO 模式**:使用 `org.apache.coyote.http11.Http11NioProtocol` 提升并发处理能力[^2]。 - **关闭自动重载**:设置 `reloadable="false"` 避免类重复加载。 --- #### 四、通用化原则 1. **监控工具**:使用 VisualVM、JConsole 或 Prometheus + Grafana 监控 JVM 状态。 2. **验证**:通过 JMeter 或 Gatling 模拟高并发场景,定位瓶颈。 3. **集群部署**:结合负载均衡(如 Nginx)实现横向扩展[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值