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


后面附圖 | 秒懂

瘋狂創客圈 Java 高並發【 億級流量聊天室實戰】實戰系列 【博客園總入口


前言

瘋狂創客圈(筆者尼恩創建的高並發研習社群)Springcloud 高並發系列文章,將為大家介紹三個版本的 高並發秒殺:

一、版本1 :springcloud + zookeeper 秒殺

二、版本2 :springcloud + redis 分布式鎖秒殺

三、版本3 :springcloud + Nginx + Lua 高性能版本秒殺

以及有關Springcloud 幾篇核心、重要的文章

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

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

三、Feign Ribbon Hystrix 三者關系 , 史上最全 深度解析

四、SpringCloud gateway 詳解 , 史上最全

五、圖解: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的具體含義是什么呢?參考官方文檔,對三者的含義說明如下:

一、accept-count:最大等待數

官方文檔的說明為:當所有的請求處理線程都在使用時,所能接收的連接請求的隊列的最大長度。當隊列已滿時,任何的連接請求都將被拒絕。accept-count的默認值為100。
詳細的來說:當調用HTTP請求數達到tomcat的最大線程數時,還有新的HTTP請求到來,這時tomcat會將該請求放在等待隊列中,這個acceptCount就是指能夠接受的最大等待數,默認100。如果等待隊列也被放滿了,這個時候再來新的請求就會被tomcat拒絕(connection refused)。

二、maxThreads:最大線程數

每一次HTTP請求到達Web服務,tomcat都會創建一個線程來處理該請求,那么最大線程數決定了Web服務容器可以同時處理多少個請求。maxThreads默認200,肯定建議增加。但是,增加線程是有成本的,更多的線程,不僅僅會帶來更多的線程上下文切換成本,而且意味着帶來更多的內存消耗。JVM中默認情況下在創建新線程時會分配大小為1M的線程棧,所以,更多的線程異味着需要更多的內存。線程數的經驗值為:1核2g內存為200,線程數經驗值200;4核8g內存,線程數經驗值800。

三、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) 聊天程序【 億級流量】實戰 開源項目實戰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM