JUC_如何較爲合適地確定線程池需要創建的線程數量

爲什麼使用多線程?

最大化CPU使用率

如何最大化CPU密集型任務CPU使用率?

什麼是CPU密集型任務?

計算佔大部分,數據傳輸(IO)佔小部分

如何最大化利用率?

核心是減少線程之間上下文切換帶來的開銷

如何確定合適的線程數?

線程數=CPU核數(邏輯)+1

+1”是爲了確保在意外情況出現中斷時,仍然有一個線程任務使得CPU不空閒下來。

如何最大化IO密集型任務CPU使用率?

什麼是IO密集型任務?

計算佔小部分,數據傳輸(IO)佔大部分

如何最大化利用率?

核心是在IO的過程中,減少CPU的空閒狀態時間,增加線程執行任務填充CPU空閒時間

如何確定合適的線程數?

線程數=CPU核數×(1/CPU利用率)=CPU核數×[1+(IO耗時/CPU耗時)]
  • +1”同樣是備用。
  • IO耗時/CPU耗時)耗時即爲在IO期間,看看需要多少線程可以填充CPU的空閒期。
  • 具體的耗時,需要根據實際業務測試得出。

實際運用

  • Q1: 每個Transaction由3個線程完成,每個Transaction處理時間爲0.5s,如何設計線程數保證系統TPS爲100?
  • A1:
每個線程每秒可以處理的Transaction數:
1/3/0.5=2/3;
TPS=100需要的線程數:
100/(2/3)=150

一般服務器的CPU核數爲16~32,線程數量過於多帶來的上下文切換開銷也要實際考慮。

  • Q2:某個任務,CPU計算需要10ms,數據傳輸需要100ms,對於16h核數的服務器,如何設置線程數?
  • A2:

數據傳輸時間遠大於CPU計算時間,所以是IO密集型任務。

線程數=16×[1+(100/10)]=176
  • Q3:在上一問的基礎上,如果數據庫QPS爲1000,線程數該作何修改?
  • A3:
不考慮數據庫QPS時,系統的QPS爲:
QPS=線程數*[1000/(IO耗時+CPU耗時)]=176×[1000/(100+10)]=1600

根據數據庫QPS按比例減少線程數:
線程數=176×1000/1600=110

參考

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章