现象
分析 jstack 堆栈时,发现相当多线程阻塞在此处:
查看源码发现 Tomcat 彼时在创建 Processor。
分析
创建 Processor 是很正常的逻辑,但发生大量线程 BLOCK 在这个位置,说明 Tomcat 在处理请求时,在频繁的创建 Processor,也就是说明 Processor 数量不够。
根据 Tomcat 文档 ,processorCache至少应该等于 maxThreads,而项目上 maxThreads=1000,processorCache 没有设置,即默认值为 200。
解决
项目是 SpringBoot 项目,processorCache 没有办法通过 application.properties 来配置,但是可以通过 EmbeddedServletContainerCustomizer 来配置,文档见此:
所以提供这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component;
@Component
public class TomcatCustomizationBean implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (TomcatEmbeddedServletContainerFactory.class.equals(container.getClass())) {
TomcatEmbeddedServletContainerFactory tomcatContainer = (TomcatEmbeddedServletContainerFactory) container;
tomcatContainer.addConnectorCustomizers(connector -> connector.setProperty("processorCache", "1000"));
}
}
}
|
验证
可通过 jvisualvm 查看 Tomcat 的 MBean 看到此参数设置正确。
评论