電腦環境:window10 i5-7200U 4核
Tomcat版本:apache-tomcat-8.5.57
壓測工具:jemeter 并發數為4000左右,該并發數為多次測試的結果,受電腦性能,資料包的大小等因素影響
部署一個Springboot 應用,建立一個rest接口用來測試,下面是響應資料(不連接配接資料庫):
{"1":"張三1","2":"張三1","3":"張三1","4":"張三1","5":"張三1","6":"張三1","7":"張三1","8":"張三1","9":"張三1","10":"張三1"}
一、官網下載下傳tomcat https://tomcat.apache.org/download-80.cgi
二、部署一個javaweb項目, jmeter 對接口進行壓力測試
三、開始測試:
1、 選擇jmeter線程組測試, 設定并發數

2、在選擇HTTP Request
3、添加監測結果
4、多次測試結果
壓力測試從1000,逐漸增加,經過多次測試,發現在在預設配置下,4000的并發,Tomcat的吞吐量能達到峰值,大概在1000左右
在4000并發條件下,多次測試,會報錯,用戶端連接配接錯誤,應該是連接配接數達到上限,後續連接配接被拒絕,是以這個為後續優化提供了參考,提高Tomcat連接配接池數量,預設隻有一百多
用java自帶的工具,jconsole 、jvisualvm來監控jvm狀況,可以清楚的看見垃圾回收情況,進過不斷的壓力測試,發現年輕代經常發生垃圾回收,說明兩個問題:記憶體配置設定太小、垃圾回收效率,可見适當增加堆記憶體、選擇垃圾回收器也是一個優化的方向。Tomcat預設采用Parallel Scavenge(年輕代)、Concurrent Mark Sweep(老年代),可優化為G1垃圾回收器
四、調整Tomcat參數
1、提高Tomcat線程池數量,效果明顯
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>
2、進一步優化Tomcat啟動JVM參數, 在catalina.bat 檔案開頭設定相關參數
set JAVA_OPTS=-Xms2048m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log
發老年代、年輕代垃圾回收的次數減少了, 也可對gc日志進行分析
3、繼續優化,使用G1GC,發現已沒有full GC了,暫停時間大大縮短,堆記憶體一直處于健康狀态
set JAVA_OPTS=-XX:+UseG1GC -Xms512m -Xmx2048m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log
總結:對Tomcat進行調優無非從以下幾個方面
1、在server.xm <Connector/>标簽中配置 Tomcat的executor="tomcatThreadPool",适當增加線程數量,壓測到最佳值。
2、優化Tomcat catalina.bat(Linux中catalina.sh)中啟動參數,适當增加記憶體
3、優化Tomcat預設的垃圾回收機制
4、優化web.xml 中一些多餘的配置,減少資源開銷
文章詳情請檢視: http://www.xiaoyuge.com.cn/#/article/detail?articleId=62