0%

tomcat之性能优化

Tomcat 性能优化全指南

Tomcat 作为主流的 Java Web 容器,其性能直接影响应用的响应速度和并发能力。通过合理配置线程池、连接器、JVM 参数等,可以显著提升 Tomcat 的处理能力。本文将从执行器调优、连接器配置、JVM 优化等多个维度,详细介绍 Tomcat 性能优化的核心策略。

执行器(线程池)调优

Tomcat 的线程池(Executor)是处理请求的核心组件,负责管理请求处理线程。合理配置线程池参数可以避免线程频繁创建 / 销毁的开销,提升并发处理能力。

核心配置参数

1
2
3
4
5
6
7
8
9
<Executor 
name="tomcatThreadPool" <!-- 线程池名称(唯一标识) -->
namePrefix="catalina-exec-" <!-- 线程名称前缀(便于日志排查) -->
maxThreads="500" <!-- 最大线程数(并发处理的核心参数) -->
minSpareThreads="50" <!-- 最小空闲线程数(启动时初始化的线程数) -->
maxIdleTime="60000" <!-- 线程空闲超时时间(毫秒,默认 60000) -->
maxQueueSize="1000" <!-- 任务队列最大长度(超出则拒绝请求) -->
prestartminSpareThreads="true" <!-- 启动时是否初始化 minSpareThreads 个线程 -->
/>

参数调优建议

  • maxThreads
    决定并发处理的上限,需根据服务器 CPU 核心数调整。建议:
    • 4 核 CPU:设置为 200-400
    • 8 核 CPU:设置为 400-800
      过高会导致线程切换开销增大,反而降低性能。
  • minSpareThreads
    避免请求突增时频繁创建线程,建议设置为 maxThreads 的 1/10~1/5(如 500 线程池对应 50-100)。
  • maxQueueSize
    当线程全部繁忙时,请求会进入队列等待。建议设置为 maxThreads 的 2-3 倍(如 500 线程对应 1000-1500),过大可能导致请求超时。
  • prestartminSpareThreads
    生产环境建议设为 true,启动时初始化核心线程,避免首笔请求的线程创建开销。

启用线程池

配置后需在 Connector 中引用,否则不会生效:

1
2
3
4
5
6
<Connector 
executor="tomcatThreadPool" <!-- 关联线程池 -->
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- 使用 NIO2 协议 -->
...
/>

连接器(Connector)调优

Connector 负责接收客户端请求并转发给线程池处理,其配置直接影响请求接收效率和连接管理。

核心配置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Connector 
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- IO 模型 -->
connectionTimeout="20000" <!-- 连接超时时间(毫秒) -->
redirectPort="8443" <!-- HTTPS 重定向端口 -->
acceptCount="1000" <!-- 最大等待队列长度 -->
acceptorThreadCount="4" <!-- 接收连接的线程数 -->
maxConnections="10000" <!-- 最大并发连接数 -->
enableLookups="false" <!-- 禁用 DNS 反向查询 -->
URIEncoding="UTF-8" <!-- URI 编码(避免中文乱码) -->
compression="on" <!-- 启用 GZIP 压缩 -->
compressionMinSize="2048" <!-- 压缩阈值(字节,超过才压缩) -->
compressableMimeType="text/html,text/xml,application/json" <!-- 压缩的 MIME 类型 -->
maxKeepAliveRequests="100" <!-- 长连接最大请求数 -->
tcpNoDelay="true" <!-- 禁用 Nagle 算法 -->
/>

参数调优建议

  • protocol
    选择高效的 IO 模型:
    • Http11Nio2Protocol(NIO2):非阻塞 IO,支持高并发(推荐)。
    • Http11AprProtocol(APR):需安装 APR 库,性能接近原生 C 实现(适合超高性能场景)。
    • 避免使用 Http11Protocol(BIO,阻塞 IO,性能差)。
  • maxConnections
    允许的最大并发连接数,超过则排队。NIO2 模式默认 10000,建议根据服务器内存调整(如 8G 内存可设为 10000-20000)。
  • acceptCount
    maxConnections 满后,请求排队的最大长度。建议与 maxThreads 保持一致或略高(如 1000)。
  • acceptorThreadCount
    接收新连接的线程数,建议设置为 CPU 核心数(如 4 核设为 4)。
  • compression
    启用 GZIP 压缩可减少响应数据量(节省带宽,提升传输速度),但会增加 CPU 开销。建议对文本类内容(HTML、JSON)启用,对图片、视频等二进制文件禁用。
  • maxKeepAliveRequests
    长连接(Keep-Alive)中允许的最大请求数,默认 100。高并发场景可适当调大(如 200),减少 TCP 连接建立开销。
  • tcpNoDelay
    设为 true 禁用 Nagle 算法,避免小数据包延迟发送(适合交互式应用,如网页)。
  • enableLookups
    设为 false 禁用 request.getRemoteHost() 的 DNS 查询,减少响应时间。

JVM 优化

JVM 配置对 Tomcat 性能影响极大,合理的内存分配和垃圾回收(GC)策略可以减少 GC 停顿,提升应用稳定性。

核心 JVM 参数

catalina.sh(Linux)或 catalina.bat(Windows)中配置 JAVA_OPTS

1
2
3
4
5
6
7
8
# 堆内存配置
JAVA_OPTS="-Xms2048m -Xmx2048m -Xmn768m"
# 元空间配置
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
# 垃圾回收器(G1 收集器)
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1"
# 其他优化
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC -XX:+UseBiasedLocking -XX:+AggressiveOpts -Xss256k"

参数调优建议

1. 堆内存配置
  • -Xms-Xmx
    初始堆内存与最大堆内存,建议设为相同值(避免运行时动态调整的开销)。根据服务器内存配置:
    • 8G 服务器:建议设为 4096m(50% 内存)。
    • 16G 服务器:建议设为 8192m(50% 内存)。
  • -Xmn
    年轻代内存大小,建议为堆内存的 1/3~1/4(如 4G 堆对应 1G 年轻代)。过小会导致对象提前进入老年代,增大 GC 压力;过大则老年代内存不足,易触发 Full GC。
2. 元空间配置
  • -XX:MetaspaceSize-XX:MaxMetaspaceSize
    元空间用于存储类信息,默认不限制大小。建议设为 256m~512m,避免内存泄漏导致元空间无限增长。
3. 垃圾回收器选择
  • G1 收集器(推荐)
    适用于大堆内存(4G 以上),兼顾吞吐量和低延迟。关键参数:
    • -XX:+UseG1GC:启用 G1。
    • -XX:MaxGCPauseMillis=200:目标 GC 停顿时间(毫秒)。
    • -XX:ParallelGCThreads:并行 GC 线程数(建议设为 CPU 核心数)。
  • CMS 收集器(备选)
    适用于低延迟场景,但 JDK 9 后已废弃,建议优先使用 G1。
  • 避免串行收集器
    仅适用于单核服务器或开发环境,生产环境禁用。
4. 其他优化参数
  • -XX:+DisableExplicitGC:禁用 System.gc()(避免手动触发 Full GC)。
  • -XX:+UseBiasedLocking:启用偏向锁(减少无竞争场景的锁开销)。
  • -Xss256k:减小线程栈大小(默认 1M),支持更多线程(如 256k 可支持 4000+ 线程)。

其他优化策略

禁用不必要的组件

  • 禁用 AJP 连接器
    AJP 用于与 Apache 等反向代理通信,若不使用可注释掉:

    1
    2
    <!-- 注释掉 AJP 连接器 -->
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
  • 关闭自动部署
    生产环境禁用 HostautoDeployunpackWARs,减少文件扫描开销:

    1
    <Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">

2. 优化 Web 应用配置

  • 共享 JAR 包
    多个应用共用的 JAR 包(如 Spring、MySQL 驱动)可放入 $CATALINA_BASE/shared/lib,避免重复加载(需在 catalina.properties 中配置 shared.loader)。

  • 禁用 session 持久化
    非集群环境可关闭 session 持久化(默认 StandardManager 会在 Tomcat 停止时保存 session):

    1
    2
    3
    <Context>
    <Manager pathname="" /> <!-- 禁用 session 持久化 -->
    </Context>
  • 调整 session 超时时间
    减少闲置 session 占用内存,在 web.xml 中配置:

    1
    2
    3
    <session-config>
    <session-timeout>30</session-timeout> <!-- 30 分钟超时 -->
    </session-config>

3. 操作系统优化

  • 调整文件描述符限制
    Linux 下默认文件描述符上限较低(如 1024),需调大以支持更多并发连接:

    1
    2
    3
    # 在 /etc/security/limits.conf 中添加
    * soft nofile 65535
    * hard nofile 65535
  • 优化 TCP 连接
    调整内核参数(/etc/sysctl.conf):

    1
    2
    3
    4
    net.ipv4.tcp_max_tw_buckets = 6000  # 控制 TIME_WAIT 状态的连接数
    net.ipv4.tcp_tw_recycle = 1 # 快速回收 TIME_WAIT 连接
    net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME_WAIT 连接
    net.ipv4.tcp_syncookies = 1 # 启用 SYN cookies(防御 SYN 洪水攻击)

性能测试与监控

优化后需通过工具验证效果:

  • 压力测试工具
    • JMeter:模拟多用户并发请求,测试响应时间、吞吐量。
    • Apache Bench(ab):简单快速的 HTTP 压力测试工具。
  • 监控工具
    • JConsole/JVisualVM:监控 JVM 内存、线程、GC 情况。
    • Tomcat Manager:查看应用状态、线程池使用情况(http://localhost:8080/manager/status)。
    • 日志分析:通过 catalina.out 排查慢请求、异常堆栈。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10