Tomcat 性能優化策略
一、前言
系統性能的衡量指標,主要是響應時間和吞吐量。
- 響應時間:執行某個操作的耗時;
- 吞吐量:系統在給定時間內能夠支持的事務數量,單位爲TPS(Transactions PerSecond的縮寫,也就是事務數/秒,一個事務是指一個客戶機向服務器發送請求然後服務器做出反應的過程。
Tomcat優化從兩個方面進行
- JVM虛擬機優化(優化內存模型)
- Tomcat自身配置的優化(比如是否使用了共享線程池?IO模型?)
二、虛擬機運行優化(參數調整)
Java 虛擬機的運行優化主要是內存分配和垃圾回收策略的優化:
- 內存直接影響服務的運行效率和吞吐量
- 垃圾回收機制會不同程度地導致程序運行中斷(垃圾回收策略不同,垃圾回收次數和回收效率都是 不同的)
1、 Java 虛擬機內存相關參數
參數 | 參數作用 | 優化建議 |
---|---|---|
-server | 啓動Server,以服務端模式運行 | 服務端模式建議開啓 |
-Xms | 最小堆內存 | 建議與-Xmx設置相同 |
-Xmx | 最大堆內存 | 建議設置爲可用內存 的80% |
-XX:MetaspaceSize | 元空間初始值 | |
-XX:MaxMetaspaceSize | 元空間最大內存 | 默認無限 |
-XX:NewRatio | 年輕代和老年代大小比值,取值爲整數,默認爲2 | 不需要修改 |
-XX:SurvivorRatio | Eden區與Survivor區大小的比值,取值爲整數,默認爲8 | 不需要修改 |
2、JVM內存模型
3、參數調整示例
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m - XX:MaxMetaspaceSize=512m"
4、調整後查看可使用JDK提供的內存映射工具
5、垃圾回收(GC)策略
5.1 垃圾回收性能指標
- 吞吐量:工作時間(排除GC時間)佔總時間的百分比, 工作時間並不僅是程序運行的時間,還包 含內存分配時間。
- 暫停時間:由垃圾回收導致的應用程序停止響應次數/時間。
5.2 垃圾收集器
-
串行收集器(Serial Collector)
單線程執行所有的垃圾回收工作, 適用於單核CPU服務器
工作進程-----|(單線程)垃圾回收線程進行垃圾收集|—工作進程繼續 -
並行收集器(Parallel Collector)
工作進程-----|(多線程)垃圾回收線程進行垃圾收集|—工作進程繼續
又稱爲吞吐量收集器(關注吞吐量
), 以並行的方式執行年輕代的垃圾回收, 該方式可以顯著降低垃圾回收的開銷(指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態)。適用於多處理器或多線程硬件上運行的數據量較大的應用。 -
併發收集器(Concurrent Collector)
以併發的方式執行大部分垃圾回收工作,以縮短垃圾回收的暫停時間。適用於那些響應時間優先於吞吐量
的應用, 因爲該收集器雖然最小化了暫停時間(指用戶線程與垃圾收集線程同時執行,但不一 定是並行的,可能會交替進行), 但是會降低應用程序的性能。 -
CMS收集器(Concurrent Mark Sweep Collector)
併發標記清除收集器, 適用於那些更願意縮短垃圾回收暫停時間並且負擔的起與垃圾回收共享處理器資源
的應用。 -
G1收集器(Garbage-First Garbage Collector)
適用於大容量內存的多核服務器
, 可以在滿足垃圾回收暫停時間目標的同時, 以最大可能性實現高吞吐量( JDK1.7之後)。
5.3 垃圾回收器參數
參數 | 描述 |
---|---|
-XX:+UseSerialGC | 啓用串行收集器 |
-XX:+UseParallelGC | 啓用並行垃圾收集器,配置了該選項,那麼 -XX:+UseParallelOldGC默認 啓用 |
-XX:+UseParNewGC | 年輕代採用並行收集器,如果設置了 -XX:+UseConcMarkSweepGC選 項,自動啓用 |
-XX:ParallelGCThreads | 年輕代及老年代垃圾回收使用的線程數。默認值依賴於JVM使用的CPU個 數 |
-XX:+UseConcMarkSweepGC(CMS) | 對於老年代,啓用CMS垃圾收集器。 當並行收集器無法滿足應用的延遲需 求是,推薦使用CMS或G1收集器。啓用該選項後, -XX:+UseParNewGC 自動啓用。 |
-XX:+UseG1GC | 啓用G1收集器。 G1是服務器類型的收集器, 用於多核、大內存的機器。 它在保持高吞吐量的情況下,高概率滿足GC暫停時間的目標。 |
在bin/catalina.sh的腳本中 , 只是選這個CMS垃圾收集器做測試,追加如下配置 :
JAVA_OPTS="-XX:+UseConcMarkSweepGC"
三、Tomcat 配置調優
Tomcat自身相關的調優
1、調整tomcat線程池
2、調整tomcat的連接器
調整tomcat/conf/server.xml 中關於鏈接器的配置可以提升應用服務器的性能。
參數 | 說明 |
---|---|
maxConnections | 最大連接數,當到達該值後,服務器接收但不會處理更多的請求, 額外的請 求將會阻塞直到連接數低於maxConnections 。可通過ulimit -a 查看服務器 限制。對於CPU要求更高(計算密集型)時,建議不要配置過大 ; 對於CPU要求 不是特別高時,建議配置在2000左右(受服務器性能影響)。 當然這個需要服 務器硬件的支持 |
maxThreads | 最大線程數,需要根據服務器的硬件情況,進行一個合理的設置 |
acceptCount | 最大排隊等待數,當服務器接收的請求數量到達maxConnections ,此時 Tomcat會將後面的請求,存放在任務隊列中進行排序, acceptCount指的 就是任務隊列中排隊等待的請求數 。 一臺Tomcat的最大的請求處理數量, 是maxConnections+acceptCount |
3、禁用 AJP 連接器
4、調整 IO 模式
Tomcat8之前的版本默認使用BIO(阻塞式IO),對於每一個請求都要創建一個線程來處理,不適
合高併發;Tomcat8以後的版本默認使用NIO模式(非阻塞式IO)。
當Tomcat併發性能有較高要求或者出現瓶頸時,我們可以嘗試使用APR模式,APR(Apache Portable Runtime)是從操作系統級別解決異步IO問題,使用時需要在操作系統上安裝APR和Native(因爲APR 原理是使用使用JNI技術調用操作系統底層的IO接口)
5、動靜分離
可以使用Nginx+Tomcat相結合的部署方案,Nginx負責靜態資源訪問,Tomcat負責Jsp等動態資源訪問處理(因爲Tomcat不擅⻓處理靜態資源)。