SpringBoot内置tomcat参数调优,最大连接数、队列长度、最大工作线程数、最小工作线程数

32 篇文章 1 订阅
1 篇文章 0 订阅

一、背景

因为看到一道面试题,问SpringBoot默认可以接受的最大并发量是多少,这个问题其实考的是web服务器的配置,因为SpringBoot默认的web服务器是tomcat,于是去了解了一下tomcat的相关配置

二、tomcat的相关配置以及默认值

/**
 * Maximum number of connections that the server accepts and processes at any
 * given time. Once the limit has been reached, the operating system may still
 * accept connections based on the "acceptCount" property.
 */
private int maxConnections = 10000;

/**
 * Maximum queue length for incoming connection requests when all possible request
 * processing threads are in use.
 */
private int acceptCount = 100;

/**
 * Maximum amount of worker threads.
 */
private int maxThreads = 200;

/**
 * Minimum amount of worker threads.
 */
private int minSpareThreads = 10;
  • maxConnections:服务器在任何给定时间接受和处理的最大连接数。一旦达到限制,操作系统仍然可以接受基于“acceptCount”属性的连接。
  • acceptCount:当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。
  • maxThreads:最大工作线程数。
  • minSpareThreads:最小工作线程数。

这里需要留意的是maxConnections的描述,可以理解为服务器达到最大连接数之后,仍然可以通过acceptCount来接收请求,所以SpringBoot可以接受的最大并发量应该是maxConnections+acceptCount,也就是10100。这是按照tomcat能接受的最大任务量来算的,可以接受这么多连接,但并不是同时在处理的任务数量,同时处理的任务数量看的是tomcat的最大工作线程数。

三、动手做实验

下面我手动改了下tomcat的这几个配置,然后写了一个测试接口,用JMeter测试了一下
首先把yaml中的默认配置改下

server:
  port: 8002
  tomcat:
    #最大连接数
    max-connections: 20
    #最大队列长度
    accept-count: 3
    #最小工作线程数
    min-spare-threads: 5
    #最大工作线程数
    max-threads: 10

写一个测试接口

@GetMapping("/test")
public String test() {
    log.info("线程:{}", Thread.currentThread().getName());
    return "success";
}

配置下JMeter,用20个并发
图片.png执行完,全部成功,控制台打印如下
图片.png可以看到,因为执行很快,所以只用到了最小的工作线程数5个
下面我们让线程阻塞,睡个3s

@GetMapping("/test")
public String test() throws Exception {
    log.info("线程:{}", Thread.currentThread().getName());
    Thread.sleep(3000);
    return "success";
}

再跑下JMeter,可以看到控制台打印如下
图片.png这时候达到了最大的工作线程数10个
下面加到并发数量,看看效果,把并发数量调到30
图片.png跑一下,可以得到如下结果
图片.png有7次请求是失败的,报错是Connection refused: connect 连接被拒绝
看下控制台
图片.png有23条日志记录
为什么是23条请求被成功处理了呢,原因是最大连接数的20,加上最大队列长度的3,大概的处理步骤如下

  • 30条请求在同一时间发起,有7条直接被拒绝,23条接收
  • 因为最大工作线程是10,所以先处理了10条请求
  • 10条处理完成之后,继续处理后面10条
  • 最后处理剩下的3条

四、举个例子

用下面的参数,我们用去饭馆吃饭举个例子

#最大连接数
max-connections: 20
#最大队列长度
accept-count: 3
#最小工作线程数
min-spare-threads: 5
#最大工作线程数
max-threads: 10

有30个请求,就好比有30个人想到这家饭馆吃饭,但是饭馆最多只能容纳20个人(max-connections),饭馆外面能还可以有3个人(accept-count)排队等待,剩下的7个人就直接走了,而这个饭店平时有5个厨师(min-spare-threads)炒菜,当这些厨师忙不过来的时候,就会增加到10个厨师(max-threads)来炒菜。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值