SpringBoot 内置 Tomcat 线程数优化配置

SpringBoot 内置 Tomcat 线程数优化配置_第1张图片

前言

本文解析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

你可能感兴趣的:(Java,Tomcat,tomcat,spring,boot,java)