基本情況
???????當(dāng)一個(gè)進(jìn)程有 500 個(gè)線程在跑的話,那性能已經(jīng)是很低很低了。Tomcat 默認(rèn)配置的最大請(qǐng)求數(shù)是 150豪娜,也就是說同時(shí)支持 150 個(gè)并發(fā),當(dāng)然了绒疗,也可以將其改大侵歇。
擴(kuò)容建議
???????當(dāng)某個(gè)應(yīng)用擁有 250 個(gè)以上并發(fā)的時(shí)候,應(yīng)考慮應(yīng)用服務(wù)器的集群吓蘑。
硬件限制
???????具體能承載多少并發(fā)惕虑,需要看硬件的配置。Tomcat的最大并發(fā)數(shù)是可以配置的磨镶,實(shí)際運(yùn)用中溃蔫,最大并發(fā)數(shù)與硬件性能和CPU數(shù)量都有很大關(guān)系的。更好的硬件琳猫,更多的處理器都會(huì)使Tomcat支持更多的并發(fā)伟叛,但也會(huì)加重 GC 的負(fù)擔(dān)。
系統(tǒng)限制
???????操作系統(tǒng)對(duì)于進(jìn)程中的線程數(shù)有一定的限制:
??????????????Windows 每個(gè)進(jìn)程中的線程數(shù)不允許超過 2000
??????????????Linux 每個(gè)進(jìn)程中的線程數(shù)不允許超過 1000
java虛擬機(jī)
???????在 Java 中每開啟一個(gè)線程需要耗用 1MB 的 JVM 內(nèi)存空間用于作為線程棧之用脐嫂。
通信方式的區(qū)別(阻塞和非阻塞)
???????Tomcat 默認(rèn)的 HTTP 實(shí)現(xiàn)是采用阻塞式的 Socket 通信统刮,每個(gè)請(qǐng)求都需要?jiǎng)?chuàng)建一個(gè)線程處理。這種模式下的并發(fā)量受到線程數(shù)的限制账千,但對(duì)于 Tomcat 來說幾乎沒有 BUG 存在了侥蒙。
???????Tomcat 還可以配置 NIO 方式的 Socket 通信,在性能上高于阻塞式的匀奏,每個(gè)請(qǐng)求也不需要?jiǎng)?chuàng)建一個(gè)線程進(jìn)行處理鞭衩,并發(fā)能力比前者高。但沒有阻塞式的成熟。
業(yè)務(wù)邏輯的影響
???????這個(gè)并發(fā)能力還與應(yīng)用的邏輯密切相關(guān)论衍,如果邏輯很復(fù)雜需要大量的計(jì)算瑞佩,那并發(fā)能力勢(shì)必會(huì)下降。如果每個(gè)請(qǐng)求都含有很多的數(shù)據(jù)庫(kù)操作坯台,那么對(duì)于數(shù)據(jù)庫(kù)的性能也是非常高的炬丸。
總結(jié)
???????對(duì)于單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器來說,允許客戶端的連接數(shù)量是有限制的捂人。并發(fā)能力問題涉及整個(gè)系統(tǒng)架構(gòu)和業(yè)務(wù)邏輯御雕。系統(tǒng)環(huán)境不同,Tomcat版本不同滥搭、JDK版本不同酸纲、以及修改的設(shè)定參數(shù)不同。并發(fā)量的差異還是滿大的瑟匆。
相關(guān)配置參數(shù)
???????maxThreads="1000" 最大并發(fā)數(shù)
???????minSpareThreads="100"http:///初始化時(shí)創(chuàng)建的線程數(shù)
???????maxSpareThreads="500"http:///一旦創(chuàng)建的線程超過這個(gè)值闽坡,Tomcat就會(huì)關(guān)閉不再需要的socket線程。
???????acceptCount="700"http:// 指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí)愁溜,可以放到處理隊(duì)列中的請(qǐng)求數(shù)疾嗅,超過這個(gè)數(shù)的請(qǐng)求將不予處理