一、優化JVM內存配置,避免內存溢出
JVM內存設置是Tomcat穩定的核心基礎,不合理的內存分配易導致內存溢出(OOM),使服務崩潰。需通過catalina.sh(CentOS下位于/opt/tomcat/bin/)調整關鍵參數:
-Xms(初始堆)和-Xmx(最大堆)設為相同值(如-Xms2048m -Xmx2048m),避免JVM頻繁擴容堆內存導致的性能波動;建議值為物理內存的1/4~1/2(如8GB內存可設為2~4GB)。-Xmn為堆內存的3/8(如-Xmn768m),可優化Minor GC效率。-XX:MaxMetaspaceSize替代MaxPermSize(如-XX:MaxMetaspaceSize=256m),防止元空間溢出。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/temp/oom.hprof,當OOM發生時自動生成堆轉儲文件,便于后續分析內存泄漏原因。二、配置Tomcat集群與負載均衡,消除單點故障
單節點Tomcat易因硬件故障或進程崩潰導致服務中斷,需通過集群和負載均衡提升可用性:
/etc/nginx/nginx.conf,添加如下配置:upstream tomcat_cluster {
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_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重啟Nginx(systemctl restart nginx)使配置生效。server.xml中啟用集群(<Cluster>標簽),并設置jvmRoute(如<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">);在應用的web.xml中添加<distributable/>,確保會話數據在集群節點間同步。/etc/keepalived/keepalived.conf,添加如下配置:vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.200
}
}
重啟Keepalived(systemctl restart keepalived),VIP(192.168.1.200)將指向主節點,故障時自動切換。三、優化日志管理與存儲,避免磁盤空間耗盡
日志文件過大或未合理輪轉會占滿磁盤,導致Tomcat無法寫入日志甚至崩潰:
logrotate工具管理Tomcat日志(如catalina.out)。創建/etc/logrotate.d/tomcat文件,添加如下配置:/opt/tomcat/logs/catalina.out {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
該配置表示每天輪轉一次日志,保留最近7天的壓縮日志(catalina.out.1.gz~catalina.out.7.gz),并清空原日志文件。conf/logging.properties,將ConsoleHandler替換為AsyncFileHandler,提升日志寫入性能(減少對主線程的阻塞):handlers = 1catalina.org.apache.juli.AsyncFileHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
logging.properties調整日志級別(如將org.apache.catalina設為WARNING),減少調試日志的輸出;或在server.xml中關閉Access Log(<Valve className="org.apache.catalina.valves.AccessLogValve" enabled="false"/>)。四、調整Tomcat連接器與線程配置,提升并發處理能力
Tomcat的連接器(Connector)配置直接影響并發性能,不合理配置會導致請求堆積、響應超時:
conf/server.xml中的<Connector>標簽,調整關鍵參數:<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="50"
acceptCount="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,application/json" />
maxThreads:最大線程數(如500),根據并發請求數調整(建議為CPU核心數的2~4倍);acceptCount:等待隊列長度(如1000),當所有線程繁忙時,新請求進入隊列;enableLookups="false":禁用DNS查詢,提升請求處理速度;compression="on":啟用GZIP壓縮,減少傳輸數據量(適用于文本類響應)。<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
需在Nginx中配置proxy_pass指向AJP端口(如proxy_pass http://127.0.0.1:8009)。五、定期監控與維護,及時排查問題
主動監控Tomcat運行狀態,提前發現潛在問題(如內存泄漏、線程阻塞、磁盤空間不足):
top、htop、free -m命令實時查看CPU、內存、磁盤使用情況;或使用第三方工具(如Prometheus+Grafana)搭建監控面板,設置閾值告警(如內存使用率超過80%時發送郵件通知)。jstat -gcutil <pid> 1000命令每秒監控GC情況(如Eden區、老年代使用率),或使用VisualVM、JConsole工具查看堆內存、線程狀態。temp、work目錄會積累臨時文件,需定期清理(如每月執行rm -rf /opt/tomcat/temp/*、rm -rf /opt/tomcat/work/*)。六、升級Tomcat版本與依賴,修復已知漏洞
舊版本Tomcat可能存在性能bug或安全漏洞,影響穩定性:
lib目錄下未使用的jar包(如舊版本的數據庫驅動),減少內存占用和潛在的類沖突。