Tomcat的吞吐量大小取決Io的很大的因素,同時可以通過調整啟動項目中的配置,來做一些性能的提升。
重要的三個配置項:maxConnections、maxThreads、acceptCount。
首先來看下maxConnections最連接數、maxThreads最大線程數、acceptCount等待線程數
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
一、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的值。
秒懂:tomcat的maxConnections、maxThreads、acceptCount 圖解