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密集,等等都會引起差異化。