线程池是Tomcat处理并发请求的关键,合理配置可平衡资源利用率与响应速度。在server.xml中通过<Executor>定义线程池,再由<Connector>引用:
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大线程数(根据CPU核心数调整,建议200-1000) -->
minSpareThreads="50" <!-- 最小空闲线程数(保持备用线程,避免频繁创建) -->
maxIdleTime="60000" <!-- 线程空闲超时(毫秒,默认60s) -->
maxQueueSize="100"/> <!-- 等待队列大小(超过则拒绝请求,避免内存溢出)"/>
在<Connector>中引用线程池:
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- 使用NIO2提升高并发性能 -->
connectionTimeout="20000"
redirectPort="8443"/>
说明:maxThreads需结合服务器CPU核心数(如4核CPU可设为200-400)、应用类型(IO密集型可适当增大)调整;maxQueueSize避免过大导致内存溢出,建议100以内。
选择高性能连接器协议可显著提升吞吐量:
<Connector port="8443"
protocol="org.apache.coyote.http2.Http2Protocol"
SSLEnabled="true"
maxThreads="500"
keystoreFile="conf/keystore.jks"
keystorePass="changeit"/>
说明:NIO2协议在高并发下表现更优,HTTP/2可提升页面加载速度。
合理分配JVM堆内存可减少垃圾回收(GC)频率,避免Full GC导致的停顿。在catalina.sh中设置:
export JAVA_OPTS="$JAVA_OPTS -server -Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m"
-Xms:初始堆大小(建议与-Xmx一致,避免频繁扩容)。-Xmx:最大堆大小(根据服务器内存调整,建议为物理内存的1/2-2/3)。-XX:MaxMetaspaceSize:元空间大小(替代Java 7的PermGen,避免元空间溢出)。根据应用特点选择合适的GC算法:
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseParallelGC -XX:ParallelGCThreads=4"
说明:G1GC在大多数生产环境中表现更稳定,ParallelGC适合对吞吐量要求高的场景。
修改/etc/sysctl.conf提升网络吞吐量与连接处理能力:
# 增加TCP缓冲区大小
net.core.rmem_max=12582912
net.core.wmem_max=12582912
# 启用TCP快速打开(减少握手延迟)
net.ipv4.tcp_fastopen=3
# 减少TIME_WAIT状态连接(默认60s)
net.ipv4.tcp_fin_timeout=30
# 增加半连接队列大小(避免SYN Flood攻击)
net.ipv4.tcp_max_syn_backlog=8192
# 增加系统最大文件描述符数
fs.file-max=65535
应用更改:
sudo sysctl -p
说明:tcp_fastopen可减少TCP握手时间,tcp_fin_timeout降低TIME_WAIT连接占用,fs.file-max避免文件描述符耗尽。
Tomcat处理大量连接时需增加文件描述符限制:
/etc/security/limits.conf:* soft nofile 65535
* hard nofile 65535
/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive,添加:session required pam_limits.so
说明:nofile限制每个进程可打开的文件数,需与内核参数一致。
将静态资源(图片、CSS、JS)放在Nginx或CDN上,减少Tomcat处理负担:
server {
listen 80;
server_name example.com;
location /static/ {
alias /var/www/static/;
expires 30d; # 设置缓存过期时间
}
location / {
proxy_pass http://localhost:8080; # 转发动态请求到Tomcat
proxy_set_header Host $host;
}
}
说明:静态资源通过Nginx直接返回,Tomcat仅处理动态请求,提升整体吞吐量。
使用连接池(如HikariCP、DBCP)管理数据库连接,减少创建/销毁开销:
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
minimumIdle="5"
maximumPoolSize="20"
idleTimeout="30000"
connectionTimeout="30000"
data-source-jndi-name="java:comp/env/jdbc/mydb"/>
说明:minimumIdle保持最小空闲连接,maximumPoolSize限制最大连接数,避免数据库过载。
server.xml开启访问日志,分析慢请求:<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D" <!-- %D记录请求处理时间 -->
resolveHosts="false"/>
maxThreads使用率(避免超过80%)、maxQueueSize是否排队。netstat -ant | grep 8080 | wc -l)、吞吐量(iftop)。server.xml、catalina.sh)。