在 Spring Boot 框架中,我們使用最多的是Tomcat,這是 Spring Boot 默認(rèn)的容器技術(shù),而且是內(nèi)嵌式的 Tomcat。Tomcat 是 Apache 基金下的一個(gè)輕量級(jí)的Servlet 容 器 , 支 持 Servlet 和 JSP 。Tomcat服務(wù)器本身具有Web服務(wù)器的功能,可以作為獨(dú)立的Web服務(wù)器來(lái)使用。
一、Spring Boot應(yīng)用中Tomcat建議配置
Spring Boot 能支持的最大并發(fā)量主要看其對(duì)Tomcat的設(shè)置,可以在配置文件中對(duì)其進(jìn)行更改。要了解具體參數(shù)的默認(rèn)值,一個(gè)簡(jiǎn)單的方法是在application.properties 配置文件中輸入配置項(xiàng),默認(rèn)值就會(huì)顯示出來(lái)。
默認(rèn)配置:
最大工作線程數(shù),默認(rèn)200。
server.tomcat.max-threads=200
最大連接數(shù)默認(rèn)是10000
server.tomcat.max-connections=10000
等待隊(duì)列長(zhǎng)度,默認(rèn)100。
server.tomcat.accept-count=100
最小工作空閑線程數(shù),默認(rèn)10。
server.tomcat.min-spare-threads=10
對(duì)應(yīng)application.yml 配置文件如下所示:
server:
port: 9000
tomcat:
uri-encoding: UTF-8
max-threads: 800 #最大工作線程數(shù)量
min-spare-threads: 20 #最小工作線程數(shù)量
#max-connections: 10000 #一瞬間最大支持的并發(fā)的連接數(shù)
accept-count: 200 #等待隊(duì)列長(zhǎng)度
參數(shù)解釋
線程數(shù)的經(jīng)驗(yàn)值為:1核2G內(nèi)存,線程數(shù)經(jīng)驗(yàn)值200;4核8G內(nèi)存, 線程數(shù)經(jīng)驗(yàn)值800。
(4核8G內(nèi)存單進(jìn)程調(diào)度線程數(shù)800-1000,超過(guò)這個(gè)并發(fā)數(shù)之后,將會(huì)花費(fèi)巨大的時(shí)間在CPU調(diào)度上)
等待隊(duì)列長(zhǎng)度:隊(duì)列做緩沖池用,但也不能無(wú)限長(zhǎng),消耗內(nèi)存,出入隊(duì)列也耗CPU。
maxThreads規(guī)定的是最大的線程數(shù)目,并不是實(shí)際running的CPU數(shù)量;實(shí)際上,maxThreads的大小比CPU核心數(shù)量要大得多。這是因?yàn)?,處理?qǐng)求的線程真正用于計(jì)算的時(shí)間可能很少,大多數(shù)時(shí)間可能在阻塞,如等待數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù)、等待硬盤讀寫數(shù)據(jù)等。因此,在某一時(shí)刻,只有少數(shù)的線程真正的在使用物理CPU,大多數(shù)線程都在等待;因此線程數(shù)遠(yuǎn)大于物理核心數(shù)才是合理的。也就是說(shuō),Tomcat通過(guò)使用比CPU核心數(shù)量多得多的線程數(shù),可以使CPU忙碌起來(lái),大大提高CPU的利用率。
二、最大并發(fā)量-maxThreads和maxConnections參數(shù)
比較容易弄混的是maxThreads和maxConnections這兩個(gè)參數(shù):
maxThreads是指Tomcat線程池最多能起的線程數(shù)
maxConnections則是Tomcat一瞬間最多能夠處理的并發(fā)連接數(shù)。
比如 maxThreads=1000,maxConnections=800,
假設(shè)某一瞬間的并發(fā)是1000,那么最終Tomcat的線程數(shù)將會(huì)是800,即同時(shí)處理800個(gè)請(qǐng)求,剩余200進(jìn)入隊(duì)列“排隊(duì)”,如果acceptCount=100 (100個(gè)請(qǐng)求進(jìn)入排隊(duì)),另外100個(gè)請(qǐng)求會(huì)被拒掉。
并發(fā)量指的是連接數(shù),還是線程數(shù)?當(dāng)然是連接數(shù)(maxConnections) 。
200個(gè)線程如何處理10000條連接?
Tomcat有兩種處理連接的模式
一種是BIO,一個(gè)線程只處理一個(gè)Socket連接;
另一種就是NIO,一個(gè)線程處理多個(gè)Socket連接。
由于HTTP請(qǐng)求不會(huì)太耗時(shí),而且多個(gè)連接一般不會(huì)同時(shí)來(lái)消息,所以一個(gè)線程處理多個(gè)連接沒有太大問(wèn)題。
Tomcat的最大連接數(shù)參數(shù)是maxConnections,這個(gè)值表示最多可以有多少個(gè)Socket 連接到Tomcat上。
BIO模式下默認(rèn)最大連接數(shù)是它的最大線程數(shù)(缺省是200),
NIO模式下默認(rèn)是10000 ,APR模式則是8192。
為什么不開更多線程?
多開線程的代價(jià)就是增加上下文切換的時(shí)間,浪費(fèi)CPU時(shí)間。另外還有就是線程數(shù)增多,每個(gè)線程分配到的時(shí)間片就變少。多開線程并不等于提高處理效率。
那增加最大連接數(shù)(maxConnections)呢?
增加最大連接數(shù),支持的并發(fā)量確實(shí)可以上去。但是在沒有改變硬件條件的情況下,這種并發(fā)量的提升必定以犧牲響應(yīng)時(shí)間為代價(jià)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-522275.html
三、maxConnections和acceptCount參數(shù)
maxConnections 和acceptCount的關(guān)系為:當(dāng)連接數(shù)達(dá)到最大值maxConnections后,系統(tǒng)會(huì)繼續(xù)接收連接,進(jìn)行排隊(duì),但不會(huì)超過(guò)acceptCount的值。
Tomcat最大連接數(shù)取決于maxConnections這個(gè)值加上acceptCount這個(gè)值,在連接數(shù)達(dá)到了maxConenctions之后,Tomcat仍會(huì)保持住連接,但是不處理,等待其它請(qǐng)求處理完畢之后才會(huì)處理這個(gè)請(qǐng)求。
當(dāng)隊(duì)列(acceptCount)已滿時(shí),任何的連接請(qǐng)求都將被拒絕。acceptCount的默認(rèn)值為100。簡(jiǎn)而言之,當(dāng)調(diào)用HTTP請(qǐng)求數(shù)達(dá)到Tomcat的最大連接數(shù)時(shí),還有新的HTTP請(qǐng)求到來(lái),這時(shí)Tomcat會(huì)將該請(qǐng)求放在等待隊(duì)列中,這個(gè)acceptCount就是指能夠接受的最大等待數(shù),默認(rèn)100。如果等待隊(duì)列也被放滿了,這個(gè)時(shí)候再來(lái)新的請(qǐng)求就會(huì)被Tomcat拒絕(connection refused)。
用戶端(瀏覽器端)也會(huì)報(bào)錯(cuò)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-522275.html
到了這里,關(guān)于Spring Boot中內(nèi)置Tomcat最大連接數(shù)、線程數(shù)與等待數(shù) 實(shí)踐調(diào)優(yōu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!