秒懂:tomcat的maxConnections、maxThreads、acceptCount 图解

后面附图 | 秒懂

疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【博客园总入口html


前言

疯狂创客圈(笔者尼恩建立的高并发研习社群)Springcloud 高并发系列文章,将为你们介绍三个版本的 高并发秒杀:java

1、版本1 :springcloud + zookeeper 秒杀程序员

2、版本2 :springcloud + redis 分布式锁秒杀面试

3、版本3 :springcloud + Nginx + Lua 高性能版本秒杀redis

以及有关Springcloud 几篇核心、重要的文章spring

1、Springcloud 配置, 史上最全 一文全懂windows

2、Springcloud 中 SpringBoot 配置全集 , 收藏版tomcat

3、Feign Ribbon Hystrix 三者关系 , 史上最全 深度解析并发

4、SpringCloud gateway 详解 , 史上最全app

5、图解:tomcat的maxConnections、maxThreads、acceptCount | 秒懂

本文,是《tomcat的maxConnections、maxThreads、acceptCount》篇,为你们解读tomcat的maxConnections、maxThreads、acceptCount,你们能够藏好,必定有用的到时候

怎么配置tomcat,才能使得本身的服务效率更高呢?

首先,这和tomcat的使用的IO模式有关

关于Java IO模式、以及IO处理的线程模型等基础的通讯框架的知识,是Java程序员的重要、必备的内功,具体请参见尼恩编著的《Netty、Zookeeper、Redis高并发实战》一书,这里不作过多的赘述。
其次,也和tomcat的配置参数有关

尤为是如下三个配置项:maxConnections、maxThreads、acceptCount。

1.4.1 Tomcat的高效配置

Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大链接数,最大线程数、最大的等待数,能够经过application.yml配置文件来改变这个三个值,一个标准的示例以下:

server:
  tomcat:
    uri-encoding: UTF-8
    #最大工做线程数,默认200, 4核8g内存,线程数经验值800
    #操做系统作线程之间的切换调度是有系统开销的,因此不是越多越好。
    max-threads: 1000
    # 等待队列长度,默认100
   accept-count: 1000
    max-connections: 20000
    # 最小工做空闲线程数,默认10, 适当增大一些,以便应对忽然增加的访问量
   min-spare-threads: 100

1.4.2 详解:maxConnections、maxThreads、acceptCount

tomcat中maxConnections、maxThreads、acceptCount的具体含义是什么呢?参考官方文档,对三者的含义说明以下:

1、accept-count:最大等待数

官方文档的说明为:当全部的请求处理线程都在使用时,所能接收的链接请求的队列的最大长度。当队列已满时,任何的链接请求都将被拒绝。accept-count的默认值为100。
详细的来讲:当调用HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指可以接受的最大等待数,默认100。若是等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。

2、maxThreads:最大线程数

每一次HTTP请求到达Web服务,tomcat都会建立一个线程来处理该请求,那么最大线程数决定了Web服务容器能够同时处理多少个请求。maxThreads默认200,确定建议增长。可是,增长线程是有成本的,更多的线程,不只仅会带来更多的线程上下文切换成本,并且意味着带来更多的内存消耗。JVM中默认状况下在建立新线程时会分配大小为1M的线程栈,因此,更多的线程异味着须要更多的内存。线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。

3、maxConnections:最大链接数

官方文档的说明为:

这个参数是指在同一时间,tomcat可以接受的最大链接数。对于Java的阻塞式BIO,默认值是maxthreads的值;若是在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。
对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能缘由,若是配置的值不是1024的倍数,maxConnections 的实际值将减小到1024的最大倍数。
若是设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的链接数。
maxConnections和accept-count的关系为:当链接数达到最大值maxConnections后,系统会继续接收链接,但不会超过acceptCount的值。

1.4.3 图解:maxConnections、maxThreads、acceptCount关系

用一个形象的比喻,通俗易懂的解释一下tomcat的最大线程数(maxThreads)、最大等待数(acceptCount)和最大链接数(maxConnections)三者之间的关系。

咱们能够把tomcat比作一个火锅店,流程是取号、入座、叫服务员,能够作一下三个形象的类比:
(1)acceptCount 最大等待数
能够类比为火锅店的排号处可以容纳排号的最大数量;排号的数量不是无限制的,火锅店的排号到了必定数据量以后,服务每每会说:已经客满。
(2)maxConnections 最大链接数
能够类比为火锅店的大堂的餐桌数量,也就是能够就餐的桌数。若是全部的桌子都已经坐满,则表示餐厅已满,已经达到了服务的数量上线,不能再有顾客进入餐厅了。
(3)maxThreads:最大线程数
能够类比为厨师的个数。每个厨师,在同一时刻,只能给一张餐桌炒菜,就像极了JVM中的一条线程。

整个就餐的流程,大体以下:

(1)取号:若是maxConnections链接数没有满,就不须要取号,由于还有空余的餐桌,直接被大堂服务员领上餐桌,点菜就餐便可。若是 maxConnections 链接数满了,可是取号人数没有达到 acceptCount,则取号成功。若是取号人数已达到acceptCount,则拿号失败,会获得Tomcat的Connection refused connect 的回复信息。
(2)上桌:若是有餐桌空出来了,表示maxConnections链接数没有满,排队的人,能够进入大堂上桌就餐。
(3)就餐:就餐须要厨师炒菜。厨师的数量,比顾客的数量,确定会少一些。一个厨师必定须要给多张餐桌炒菜,若是就餐的人越多,厨师也会忙不过来。这时候就能够增长厨师,一增长到上限maxThreads的值,若是仍是不够,只能是拖慢每一张餐桌的上菜速度,这种状况,就是你们常见的“上一道菜吃光了,下一道菜尚未上”尴尬场景。

maxConnections、maxThreads、acceptCount关系图以下

在这里插入图片描述

最后,介绍一下疯狂创客圈:疯狂创客圈,一个Java 高并发研习社群博客园 总入口

疯狂创客圈,倾力推出:面试必备 + 面试必备 + 面试必备 的基础原理+实战 书籍 《Netty Zookeeper Redis 高并发实战

img


疯狂创客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战

  • Netty 源码、原理、JAVA NIO 原理
  • Java 面试题 一网打尽
  • 疯狂创客圈 【 博客园 总入口 】