Tomcat配置之連接數(shù)設(shè)置方式
1 連接數(shù)參數(shù)介紹
回顧一下Tomcat處理請求的過程:
- 在accept隊列中接收連接(當客戶端向服務(wù)器發(fā)送請求時,如果客戶端與OS完成三次握手建立了連接,則OS將該連接放入accept隊列);
- 在連接中獲取請求的數(shù)據(jù),生成request;
- 調(diào)用servlet容器處理請求;返回response。
對應(yīng)的,Connector中的幾個參數(shù)功能如下:
1.1 acceptCount
accept隊列的長度;當accept隊列中連接的個數(shù)達到acceptCount時,隊列滿,進來的請求一律被拒絕,默認值是100(跟tomcat版本有關(guān)系)
1.2 maxConnections
Tomcat在任意時刻接收和處理的最大連接數(shù)。當Tomcat接收的連接數(shù)達到maxConnections時,Acceptor線程不會讀取accept隊列中的連接;這時accept隊列中的線程會一直阻塞著,直到Tomcat接收的連接數(shù)小于maxConnections。
如果設(shè)置為-1,則連接數(shù)不受限制。默認值與連接器使用的協(xié)議有關(guān):NIO的默認值是10000,APR/native的默認值是8192,而BIO的默認值為maxThreads(如果配置了Executor,則默認值是Executor的maxThreads)。在windows下,APR/native的maxConnections值會自動調(diào)整為設(shè)置值以下最大的1024的整數(shù)倍;如設(shè)置為2000,則最大值實際是1024。
1.3 maxThreads
請求處理線程的最大數(shù)量。默認值是200(Tomcat7和8都是的)。
如果該Connector綁定了Executor,這個值會被忽略,因為該Connector將使用綁定的Executor,而不是內(nèi)置的線程池來執(zhí)行任務(wù)。
maxThreads規(guī)定的是最大的線程數(shù)目,并不是實際running的CPU數(shù)量;實際上,maxThreads的大小比CPU核心數(shù)量要大得多。
這是因為,處理請求的線程 真正用于計算的時間可能很少,大多數(shù)時間可能在阻塞,如等待數(shù)據(jù)庫返回數(shù)據(jù)、等待硬盤讀寫數(shù)據(jù)等。
因此,在某一時刻,只有少數(shù)的線程 真正的在使用物理CPU,大多數(shù)線程都在等待;因此線程數(shù)遠大于物理核心數(shù)才是合理的。
換句話說,Tomcat通過使用比CPU核心數(shù)量多得多的線程數(shù),可以使CPU忙碌起來,大大提高CPU的利用率。
2 參數(shù)配置
為了確保服務(wù)不會被過多的http長連接壓垮,我們需要對tomcat設(shè)定個最大連接數(shù),超過這個連接數(shù)的請求會拒絕,讓其負載到其它機器,達到保護自己的同時起到連接數(shù)負載均衡的作用。
tomcat的并發(fā)數(shù)由以下兩個參數(shù)決定:
- maxThreads:tomcat啟動的最大線程數(shù),即同時處理的任務(wù)個數(shù),默認值為200
- acceptCount:當tomcat起動的線程數(shù)達到最大時,接受排隊的請求個數(shù),默認值為100
這兩個值如何起作用,請看下面三種情況
- 情況1:接受一個請求,此時tomcat起動的線程數(shù)沒有到達maxThreads,tomcat會起動一個線程來處理此請求。
- 情況2:接受一個請求,此時tomcat起動的線程數(shù)已經(jīng)到達maxThreads,tomcat會把此請求放入等待隊列,等待空閑線程。
- 情況3:接受一個請求,此時tomcat起動的線程數(shù)已經(jīng)到達maxThreads,等待隊列中的請求個數(shù)也達到了acceptCount,此時tomcat會直接拒絕此次請求,返回connection refused
默認情況下,tomcat最大連接數(shù)和最大并發(fā)數(shù)默認是10000和200
同時加上maxConnections

原來tomcat最大連接數(shù)取決于maxConnections這個值加上acceptCount這個值,在連接數(shù)達到了maxConenctions之后,tomcat仍會保持住連接,但是不處理,等待其它請求處理完畢之后才會處理這個請求。
tomcat的最大連接數(shù)參數(shù)是maxConnections,這個值表示最多可以有多少個socket連接到tomcat上。
BIO模式下默認最大連接數(shù)是它的最大線程數(shù)(缺省是200),NIO模式下默認是10000,APR模式則是8192(windows上則是低于或等于maxConnections的1024的倍數(shù))。如果設(shè)置為-1則表示不限制。
3 總結(jié)
3.1 tomcat能支持最大連接數(shù)
由maxConnections加上acceptCount來決定。同時maxThreads如何設(shè)定?
一般的服務(wù)器操作都包括兩方面:1計算(主要消耗cpu),2等待(io、數(shù)據(jù)庫等)
- 第一種極端情況,如果我們的操作是純粹的計算,那么系統(tǒng)響應(yīng)時間的主要限制就是cpu的運算能力,此時maxThreads應(yīng)該盡量設(shè)的小,降低同一時間內(nèi)爭搶cpu的線程個數(shù),可以提高計算效率,提高系統(tǒng)的整體處理能力。
- 第二種極端情況,如果我們的操作純粹是IO或者數(shù)據(jù)庫,那么響應(yīng)時間的主要限制就變?yōu)榈却獠抠Y源,此時maxThreads應(yīng)該盡量設(shè)的大,這樣才能提高同時處理請求的個數(shù),從而提高系統(tǒng)整體的處理能力。此情況下因為tomcat同時處理的請求量會比較大,所以需要關(guān)注一下tomcat的虛擬機內(nèi) 存設(shè)置和linux的open file限制。
現(xiàn)實應(yīng)用中,我們的操作都會包含以上兩種類型(計算、等待),所以maxThreads的配置并沒有一個最優(yōu)值,一定要根據(jù)具體情況來配置。
最好的做法是:在不斷測試的基礎(chǔ)上,不斷調(diào)整、優(yōu)化,才能得到最合理的配置。
acceptCount的配置,我一般是設(shè)置的跟maxThreads一樣大,這個值應(yīng)該是主要根據(jù)應(yīng)用的訪問峰值與平均值來權(quán)衡配置的。
如果設(shè)的較小,可以保證接受的請求較快相應(yīng),但是超出的請求可能就直接被拒絕
如果設(shè)的較大,可能就會出現(xiàn)大量的請求超時的情況,因為我們系統(tǒng)的處理能力是一定的
3.2 linux下使用tomcat命令備注
3.2.1 linux下查看apache當前并發(fā)訪問數(shù)
netstat -an | grep ESTABLISHED | wc -l
對比httpd.conf中MaxClients的數(shù)字差距多少。
3.2.2 查看有多少個進程數(shù)
ps aux|grep httpd|wc -l
3.2.3 可以使用如下參數(shù)查看數(shù)據(jù)
ps -ef | grep httpd | wc -l 1388
統(tǒng)計httpd進程數(shù),每個請求會啟動一個進程,使用于Apache服務(wù)器。
1388表示Apache能夠處理1388個并發(fā)請求,這個值A(chǔ)pache可根據(jù)負載情況自動調(diào)整。
#netstat -nat|grep -i "80"|wc -l 4341
netstat -an會打印系統(tǒng)當前網(wǎng)絡(luò)鏈接狀態(tài),而grep -i "80"是用來提取與80端口有關(guān)的連接的,wc -l進行連接數(shù)統(tǒng)計。
最終返回的數(shù)字就是當前所有80端口的請求總數(shù)。
netstat -na|grep ESTABLISHED|wc -l 376
netstat -an會打印系統(tǒng)當前網(wǎng)絡(luò)鏈接狀態(tài),而grep ESTABLISHED 提取出已建立連接的信息。 然后wc -l統(tǒng)計。
最終返回的數(shù)字就是當前所有80端口的已建立連接的總數(shù)。
Bat代碼
netstat -nat||grep ESTABLISHED|wc
可查看所有建立連接的詳細記錄
查看Apache的并發(fā)請求數(shù)及其TCP連接狀態(tài):
Linux命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'返回結(jié)果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的
SYN_RECV:表示正在等待處理的請求數(shù);ESTABLISHED:表示正常數(shù)據(jù)傳輸狀態(tài);TIME_WAIT:表示處理完畢,等待超時結(jié)束的請求數(shù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Apache Tomcat服務(wù)器版本號隱藏的幾種方法
本文主要介紹了Apache Tomcat服務(wù)器版本號隱藏的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01
redission-tomcat快速實現(xiàn)從單機部署到多機部署詳解
這篇文章主要介紹了redission-tomcat快速實現(xiàn)從單機部署到多機部署詳解,本文介紹一個基于redis的tomcat session管理開源項目:redission-tomcat,可無代碼侵入式地快速實現(xiàn)session共享,需要的朋友可以參考下2019-06-06
解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題
這篇文章主要介紹了解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
tomcat訪問(access)日志配置和記錄Post請求參數(shù)
這篇文章主要介紹了tomcat訪問(access)日志配置和記錄Post請求參數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Tomcat starup.bat腳本開機自啟動的實現(xiàn)
本文主要介紹了Tomcat starup.bat腳本開機自啟動的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

