首先看看springboot內(nèi)置的tomcat,該如何配置這兩個(gè)參數(shù)
# 在配置文件中添加如下內(nèi)容
# tomcat最大線程數(shù)钾唬,默認(rèn)為200
server.tomcat.max-threads=200
# tomcat最大連接數(shù),默認(rèn)為10000(網(wǎng)上的說法)
server.tomcat.max-connections=300
如何理解上面兩個(gè)參數(shù)
為了方便理解奕巍,我這里使用了springboot編寫了一個(gè)簡(jiǎn)單了的服務(wù)的止,包含一個(gè)模擬登錄的接口着撩,并使用jmeter進(jìn)行測(cè)試,不了解jmeter如何使用的朋友可以翻看我的歷史文章氓润。部分代碼如下
// java 代碼
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UsersRepository usersRepository;
@PostMapping("/login")
public String login(Users user) throws InterruptedException {
// 這里將線程掛起3秒咖气,方便觀察結(jié)果
Thread.sleep(3000);
Users checkUser = usersRepository.findByName(user.getName());
if(checkUser == null)
return "用戶不存在";
if(!checkUser.getPassword().equals(user.getPassword()))
return "密碼錯(cuò)誤";
System.out.println("用戶:" + checkUser.getName() + ",登錄成功");
return "登錄成功";
}
}
接下來挖滤,設(shè)置jmeter中的線程數(shù),分別測(cè)試以下場(chǎng)景返回的結(jié)果
注意:我在java代碼中添加將線程掛起3秒的語句伶唯,實(shí)際的響應(yīng)時(shí)間應(yīng)該減去3秒
- 場(chǎng)景1:并發(fā)請(qǐng)求數(shù) <= tomcat最大線程數(shù)200
結(jié)論:可以看到200個(gè)請(qǐng)求抵怎,平均響應(yīng)時(shí)間為(3156-3000)=156ms,最小響應(yīng)時(shí)間為23ms,最大響應(yīng)時(shí)間為336ms,響應(yīng)結(jié)果正常尝艘。
- 場(chǎng)景2:并發(fā)數(shù) >tomcat最大線程數(shù)200,以下我將jmeter線程數(shù)設(shè)置為201秒际,再來看看結(jié)果
看了下,平均值闽颇,最小值好像沒什么異常寄锐,但是最大值卻去到了5606毫秒,接近6S的時(shí)間剩膘。為什么會(huì)有個(gè)接近6S的最大值怠褐,原因很簡(jiǎn)單您宪,因?yàn)閠omcat最大的線程數(shù)為200,201的并發(fā)請(qǐng)求量,超出了并發(fā)處理的數(shù)量200筐赔,多出來的1個(gè)請(qǐng)求揖铜,需要等待某個(gè)處理中的請(qǐng)求處理完成。
這里我翻看了jmeter中大部分的http請(qǐng)求贿肩,驗(yàn)證了我的想法龄寞。大部分的http請(qǐng)求,響應(yīng)時(shí)間都是3000多毫秒溜哮,只有最后一個(gè)響應(yīng)的請(qǐng)求色解,響應(yīng)的時(shí)間為5606毫秒科阎,截圖如下
- 場(chǎng)景3:請(qǐng)求數(shù)超過最大連接數(shù)300,這里將jmeter并發(fā)線程數(shù)設(shè)置為600
可以看到有大量的沒有正常響應(yīng)的http請(qǐng)求道批,原因很簡(jiǎn)單入撒,因?yàn)槌^了tomcat設(shè)置的最大連接數(shù),服務(wù)器拒絕了該次請(qǐng)求的連接