背景
因为tomcat的http线程池,默认是200, 如果线程池耗尽,则会出现无法提供服务的情况。
故障模拟
某些情况下,可能http的TPS不高,但是内部程序有bug,导致了tomcat的http线程池的卡死。本文将会总结1分钟内排查出问题的方法。以下为示例:
假设有一个Controller方法,模拟调用某个业务:
@RestController
@RequestMapping("/biz")
public class BizController {
@GetMapping("/fire")
public String fire(){
return RpcInvoker.getUserInfo();
}
}
模拟业务的代码,这段逻辑中,readline里面是有锁的保护,不允许并发读取:
public class RpcInvoker {
public static String getUserInfo(){
Scanner scanner = new Scanner(System.in);
scanner.nextLine();
return "done";
}
}
此时,使用ApiPost进行批量调用,或者 PostMan也行,我比较喜欢用ApiPost,使用【一键压测】功能,并发数超过200,举例:改到300。