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,再來看看結果
image.png

看了下,平均值,最小值好像沒什么異常,但是最大值卻去到了5606毫秒,接近6S的時間。為什么會有個接近6S的最大值,原因很簡單,因為tomcat最大的線程數為200,201的并發請求量,超出了并發處理的數量200,多出來的1個請求,需要等待某個處理中的請求處理完成。

這里我翻看了jmeter中大部分的http請求,驗證了我的想法。大部分的http請求,響應時間都是3000多毫秒,只有最后一個響應的請求,響應的時間為5606毫秒,截圖如下

image.png
  • 場景3:請求數超過最大連接數300,這里將jmeter并發線程數設置為600
異常數量由原本的百分之0變成37.45%
image.png

可以看到有大量的沒有正常響應的http請求,原因很簡單,因為超過了tomcat設置的最大連接數,服務器拒絕了該次請求的連接

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容