CentOS下優化Tomcat性能的多維度方案
確保服務器具備足夠的硬件資源:高速CPU(如Intel Xeon或AMD EPYC系列,支持多核心)、大內存(根據應用需求,建議至少8GB以上)、高速硬盤(優先選擇NVMe SSD,提升磁盤I/O性能)。硬件性能是Tomcat運行的基礎,直接決定并發處理能力的上限。
通過修改/etc/sysctl.conf文件優化網絡性能,添加以下關鍵參數并執行sysctl -p使配置生效:
# 增加網絡緩沖區大小,提升網絡吞吐量
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_max_syn_backlog = 65535
# 啟用TCP連接復用,減少TIME_WAIT狀態連接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 # 注意:Linux 4.12+版本已移除該參數,需替換為tcp_tw_timeout
# 增加系統最大文件描述符限制
fs.file-max = 65536
同時,編輯/etc/security/limits.conf文件,調整用戶進程的文件描述符限制:
* soft nofile 65536
* hard nofile 65536
這些參數可解決高并發下的“連接數不足”“文件描述符耗盡”等問題。
通過server.xml文件中的Executor元素定義全局線程池,合理設置線程數量以匹配并發需求:
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="200" <!-- 最大線程數(根據CPU核心數調整,建議200-500) -->
minSpareThreads="50" <!-- 最小空閑線程數(保持50-100,避免頻繁創建線程)" />
然后在Connector中引用該線程池:
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
maxThreads需根據CPU核心數計算(通常為CPU核心數×200),避免過多線程導致上下文切換開銷。
優先使用NIO(Non-blocking I/O)或NIO2協議替代傳統的BIO(Blocking I/O),提升網絡I/O效率:
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- NIO2性能更優 -->
connectionTimeout="20000"
redirectPort="8443" />
NIO通過事件驅動模型處理連接,適合高并發場景,能顯著減少線程阻塞。
通過Connector的compression參數開啟GZIP壓縮,減少網絡傳輸的數據量(尤其對HTML、CSS、JS等文本資源效果明顯):
<Connector ...
compression="on"
compressionMinSize="2048" <!-- 最小壓縮大小(2KB以上才壓縮) -->
noCompressionUserAgents="gozilla, traviata" <!-- 不壓縮的UA -->
compressableMimeType="text/html,text/xml,text/plain,application/json" />
壓縮率通??蛇_50%-70%,降低帶寬占用和響應時間。
Connector中設置enableLookups="false",避免Tomcat對客戶端IP進行反向DNS解析(消耗DNS資源和時間):<Connector ... enableLookups="false" />
AjpConnector配置,減少不必要的端口監聽。修改server.xml中的Server標簽,隱藏Tomcat版本號,降低安全風險:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector ... />
<Engine name="Catalina" defaultHost="localhost" version="1.0"> <!-- 修改version屬性 -->
...
</Engine>
</Service>
</Server>
同時,在web.xml中添加以下配置,隱藏Servlet版本:
<init-param>
<param-name>showProxyInfo</param-name>
<param-value>false</param-value>
</init-param>
在catalina.sh(Linux)或catalina.bat(Windows)文件中設置JVM堆內存參數,避免頻繁的垃圾回收(GC):
export CATALINA_OPTS="$CATALINA_OPTS -server -Xms4G -Xmx4G -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
-Xms:初始堆大?。ńㄗh與-Xmx一致,避免啟動后擴容的開銷);-Xmx:最大堆大?。ú怀^物理內存的80%,如16GB內存可設為12GB);-XX:MetaspaceSize/-XX:MaxMetaspaceSize:元空間大?。↗ava 8+替代永久代,避免永久代溢出)。針對不同場景選擇合適的GC算法:
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200" # 目標最大GC停頓時間200ms
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseParallelGC -XX:ParallelGCThreads=4" # 線程數通常設為CPU核心數的1/4
根據應用特點(如延遲敏感型選G1GC,吞吐量敏感型選ParallelGC)調整GC策略。
通過web.xml配置靜態資源(如圖片、CSS、JS)的緩存策略,減少重復請求:
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 1 month</param-value> <!-- 圖片緩存1個月 -->
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 week</param-value> <!-- CSS緩存1周 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
緩存可顯著降低服務器負載和響應時間。
在server.xml中關閉autoDeploy和deployOnStartup,避免Tomcat自動掃描和部署應用(手動部署更可控):
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
...
</Host>
自動部署會消耗CPU和內存資源,尤其在頻繁更新應用時影響性能。
maxThreads后,觀察QPS(每秒查詢數)和響應時間的變化);