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
(初始堆大?。┖?code>-Xmx(最大堆大?。?,建議兩者相等以避免動態擴容的開銷(如-Xms2g -Xmx2g
);同時限制元空間大?。?code>-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次循環),測試不同配置下的性能表現(關注平均響應時間、錯誤率、吞吐量),根據測試結果調整參數。