Tomcat 作為最流行的 Java Web 容器,預設配置僅適合開發測試。生產環境必須針對併發處理能力、JVM 內存模型、連接器協議進行深度調優。本文提供經驗驗證的核心配置模板與原理解析。
預設 BIO 阻塞模型已淘汰,生產**必須啟用 NIO/NIO2 或 APR**。
<!-- 生產環境推薦:Http11NioProtocol (Tomcat 8/9/10 默認) -->
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500" <!-- 最大工作線程數,CPU 核心數 * (1 + 平均等待時間/平均工作時間) -->
minSpareThreads="100" <!-- 最小空閒線程,應對突發流量 -->
maxSpareThreads="200" <!-- 最大空閒線程,超出回收 -->
acceptCount="200" <!-- 隊列滿時等待隊列長度,建議 ≥ maxThreads -->
enableLookups="false" <!-- 禁用 DNS 反查,極大提升性能 -->
disableUploadTimeout="true"
compression="on" <!-- 啟用 GZIP 壓縮 -->
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"
compressionMinSize="2048" />
| 參數 | 推薦值 | 調優邏輯 |
|---|---|---|
| protocol | Http11NioProtocol | 非阻塞 I/O,單線程處理多連接,高併發首選。APR 需安裝 tcnative 庫,性能更強但運維複雜。 |
| maxThreads | 200-800 | 過大導致線程上下文切換開銷劇增,結合壓測調整。公式:CPU核數 * (1 + 平均I/O等待/平均CPU計算)。 |
| acceptCount | ≥ maxThreads | 內核級連接隊列,防止突發流量連接被拒。Linux 還需調整 /proc/sys/net/core/somaxconn (默認 128)。 |
| enableLookups | false | 禁用 request.getRemoteHost() DNS 反解,避免網絡阻塞線程。 |
| compression | on | 減少傳輸體積,換取 CPU 計算,現代 CPU 極其划算。 |
配置文件:Linux bin/setenv.sh、Windows bin/setenv.bat(不存在自建)。
# setenv.sh
export JAVA_OPTS="-server \
-Xms4g -Xmx4g \
-XX:NewRatio=2 \
-XX:SurvivorRatio=8 \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC \
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logs/tomcat/gc-%t.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/tomcat/ \
-Djava.awt.headless=true \
-Dfile.encoding=UTF-8 \
-Duser.timezone=Asia/Shanghai"
export JAVA_OPTS="-server \
-Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:G1HeapRegionSize=16m \
-XX:+ParallelRefProcEnabled \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xlog:gc*:/logs/tomcat/gc-%t.log:time,uptime,level,tags \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/tomcat/ \
-Djava.awt.headless=true \
-Dfile.encoding=UTF-8 \
-Duser.timezone=Asia/Shanghai"
MetaspaceSize 觸發擴容 GC 閾值,MaxMetaspaceSize 防止佔滿機器內存。GCeasy/GCEasy/Arthas 分析,-Xloggc (JDK8) 或 -Xlog:gc* (JDK9+)。HeadlessException。# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
fs.file-max = 1000000
# 生效: sysctl -p
/etc/security/limits.conf 添加 tomcat soft nofile 65535 / hard nofile 65535。jmap -heap <pid> 確認堆/元空間配置生效。jstat -gcutil <pid> 1000 觀察 GC 頻率/耗時/老年代增長趨勢。wrk、JMeter、Gatling 模擬業務場景,觀察吞吐量(QPS)、延遲(P99)、錯誤率、GC 行為。Tomcat 調優無銀彈,**「連接器線程池匹配業務 I/O 特性 + JVM 堆/GC 策略匹配內存/延遲目標 + 系統內核參數放開資源上限」** 三位一體。配置即代碼,所有參數納入版本控制,配合自動化部署與持續壓測,才能構建穩定高性能的 Java Web 服務體系。