對Tomcat執行緒池的一些理解

2021-08-17 14:31:36 字數 2004 閱讀 5739

1.工作機制:

tomcat啟動時如果沒有請求過來,那麼執行緒數(都是指執行緒池的)為0;

一旦有請求,tomcat會初始化minsaprethreads設定的執行緒數;

2.執行緒池作用:

tomcat的執行緒池的執行緒數跟你的瞬間併發有關係,比如maxthreads設定為1000,當瞬間併發達到1000那麼tomcat就會起1000個執行緒來處理,這時候跟你應用的快慢關係不大。

3.引數分析:

//編輯tomcat安裝目錄下的conf目錄下的server.xml檔案

maxthreads:tomcat執行緒池最多能起的執行緒數;

maxconnections:tomcat瞬間最多能併發處理的請求(連線);

acceptcount:tomcat維護最大的佇列數(當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理);

minsparethreads:tomcat初始化的執行緒池大小或者說tomcat執行緒池最少會有這麼多執行緒。

比較容易弄混的是maxthreads和maxconnections這兩個引數:

比如maxthreads=1000,maxconnections=800,假設某一瞬間的併發時1000,那麼最終tomcat的執行緒數將會是800,即同時處理800個請求,剩餘200進入佇列「排隊」,如果acceptcount=100,那麼有100個請求會被拒掉。

注意:根據前面所說,只是併發那一瞬間tomcat會起800個執行緒處理請求,但是穩定後,某一瞬間可能只有很少的執行緒處於runnable狀態,大部分執行緒是timed_waiting,如果你的應用處理時間夠快的話。所以真正決定tomcat最大可能達到的執行緒數是maxconnections這個引數和併發數,當併發數超過這個引數則請求會排隊,這時響應的快慢就看你的程式效能了。

併發的概念:不管什麼併發肯定是有乙個時間單位的(一般是1s),準確的來講應該是當時tomcat處理乙個請求的時間內併發數,比如當時tomcat處理某乙個請求花費了1s,那麼如果這1s過來的請求數達到了3000,那麼tomcat的執行緒數就會為3000,maxconnections只是tomcat做的乙個限制。

4.tomcat會停止長時間閒置的執行緒

這個時間就是maxidletime。但我之前的測試中確實沒有發現執行緒釋放的現象,這是為什麼呢?我發現除了這個引數執行緒池執行緒是否釋放?釋放多少?還跟當前tomcat每秒處理的請求數(從jmeter或loadrunner來看可以理解為tps)有關係。通過下表可以清晰的看出來執行緒數tpsmaxidletime之間的關係:

tps

maxidletime(ms)

thread count10

60,000

600     5

60,000

300 1

60,000 60

當然這個thread count不會小於minsparethreads

(參考)

執行緒池和訊息佇列的一些理解

1.兩者內部都使用了佇列,如阻塞佇列 優先順序佇列 2.使用執行緒池時應用伺服器既充當生產者又充當消費者,也是訊息佇列中介軟體的實現者,使用訊息佇列時中介軟體 生產者 消費者可以部署在不同的應用機器上 當然也可以部署在一台伺服器上但很少有人這麼用 3.出於第2點執行緒池更適合非分布式的系統,但在分布...

關於Tomcat的執行緒池的理解

預設配置下,tomcat 會為每個聯結器建立乙個繫結的執行緒池 最大執行緒數 200 在大多數情況下你不需要改這個配置 除非增大最大執行緒數以滿足高負載需要 但是 tomcat 喜歡在每個工作者執行緒的 thread local 上下文快取一些諸如 pagecontext 以及標籤快取的物件。正因如...

執行緒池一些知識解答

執行緒的建立和銷毀,維護乙個執行緒池處理多工,更加有效利用cpu。那麼主要是浪費那些資源呢?我們來分析建立乙個執行緒的過程 上面已經提到了,建立乙個執行緒還要呼叫作業系統核心api。為了更好的理解建立並啟動乙個執行緒的開銷,我們需要看看 jvm 在背後幫我們做了哪些事情 這段描述稍稍有點抽象,用資料...