合理配置執行緒池

祁~發表於2020-11-01

CPU密集

CPU密集的意思是該任務需要大量的運算,而沒有阻塞,CPU一直全速執行。

CPU密集任務只有在真正的多核CPU上才可能得到加速(通過多執行緒),而在單核CPU上,無論你開幾個模擬的多執行緒,該任務都不可能得到加速,因為CPU總的運算能力就那些。

IO密集

IO密集型,即該任務需要大量的IO,即大量的阻塞。在單執行緒上執行IO密集型的任務會導致浪費大量的CPU運算能力浪費在等待。所以在IO密集型任務中使用多執行緒可以大大的加速程式執行,即時在單核CPU上,這種加速主要就是利用了被浪費掉的阻塞時間。

 

接著上一篇探討執行緒池留下的尾巴,如何合理的設定執行緒池大小。

要想合理的配置執行緒池的大小,首先得分析任務的特性,可以從以下幾個角度分析:

1. 任務的性質:CPU密集型任務、IO密集型任務、混合型任務。

2. 任務的優先順序:高、中、低。

3. 任務的執行時間:長、中、短。

4. 任務的依賴性:是否依賴其他系統資源,如資料庫連線等。

性質不同的任務可以交給不同規模的執行緒池執行。

對於不同性質的任務來說,CPU密集型任務應配置儘可能小的執行緒,如配置CPU個數+1的執行緒數,IO密集型任務應配置儘可能多的執行緒,因為IO操作不佔用CPU,不要讓CPU閒下來,應加大執行緒數量,如配置兩倍CPU個數+1,而對於混合型的任務,如果可以拆分,拆分成IO密集型和CPU密集型分別處理,前提是兩者執行的時間是差不多的,如果處理時間相差很大,則沒必要拆分了。

若任務對其他系統資源有依賴,如某個任務依賴資料庫的連線返回的結果,這時候等待的時間越長,則CPU空閒的時間越長,那麼執行緒數量應設定得越大,才能更好的利用CPU。

當然具體合理執行緒池值大小,需要結合系統實際情況,在大量的嘗試下比較才能得出,以上只是前人總結的規律。

 

最佳執行緒數目 = ((執行緒等待時間+執行緒CPU時間)/執行緒CPU時間 )* CPU數目

比如平均每個執行緒CPU執行時間為0.5s,而執行緒等待時間(非CPU執行時間,比如IO)為1.5s,CPU核心數為8,那麼根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:

最佳執行緒數目 = (執行緒等待時間與執行緒CPU時間之比 + 1)* CPU數目

可以得出一個結論: 
執行緒等待時間所佔比例越高,需要越多執行緒。執行緒CPU時間所佔比例越高,需要越少執行緒。 
以上公式與之前的CPU和IO密集型任務設定執行緒數基本吻合。

 

CPU密集型時,任務可以少配置執行緒數,大概和機器的cpu核數相當,這樣可以使得每個執行緒都在執行任務

IO密集型時,大部分執行緒都阻塞,故需要多配置執行緒數,2*cpu核數

作業系統之名稱解釋:

某些程式花費了絕大多數時間在計算上,而其他則在等待I/O上花費了大多是時間,

前者稱為計算密集型(CPU密集型)computer-bound,後者稱為I/O密集型,I/O-bound。

相關文章