詳解Tomcat執行緒池原理及引數釋義

2022-07-28 00:33:13 字數 2261 閱讀 1295

omcat執行緒池有如下引數:

maxthreads, 最大執行緒數,tomcat能建立來處理請求的最大執行緒數

maxsparethreads, 最大空閒執行緒數,在最大空閒時間內活躍過,但現在處於空閒,若空閒時間大於最大空閒時   間,則**,小於則繼續存活,等待被排程。

minsparethreads,最小空閒執行緒數,無論如何都會存活的最小執行緒數

acceptcount, 最大等待佇列數 ,請求併發大於tomcat執行緒池的處理能力,則被放入等待佇列等待被處理。

maxidletime, 最大空閒時間,超過這個空閒時間,且執行緒數大於最小空閒數的,都會被**

1.一張圖看懂tomcat執行緒池。

tomcat原理如上圖。tomcat執行緒池在工作的時候,實際情況是:以上述執行緒池為例,一開始就建立最小空閒數的執行緒在池裡,20個,當同一時間請求數量大於最小空閒數20,比如來了50個併發請求,那麼執行緒池還需要建立30個執行緒來處理請求。這時候當請求都處理完了,持續來的請求低於50個的時候,那麼當時間過了60秒,併發數還是沒有達到50,那麼從第50個執行緒開始,執行緒池將按照,空閒時間達到60s的,開始逐個**,49個,48個,47個,如此**。如果併發請求小於20個,那麼執行緒池會**至20個的時候,停止**,這就是最小空閒數的作用,即使乙個請求都沒有,那麼執行緒池也得保證隨時都有20個。所謂空閒**是指:乙個執行緒在60s的時間內,一直處於等待。那麼就可以判定該執行緒是空閒。如果這個空閒執行緒是在最小空閒數以上,則會被**。當請求併發高於500最大空閒數的時候,執行緒池是會繼續建立執行緒的,來滿足特大突發性併發。當併發請求數降下之後,執行緒池中有空閒,那麼,無論執行緒空閒時間是否達到60s,執行緒池都會進行**至500。500以類的執行緒也會根據空閒時間是否大於60s來判斷是否需要進行**。

2.下面我們詳細結合實際情況來闡述tomcat執行緒池在實際運用中,是如何工作的,如何處理併發的。

可以結合這個來看,最高的執行緒如果是繁忙的話,那麼說明tomcat執行緒已經被打滿了。

在短時間週期內,如果執行緒數忽然持續走高,說明有突發性請求已經打過來,且正在建立更多的執行緒去執行,這時候建立執行緒的過程中,請求處於被等待,越是最後的請求被等待的時間越長。而過一段時間,執行緒數降下去很多的話,說明突發性請求已經過去了,執行緒池裡的執行緒空閒時間達到了最大空閒時間,比如60s,那麼即將被**。

我個人覺得,這種現象應該被歸屬於不健康狀態。因為請求來了,如果等待的執行緒只有10個以下,那麼等待時間不會太長。但是如果等待時間達到10個以上,等待時間就會呈幾何方式上公升的,且執行緒處理時間也會呈幾何倍數上公升,因為同乙個執行緒池裡的執行緒之間要相互競爭cpu資源,比如現在tomcat執行中有1000個執行緒,假如每個cpu的時間片為0.01秒,那麼,輪到第1000個執行緒執行時,該執行緒實際已經等待了999個時間片*0.01=1秒了,這還只是一次時間片執行,0.01秒相當於10ms,而咱們的乙個請求正常情況下的時間是:30ms,那乙個請求要成功就需要等待3次cpu時間片來執行,如果tomcat執行緒池一直有1000個在執行,那正常情況下乙個請求的執行時間應該是:0.03+999*0.01*3=3.03s,可想而知,執行乙個請求只需要30ms,可是卻要等待需要3s,這是相當不靠譜的且難以接受的。再假如,時間片是20ms,那麼乙個請求從進入等待到執行完畢的執行時間應該是多少?0.03+999*0.02*(0.03/0.02=取大於整數=2)+cpu切換時間a*999次=4.03s+999a,這已經很誇張了吧!

咱們還可以理想一點,加入執行緒池裡只有500個活躍執行緒,那麼上面的公式應該是:當cpu時間片為0.01s時,最後乙個請求需要處理成功,需要用時:0.03+500*0.01*3= 1.53s,當cpu時間片為0.02s時,最後乙個請求需要處理成功,需要用時:0.03+500*0.02*2= 2.03s,當cpu時間片為0.03s時,最後乙個請求需要處理成功,需要用時:0.03+500*0.03*1= 1.53s。

但是這只是cpu執行時間,還要加上網路傳輸,建立執行緒時間,cpu切換執行緒所需時間,還有其他時間,總共加起來,就是乙個很可怕的時間了。所以,即使tomcat有執行緒池,但最好不要總是超過最小空閒數,這是最優的情況,最次的情況就是tomcat執行緒池中線程數超過最大空閒數了,執行緒們總是繁忙地工作,宕機隨時有可能。

而健康狀態是:執行緒池保持最小空閒數才算是健康,如果你的tomcat執行緒數總是超過最小空閒數,那麼你的程式隨時都處於繁忙狀態,這時候出錯的機率已經大大增加。是時候需要被重點關注了。

以上,僅個人觀點,具體情況還得實際分析。還需要考慮cpu個數效能,網路,作業系統,例項是否混部,應用型別是cpu密集還是io密集,等等都會引起差異化。

詳解Tomcat執行緒池原理及引數釋義

omcat執行緒池有如下引數 maxthreads,最大執行緒數,tomcat能建立來處理請求的最大執行緒數 maxsparethreads,最大空閒執行緒數,在最大空閒時間內活躍過,但現在處於空閒,若空閒時間大於最大空閒時 間,則 小於則繼續存活,等待被排程。minsparethreads,最小空...

Tomcat執行緒池原理

tomcat 兩大元件 聯結器connector 負責對外溝通 使用到了執行緒池 容器container 負責實現servlet規範 聯結器 期中一部分元件nio endpoint的組成 tomcat 執行緒池擴充套件了 threadpoolexecutor,行為稍有不同 發生異常後 抓住異常 嘗試...

執行緒池建立方式及執行緒池原理

執行緒池提交任務時的執行順序如下 向執行緒池提交任務時,會首先判斷執行緒池中的執行緒數是否大於設定的核心執行緒數,如果不大於,就建立乙個核心執行緒來執行任務。如果大於核心執行緒數,就會判斷緩衝佇列是否滿了,如果沒有滿,則放入佇列,等待執行緒空閒時執行任務。如果佇列已經滿了,則判斷是否達到了執行緒池設...