如何合理設定執行緒池的核心執行緒數?

2021-10-14 08:02:38 字數 1209 閱讀 8901

當執行緒池的核心執行緒數量過大或者過小有沒影響?如何合理地設定執行緒池的核心執行緒的數量?這個是在日常開發中程式設計師在使用執行緒池時經常需要考慮的問題,下面具體介紹下。

1、當執行緒池的核心執行緒數量過大或者過小的影響

當執行緒池中核心執行緒數量過大時,執行緒與執行緒之間會爭取cpu資源,這樣就會導致上下文切換。過多的上下文切換會增加執行緒的執行時間,影響了整體執行的效率;

多執行緒程式設計中一般執行緒的個數都大於cpu核心的個數,而乙個cpu核心在任意時刻只能被乙個執行緒使用,為了讓這些執行緒都能得到有效的執行,cpu採取的策略是為了每個執行緒分配時間片並輪轉的形式。當乙個執行緒的時間片用完的時候就會重新處於就緒狀態讓其他執行緒使用,這個過程就屬於一次上下文切換。

當執行緒池中的核心執行緒數量過少時,如果同一時間有大量任務需要處理,可能會導致大量任務在任務佇列中排隊等待執行,甚至會出現佇列滿了之後任務無法執行的情況,或者大量任務堆積在任務佇列導致記憶體溢位(oom)。

2、任務性質

在討論設定核心執行緒數之前,先來了解下任務的性質,主要分為cpu密集型(計算密集型)任務、i/o密集型任務、混合型任務:

cpu密集型(計算密集型):系統的i/o讀寫效率高於cpu效率,大部分的情況是cpu有許多運算需要處理,使用率很高。但i/o執行很快。

i/o密集型:系統的cpu效能比磁碟讀寫效能要高很多,大多數情況是cpu在等i/o的讀寫操作,此時cpu的使用率並不高;

混合型任務:既包含cpu密集型又包含i/o密集型。

3、合理設定核心執行緒數

對於cpu密集型任務,由於cpu密集型任務的性質,導致cpu的使用率很高,如果執行緒池中的核心執行緒數量過多,會增加上下文切換的次數,帶來額外的開銷。因此,一般情況下執行緒池的核心執行緒數量等於cpu核心數+1。(注:這裡核心執行緒數不是等於cpu核心數,是因為考慮cpu密集型任務由於某些原因而暫停,此時有額外的執行緒能確保cpu這個時刻不會浪費。但同時也會增加乙個cpu上下文切換,因此核心執行緒數是等於cpu核心數?還是cpu核心數+1?可以根據實際情況來確定)

對於i/o密集型任務,由於i/o密集型任務cpu使用率並不是很高,可以讓cpu在等待i/o操作的時去處理別的任務,充分利用cpu。因此,一般情況下執行緒的核心執行緒數等於2*cpu核心數。(注:有些公司會考慮所需要的cpu阻塞係數,即核心執行緒數=cpu核心數/(1-阻塞係數))

總結:cpu密集型:核心執行緒數=cpu核心數(或 核心執行緒數=cpu核心數+1)

i/o密集型:核心執行緒數=2*cpu核心數(或 核心執行緒數=cpu核心數/(1-阻塞係數))

執行緒池設定 如何合理設定執行緒池的核心執行緒數?

當執行緒池的核心執行緒數量過大或者過小有沒影響?如何合理地設定執行緒池的核心執行緒的數量?這個是在日常開發中程式設計師在使用執行緒池時經常需要考慮的問題,下面具體介紹下。1 當執行緒池的核心執行緒數量過大或者過小的影響 當執行緒池中核心執行緒數量過大時,執行緒與執行緒之間會爭取cpu資源,這樣就會導...

如何合理設定執行緒池大小

要想合理的配置執行緒池的大小,首先得分析任務的特性,可以從以下幾個角度分析 任務的性質 cpu密集型任務 io密集型任務 混合型任務。任務的優先順序 高 中 低。任務的依賴性 是否依賴其他系統資源,如資料庫連線等。性質不同的任務可以交給不同規模的執行緒池執行。對於不同性質的任務來說,cpu密集型任務...

如何合理設定執行緒池大小

這個問題雖然看起來很小,卻並不那麼容易回答。大家如果有更好的方法歡迎賜教,先來乙個天真的估算方法 假設要求乙個系統的tps transaction per second或者task per second 至少為20,然後假設每個transaction由乙個執行緒完成,繼續假設平均每個執行緒處理乙個t...