springboot tomcat最大線程數與最大連接數解析
springboot tomcat最大線程數與最大連接數
首先看看springboot內置的tomcat,該如何配置這兩個參數
# 在配置文件中添加如下內容 # tomcat最大線程數,默認為200 server.tomcat.max-threads=200 # tomcat最大連接數,默認為10000(網上的說法) server.tomcat.max-connections=300
如何理解上面兩個參數
為瞭方便理解,我這裡使用瞭springboot編寫瞭一個簡單瞭的服務,包含一個模擬登錄的接口,並使用jmeter進行測試,不瞭解jmeter如何使用的朋友可以翻看我的歷史文章。部分代碼如下
// java 代碼 @RestController @RequestMapping("/user") public class UserController { @Autowired private UsersRepository usersRepository; @PostMapping("/login") public String login(Users user) throws InterruptedException { // 這裡將線程掛起3秒,方便觀察結果 Thread.sleep(3000); Users checkUser = usersRepository.findByName(user.getName()); if(checkUser == null) return "用戶不存在"; if(!checkUser.getPassword().equals(user.getPassword())) return "密碼錯誤"; System.out.println("用戶:" + checkUser.getName() + ",登錄成功"); return "登錄成功"; } }
接下來,設置jmeter中的線程數,分別測試以下場景返回的結果
註意:我在java代碼中添加將線程掛起3秒的語句,實際的響應時間應該減去3秒
場景1:並發請求數 <= tomcat最大線程數200
設置jmeter並發請求數量為200
結果統計
結論:可以看到200個請求,平均響應時間為(3156-3000)=156ms,最小響應時間為23ms,最大響應時間為336ms,響應結果正常。
場景2:並發數 >tomcat最大線程數200,以下我將jmeter線程數設置為201,再來看看結果
看瞭下,平均值,最小值好像沒什麼異常,但是最大值卻去到瞭5606毫秒,接近6S的時間。為什麼會有個接近6S的最大值,原因很簡單,因為tomcat最大的線程數為200,201的並發請求量,超出瞭並發處理的數量200,多出來的1個請求,需要等待某個處理中的請求處理完成。
這裡我翻看瞭jmeter中大部分的http請求,驗證瞭我的想法。大部分的http請求,響應時間都是3000多毫秒,隻有最後一個響應的請求,響應的時間為5606毫秒,截圖如下
場景3:請求數超過最大連接數300,這裡將jmeter並發線程數設置為600
異常數量由原本的百分之0變成37.45%
可以看到有大量的沒有正常響應的http請求,原因很簡單,因為超過瞭tomcat設置的最大連接數,服務器拒絕瞭該次請求的連接
SpringBoot中修改tomcat最大連接數、最大線程數、最大等待數
1)maxThreads(最大線程數)
每一次HTTP請求到達Web服務器,Web服務器都會創建一個線程來處理該請求,該參數決定瞭應用服務同時可以處理多少個HTTP請求,tomcat默認為200;
2)accepCount(最大等待數)
當調用Web服務的HTTP請求數達到tomcat的最大線程數時,還有新的HTTP請求到來,這時tomcat會將該請求放在等待隊列中,這個acceptCount就是指能夠接受的最大等待數,默認100.如果等待隊列也被放滿瞭,這個時候再來新的請求就會被tomcat拒絕(connection refused);
3)maxConnections(最大連接數)
這個參數是指在同一時間,tomcat能夠接受的最大連接數。一般這個值要大於maxThreads+acceptCount。
根據公司用戶量及機器配置信息,公司的最大連接數、最大線程數和最大等待數優化為:
#最大連接數 server.tomcat.max-connections=2000 #最大線程數 server.tomcat.max-threads=1000 #最大等待數 server.tomcat.accept-count=800
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot內置tomcat調優測試優化
- 解決SpringBoot內嵌Tomcat並發容量的問題
- 淺析Tomcat使用線程池配置高並發連接
- 使用Jmeter進行http接口測試的實踐
- 十五道tomcat面試題,為數不多的機會!