Tomcat IO阻塞異常

2022-08-02 20:48:11 字數 1385 閱讀 7162

tomcat的maxthreads、acceptcount(最大執行緒數、最大排隊數) 

tomcat 的connector配置如下

其中最後兩個引數意義如下:

maxthreads:tomcat起動的最大執行緒數,即同時處理的任務個數,預設值為200

acceptcount:當tomcat起動的執行緒數達到最大時,接受排隊的請求個數,預設值為100

這兩個值如何起作用,請看下面三種情況

情況1:接受乙個請求,此時tomcat起動的執行緒數沒有到達maxthreads,tomcat會起動乙個執行緒來處理此請求。

情況2:接受乙個請求,此時tomcat起動的執行緒數已經到達maxthreads,tomcat會把此請求放入等待佇列,等待空閒執行緒。

情況3:接受乙個請求,此時tomcat起動的執行緒數已經到達maxthreads,等待佇列中的請求個數也達到了acceptcount,此時tomcat會直接拒絕此次請求,返回connection refused

maxthreads如何配置

一般的伺服器操作都包括量方面:1計算(主要消耗cpu),2等待(io、資料庫等)

第一種極端情況,如果我們的操作是純粹的計算,那麼系統響應時間的主要限制就是cpu的運算能力,此時maxthreads應該盡量設的小,降低同一時間內爭搶cpu的執行緒個數,可以提高計算效率,提高系統的整體處理能力。

我在測試時遇到乙個問題,maxthreads我設定的比較大比如3000,當服務的執行緒數大到一定程度時,一般是2000出頭,單次請求的響應時間就會急劇的增加,

cpu把大多數時間都用來在這2000多個執行緒直接切換上了,當然cpu就沒有時間來處理我們的程式了。

以前一直簡單的認為多執行緒=高效率。。其實多執行緒本身並不能提高cpu效率,執行緒過多反而會降低cpu效率。

當cpu核心數《執行緒數時,cpu就需要在多個執行緒直接來回切換,以保證每個執行緒都會獲得cpu時間,即通常我們說的併發執行。

所以maxthreads的配置絕對不是越大越好。

現實應用中,我們的操作都會包含以上兩種型別(計算、等待),所以maxthreads的配置並沒有乙個最優值,一定要根據具體情況來配置。

最好的做法是:在不斷測試的基礎上,不斷調整、優化,才能得到最合理的配置。

acceptcount的配置,我一般是設定的跟maxthreads一樣大,這個值應該是主要根據應用的訪問峰值與平均值來權衡配置的。

如果設的較小,可以保證接受的請求較快相應,但是超出的請求可能就直接被拒絕

如果設的較大,可能就會出現大量的請求超時的情況,因為我們系統的處理能力是一定的。

關於網路異常,導致阻塞的問題

1 機房被攻擊,導致網路異常,使用 apache 的 httpclient 抓資料,導致程式阻塞,假死 原因 使用httpclient沒有設定 connecttimeout 和 sockettimeout 的超時時間,而預設值為 this.connecttimeout 1 this.socketti...

阻塞 非阻塞

阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...

阻塞非阻塞

阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...