1. 优化Tomcat连接器配置
选择高性能连接器是提升并发处理能力的基础。Tomcat支持NIO(非阻塞I/O)、NIO2(异步非阻塞I/O)和APR(Apache Portable Runtime,基于本地库优化)三种连接器,其中NIO/NIO2适合大多数高并发场景,APR则需安装本地库以获得更优性能。
server.xml中设置protocol="org.apache.coyote.http11.Http11Nio2Protocol",并调整maxThreads(最大线程数,建议设为CPU核心数的2-4倍,如4核服务器设为500)、minSpareThreads(最小空闲线程数,保持50-100以快速响应新请求)、acceptCount(请求队列长度,建议设为maxThreads的50%-100%,避免请求堆积)。sudo apt-get install libapr1-dev libssl-dev),下载tomcat-native并编译安装(./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr/include/openssl/; make && sudo make install),然后在server.xml中使用protocol="org.apache.coyote.http11.Http11AprProtocol"。2. 调整线程池参数
线程池是Tomcat处理并发请求的核心资源,合理配置可避免线程阻塞或资源浪费。在server.xml中通过<Executor>定义线程池,再关联到连接器:
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="50"
maxQueueSize="200"
prestartminSpareThreads="true"/>
<Connector executor="tomcatThreadPool"
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
maxThreads(最大并发处理线程数,根据应用负载调整,不宜过大以免消耗过多内存)、minSpareThreads(启动时预先创建的线程数,减少首次请求延迟)、maxQueueSize(请求队列长度,过长会导致请求超时,建议设为maxThreads的50%以内)、prestartminSpareThreads(启动时创建最小空闲线程,避免动态创建的开销)。3. 优化JVM参数
JVM内存与垃圾回收(GC)配置直接影响Tomcat的稳定性和响应速度。
-Xms(初始堆大小)和-Xmx(最大堆大小),建议两者相等以避免动态扩容的开销(如-Xms2g -Xmx2g);同时限制元空间大小(-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m),防止元空间溢出。-XX:+UseG1GC),它通过并发标记和整理减少停顿时间;可通过-XX:MaxGCPauseMillis=200(目标最大GC停顿时间,单位毫秒)和-XX:InitiatingHeapOccupancyPercent=45(触发GC的堆占用率)进一步调优。4. 操作系统层面调优
Linux内核参数的调整可提升Tomcat处理高并发连接的能力。
ulimit -n 65535),并修改/etc/security/limits.conf(添加* soft nofile 65535; * hard nofile 65535)使其永久生效。/etc/sysctl.conf,添加以下参数以提升TCP连接处理能力:net.core.somaxconn = 65535 # 系统允许的最大并发连接数
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度
net.ipv4.tcp_tw_reuse = 1 # 允许TCP连接复用(减少TIME_WAIT状态)
net.ipv4.tcp_fin_timeout = 30 # TIME_WAIT状态超时时间(秒)
执行sudo sysctl -p使配置生效。5. 启用压缩与缓存
server.xml的Connector中添加:compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,application/json"/>
(compressionMinSize:触发压缩的最小响应大小,单位字节;compressableMimeType:需要压缩的MIME类型)。web.xml中添加:<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image/jpeg</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>
6. 负载均衡部署
单个Tomcat实例无法应对极高并发时,可通过Nginx或HAProxy实现负载均衡,将请求分发到多个Tomcat实例。以Nginx为例,配置如下:
upstream tomcat_servers {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcat_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
(需确保Tomcat实例监听不同IP或端口,且Nginx与Tomcat在同一网络或配置了正确的反向隧道)。
7. 监控与持续调优
使用监控工具实时跟踪Tomcat性能,及时发现瓶颈:
jconsole或VisualVM连接Tomcat的JMX端口(默认9004),查看线程数、内存使用、GC频率等指标。jolokia(sudo apt-get install jolokia-jvm)暴露JMX指标,通过Grafana实现可视化监控(如绘制QPS、响应时间、错误率 dashboard)。JMeter模拟高并发请求(如500线程、10000次循环),测试不同配置下的性能表现(关注平均响应时间、错误率、吞吐量),根据测试结果调整参数。