天天看點

如何計算tomcat線程池大小?

背景

  在我們的日常開發中都涉及到使用tomcat做為伺服器,但是我們該設定多大的線程池呢?以及根據什麼原則來設計這個線程池呢?

  接下來,我将介紹本人是怎麼設計以及計算的。

目标

  确定tomcat伺服器線程池大小

具體方法

  衆所周知,tomcat接受一個request後處理過程中,會涉及到cpu和IO時間。其中IO等待時,cpu被動放棄執行,其他線程就可以利用這段時間片進行操作。

是以我們可以采用伺服器IO優化的通用規則:

線程大小 = ( (線程io時間 + 線程cpu)  / 線程cpu time) * cpu核數

舉例: 線程io時間為100ms(IO操作比如資料庫查詢,同步遠端調用等),線程cpu時間10ms,伺服器實體機核數為4個。通過上面的公式,我們計算出來的大小是 ((100 + 10 )/10 ) *4 = 44。理論上我們有依據,但是實際計算過程中我們怎麼知道線程IO時間和cpu時間呢? 這個就涉及到實際編碼過程中的怎麼樣監控處理時間啦。

下面我介紹本人項目中的做法

  1. 通過java 實作内置的filter接口,我們可以拿到一個request消耗的總時間

  2. 通過添加切面來監控線程IO耗時(jdk,cglib)

通過上述代碼就可以計算出相應時間,進而計算出線程大小啦。但是我們就到此為止了嗎?

其實還沒有,計算出的數值隻是存在理論情況下,我們還是需要通過壓測工具(Jmeter)來壓測一下線伺服器,同時根據qps值來動态微調剛才計算出的線程池大小。

如果文章還對大家有實際意義,請推薦一下。