CentOS下Tomcat性能瓶頸解決方法
JVM內存配置是Tomcat性能的基礎,不合理的內存設置易導致內存溢出(OOM)或頻繁GC,影響響應速度。
-Xms(初始堆)和-Xmx(最大堆)參數設置堆內存,建議兩者值相等以避免堆擴展帶來的性能損耗(如-Xms4G -Xmx4G)。-XX:MetaspaceSize(初始元空間)和-XX:MaxMetaspaceSize(最大元空間)替代永久代,避免元空間溢出(如-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m)。-XX:+UseG1GC),適用于大內存堆,能平衡吞吐量和延遲;若需低延遲,可選用ZGC(-XX:+UseZGC,需JDK 11+)。-XX:NewRatio設置(如-XX:NewRatio=2表示新生代占堆的1/3),根據應用對象生命周期調整(短生命周期對象多則增大新生代)。線程池是處理并發請求的核心,配置不當會導致線程阻塞或資源浪費。
server.xml中定義Executor,設置maxThreads(最大線程數,根據CPU核心數和業務調整,如2核4G內存可設為200)、minSpareThreads(最小空閑線程數,保持50~100以快速響應請求)、maxQueueSize(隊列長度,避免無限制排隊導致內存溢出,如100)。Executor與Connector綁定(executor="tomcatThreadPool"),并選擇高性能協議(如NIO:protocol="org.apache.coyote.http11.Http11NioProtocol")。連接器負責處理HTTP請求,其配置直接影響吞吐量和響應時間。
protocol="org.apache.coyote.http11.Http11NioProtocol")。protocol="org.apache.coyote.http2.Http2Protocol"開啟HTTP/2,支持多路復用、頭部壓縮,減少頁面加載時間。maxConnections(最大連接數,如10000,支持更多并發)、connectionTimeout(連接超時時間,如20000ms,避免長時間占用連接)、keepAliveTimeout(Keep-Alive超時時間,如5000ms,復用連接減少握手開銷)。操作系統參數限制會影響Tomcat的并發處理能力,需調整內核參數。
/etc/security/limits.conf,添加* soft nofile 65536和* hard nofile 65536,提升Tomcat能處理的并發連接數。/etc/sysctl.conf,設置net.core.somaxconn=65535(最大連接隊列長度)、net.ipv4.tcp_tw_reuse=1(允許TCP連接復用)、net.ipv4.tcp_tw_recycle=1(快速回收TIME_WAIT連接),提升網絡性能。/etc/rc.local添加echo never > /sys/kernel/mm/transparent_hugepage/enabled和echo never > /sys/kernel/mm/transparent_hugepage/defrag,禁用該功能。減少數據傳輸量和磁盤訪問次數,提升響應速度。
Connector中設置compression="on",并指定壓縮類型(如compressableMimeType="text/html,text/xml,text/plain,application/json"),減少網絡傳輸的數據量。Expires或Cache-Control頭緩存靜態資源(如圖片、CSS、JS),減少對磁盤的訪問次數(可在應用代碼或反向代理中配置)。減少Tomcat的資源消耗,提升性能。
server.xml中的AJP Connector(<Connector protocol="AJP/1.3" .../>)。server.xml中設置autoDeploy="false",避免Tomcat自動掃描和部署war包,減少CPU和內存開銷。server.xml的Connector中添加server=" ",避免暴露Tomcat版本,減少安全風險。通過監控定位性能瓶頸,合理配置日志避免影響性能。
logging.properties中的日志級別調整為WARN或ERROR,避免過多的INFO日志占用磁盤IO和內存(如org.apache.catalina.level=WARN)。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log),通過分析GC頻率和耗時,優化JVM內存配置。Tomcat性能也受應用代碼影響,需優化代碼邏輯。
new String()),使用對象池(如數據庫連接池)重用對象。