主要對tomcat的參數做一些記錄(jmeter和tomcat在同一個計算機,可能引起測試誤差)
我的計算機配置 4核8線程 8G內存
案例一
tomcat JVM 1.8G堆內存,無數據庫操作
#最大線程數
server.tomcat.maxThreads =10000
#這個參數是指在同一時間,tomcat能夠接受的最大連接數,一般這個值要大於maxThreads+acceptCount
server.tomcat.maxConnections =20000
#當線程數量達到最大線程數時所允許的最大等待隊列的長度
server.tomcat.acceptCount =200
#最小空閑線程數
server.tomcat.minSpareThreads =10
| 並發數 | 平均響應時間 | 響應時間中位數 | 90%用戶的響應時間 | 95%用戶的響應時間 | 99%用戶的響應時間 | 最小響應時間 | 最大響應時間 | 錯誤率 | 吞吐量(s) | 每秒發送的數據(KB) | 每秒接受的數據(KB) | |
| HTTP Request | 1000 | 354 | 337 | 850 | 862 | 873 | 1 | 879 | 0.0% | 887.3 | 103.9 | 274.6 |
| HTTP Request | 5000 | 1000 | 1047 | 1725 | 2009 | 2422 | 94 | 2721 | 0.0% | 802.9 | 94.0 | 248.5 |
| HTTP Request | 10000 | 1692 | 1389 | 3265 | 3582 | 3918 | 137 | 6016 | 0.0% | 699.8 | 78.5 | 207.3 |
| HTTP Request | 15000 | 1166 | 945 | 2565 | 2877 | 3958 | 5 | 5347 | 47.3% | 496.7 | 611.7 | 80.9 |
| HTTP Request | 20000 | 1477 | 1355 | 2883 | 3244 | 4273 | 5 | 5298 | 17.7% | 680.2 | 363.8 | 172.2 |
分析:在tomcat允許最大10000線程的情況下,並發數越大,響應時間越長,吞吐量越小。在某時刻會發生連接錯誤。
案例二
tomcat JVM 1.8G堆內存,無數據庫操作
#最大線程數
server.tomcat.maxThreads =800
#這個參數是指在同一時間,tomcat能夠接受的最大連接數,一般這個值要大於maxThreads+acceptCount
server.tomcat.maxConnections =20000
#當線程數量達到最大線程數時所允許的最大等待隊列的長度
server.tomcat.acceptCount =200
#最小空閑線程數
server.tomcat.minSpareThreads =10
| 並發數 | 平均響應時間 | 響應時間中位數 | 90%用戶的響應時間 | 95%用戶的響應時間 | 99%用戶的響應時間 | 最小響應時間 | 最大響應時間 | 錯誤率 | 吞吐量(s) | 每秒發送的數據(KB) | 每秒接受的數據(KB) | |
| HTTP Request | 1000 | 1806 | 2019 | 2356 | 2410 | 2497 | 975 | 2582 | 0.0% | 385.8 | 45.2 | 119.4 |
| HTTP Request | 5000 | 2353 | 2210 | 3582 | 4159 | 4341 | 618 | 4538 | 49.74% | 874.3 | 1255.4 | 136.0 |
分析:在tomcat允許最大800線程的情況下,並發數不能超過800太多(1000可以),不然會有很多的請求會因為tomcat的接受請求線程全被占用而被tomcat服務器拒絕接受。Address already in use: connect
案例三
tomcat JVM 1.8G堆內存,無數據庫操作
#最大線程數
server.tomcat.maxThreads =20000
#這個參數是指在同一時間,tomcat能夠接受的最大連接數,一般這個值要大於maxThreads+acceptCount
server.tomcat.maxConnections =30000
#當線程數量達到最大線程數時所允許的最大等待隊列的長度
server.tomcat.acceptCount =200
#最小空閑線程數
server.tomcat.minSpareThreads =10
| 並發數 | 平均響應時間 | 響應時間中位數 | 90%用戶的響應時間 | 95%用戶的響應時間 | 99%用戶的響應時間 | 最小響應時間 | 最大響應時間 | 錯誤率 | 吞吐量(s) | 每秒發送的數據(KB) | 每秒接受的數據(KB) | |
| HTTP Request | 20000 | 1638 | 1330 | 3210 | 3872 | 4382 | 4 | 4619 | 13.26% | 717.6 | 311.8 | 192.6 |
| HTTP Request | 15000 | 1597 | 1406 | 315 | 3276 | 4116 | 3 | 4994 | 1.22% | 767.2 | 114.7 | 234.6 |
| HTTP Request | 8000 | 1726 | 1729 | 2905 | 2993 | 4099 | 82 | 4768 | 0.0% | 797.7 | 94.8 | 246.8 |
| HTTP Request | 5000 | 2171 | 2073 | 3423 | 3844 | 4498 | 334 | 4892 | 0.0% | 753.1 | 100.6 | 231.7 |
| HTTP Request | 3000 | 2075 | 2214 | 3265 | 3391 | 3656 | 1 | 3736 | 0.0% | 712.8 | 83.53 | 220.6 |
| HTTP Request | 1000 | 461 | 565 | 843 | 874 | 992 | 2 | 998 | 0.0% | 796.2 | 93.3 | 246.4 |
分析:和案例一相比類似,最大線程數不是越大越好,線程數的增多或導致過多的線程上下文切換,耗費時間。導致單個響應時間的上升。
總結:maxThreads並沒有一個最優的值,需要根據系統的配置和項目內容來不斷地測試,調整和優化。最終得到合理的配置。在tomcat的配置相同的情況並且相同的並發下,響應時間,錯誤率,吞吐量也存在較大差異,主要是因為系統的真實環境不同,可能系統本來就有較多線程在運行。
5000並發
