【云圖說】第235期 DDS讀寫兩步走 帶您領略只讀節點的風采
874
2025-04-01
目前按照我看過的一些開源框架,線程池中線程數量主要是根據應用的類型:IO密集型(2n +1 ),CPU密集型設置為 n + 1。
但實際情況往往復雜的多,不會按照這個進行設置,進行這種設置,通常是框架層面,例如netty,dubbo這種底層通訊框架會參考這樣的標準去設置,在實際業務中往往不會這樣做。
對于IO密集型網上還有一個公式:線程數 = CPU核心數/(1-阻塞系數)
這個阻塞系數一般為0.8~0.9之間,可以取0.8或者0.9。
我覺這個公式有一定的道理,考慮了阻塞的概念。
在我們的業務開發中,基本上都是IO密集型,因為往往都會去操作數據庫,訪問redis,es等存儲型組件,涉及磁盤IO,網絡IO。
那什么場景下是CPU密集型呢?純計算類,例如計算圓周率的位數,當然我們基本接觸不到。
IO密集型,可以考慮多設置一些線程,主要目的是可以增加IO的并發度,CPU密集型不宜設置過多線程,因為是會造成線程切換,浪費時間。
接下來我們以一個實際的場景來說明如何設置線程數量。
一個4C8G的機器上部署了一個MQ消費者,在RocketMQ的實現中,消費端也是用一個線程池來消費線程的,那這個線程數要怎么設置呢?
如果按照 2n + 1 的公式,線程數設置為 9個,但在我們實踐過程中發現如果增大線程數量,會顯著提高消息的處理能力,說明 2n + 1 對于業務場景來說,并不太合適。
如果套用 線程數 = CPU核心數/(1-阻塞系數) 阻塞系數取 0.8 ,線程數為 20 。阻塞系數取 0.9,大概線程數40,20個線程數我覺得可以。
如果我們發現數據庫的操作耗時比較多,此時可以繼續提高阻塞系數,從而增大線程數量。
**那我們怎么判斷需要增加更多線程呢?**其實我覺得我們可以用jstack命令查看一下進程的線程棧,如果發現線程池中大部分線程都處于等待獲取任務,則說明線程夠用,如下圖所示:
如果大部分線程都處于運行狀態,可以繼續適當調高線程數量。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。