前言
本文解析springboot内置tomcat调优并发线程数的一些参数,并结合源码进行分析。
参数
线程池核心线程数
server.tomcat.min-spare-threads
:该参数为tomcat处理业务的核心线程数大小,默认值为10
线程池最大线程数
server.tomcat.max-threads
:该参数为tomcat处理业务的最大线程数大小,默认值为200,当对并发量有一点值时可以调大该参数
请求最大连接数
server.tomcat.max-connections:该参数为请求的最大连接数,默认值为10000,注意这个参数并不是设置在线程池上的,而是在tomcat的Acceptor类(专门处理连接的线程类)来控制的,结合源码我们可以看到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvkO6xZW-1677564662545)(/upload/2022/05/QQ%E6%88%AA%E5%9B%BE20220519082843.jpg)]
protected void countUpOrAwaitConnection() throws InterruptedException {
if (maxConnections==-1) return;
LimitLatch latch = connectionLimitLatch;
if (latch!=null) latch.countUpOrAwait();
}
可以看到当最大连接数满了之后会进行等待
accept-count
server.tomcat.accept-count
:这个参数实际上和tomcat没有太大关系,默认值为100
我们先看下文档的定义:
/**
* Allows the server developer to specify the acceptCount (backlog) that
* should be used for server sockets. By default, this value
* is 100.
*/
private int acceptCount = 100;
这个参数是服务端创建ServerSocket时操作系统控制同时连接的最大数量的,服务端接收连接是通过accept()来的,accept()是非常快的,所以accept-count的不需要太大,正常保持默认值100即可了,acceptCount这个参数和线程池无关,会被映射为backlog参数,是socket的参数,在源码的使用是在NioEndpoint类的initServerSocket方法,在tomcat中的名字是backlog在springboot内置tomcat中名字没有使用backlog而是使用acceptCount
serverSock.socket().bind(addr,getAcceptCount())
protected void initServerSocket() throws Exception {
if (!getUseInheritedChannel()) {
serverSock = ServerSocketChannel.open();
socketProperties.setProperties(serverSock.socket());
InetSocketAddress addr = (getAddress()!=null?new InetSocketAddress(getAddress(),getPort()):new InetSocketAddress