Tomcat在CentOS上的性能優化需從操作系統層、JVM層、Tomcat配置層三個維度綜合調整,以下是具體措施:
操作系統是Tomcat運行的基礎,需調整內核參數與資源限制以提升并發處理能力。
調整文件描述符限制
Tomcat的高并發依賴足夠的文件描述符(FD)。編輯/etc/security/limits.conf
,添加以下內容:
* soft nofile 65536
* hard nofile 65536
這會將用戶級別的FD軟限制設為65536(硬限制也為65536),避免因FD不足導致連接被拒絕。
優化內核網絡參數
編輯/etc/sysctl.conf
,添加以下參數以提升網絡吞吐與連接復用:
net.core.somaxconn = 65535 # 監聽隊列最大長度(默認128,需大于Tomcat的acceptCount)
net.ipv4.tcp_tw_reuse = 1 # 允許復用TIME_WAIT狀態的連接
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT連接(注意:Linux 4.12+版本需關閉,可能影響NAT環境)
fs.file-max = 65536 # 系統全局FD最大數量
執行sysctl -p
使配置生效。
禁用透明大頁(Transparent HugePage)
透明大頁會導致內存碎片,降低Tomcat性能。編輯/etc/rc.local
(需賦予執行權限),添加:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
重啟服務器使配置生效。
JVM內存配置直接影響Tomcat的垃圾回收(GC)頻率與應用穩定性,需根據服務器內存合理分配。
設置堆內存大小
編輯Tomcat的bin/catalina.sh
(或setenv.sh
),添加以下參數:
export JAVA_OPTS="$JAVA_OPTS -Xms2G -Xmx2G -XX:MaxMetaspaceSize=512m"
-Xms
:初始堆大?。ńㄗh與-Xmx
一致,避免頻繁擴容);-Xmx
:最大堆大?。ú怀^服務器物理內存的70%,如8G內存設為5-6G);-XX:MaxMetaspaceSize
:元空間最大大?。↗ava 8+替代永久代,避免元空間溢出)。選擇合適的垃圾回收器
對于大內存應用,推薦使用G1GC(Garbage-First Garbage Collector),平衡吞吐量與延遲:
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
如需更激進的GC調優,可添加:
export JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45"
(MaxGCPauseMillis
:目標最大GC停頓時間;InitiatingHeapOccupancyPercent
:觸發并發GC的堆占用率)。
Tomcat的連接器(Connector)與線程池配置是提升并發處理能力的關鍵。
配置線程池(推薦使用Executor)
在server.xml
中定義線程池,并關聯到Connector:
<!-- 定義線程池 -->
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大線程數(根據CPU核心數調整,建議2-4倍) -->
minSpareThreads="50" <!-- 最小空閑線程數(保持活躍線程,避免頻繁創建) -->
maxIdleTime="60000"/> <!-- 空閑線程存活時間(毫秒) -->
<!-- 關聯線程池到Connector -->
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol" <!-- 使用NIO2提升I/O性能 -->
connectionTimeout="20000"
redirectPort="8443"
acceptCount="1000" <!-- 最大排隊請求數(超過maxThreads的請求進入隊列) -->
maxConnections="10000" <!-- 最大連接數(包括活躍與非活躍) -->
enableLookups="false" <!-- 禁用DNS查詢(減少開銷)" />
參數說明:
maxThreads
:根據服務器CPU核心數調整(如4核CPU設為800-1000);protocol
:優先選擇Http11Nio2Protocol
(異步I/O,性能優于傳統BIO);acceptCount
:需大于maxThreads
,避免高并發時連接被拒絕。啟用壓縮
在Connector中添加compression="on"
,減少網絡傳輸數據量:
<Connector ... compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,application/json" />
compressionMinSize
:啟用壓縮的最小響應大?。▎挝唬鹤止潱?;compressableMimeType
:需要壓縮的MIME類型。禁用不必要的組件
<!-- 注釋掉AJP Connector -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
webapps
目錄下的manager
、host-manager
文件夾。隱藏版本信息
在server.xml
的Connector中添加server=" "
,避免泄露Tomcat版本:
<Connector ... server="Apache" />
同時,在web.xml
中添加以下配置,隱藏Servlet版本:
<context-param>
<param-name>org.apache.catalina.servlets.DefaultServlet.showServerInfo</param-name>
<param-value>false</param-value>
</context-param>
靜態資源處理
將靜態資源(圖片、CSS、JS)放在Nginx或CDN上,減少Tomcat的負載。若必須由Tomcat處理,可在server.xml
中配置靜態資源緩存:
<Context docBase="/path/to/static" path="/static" reloadable="false">
<Resources cachingAllowed="true" cacheMaxSize="102400" />
</Context>
監控與調優
jstat
監控GC情況:jstat -gcutil <Tomcat_PID> 1000 # 每秒輸出一次GC統計
jmap
與jvisualvm
分析內存泄漏:jmap -dump:live,format=b,file=heap.hprof <Tomcat_PID>
jvisualvm --openfile heap.hprof
通過以上步驟,可顯著提升Tomcat在CentOS上的并發處理能力、響應速度與穩定性。需根據實際業務場景(如并發量、應用類型)調整參數,避免過度優化。