文章目錄
爲什麼使用多線程?
最大化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