如何根據cpu的processor數來確定程式的併發執行緒數量
阿新 • • 發佈:2019-01-29
我們可以在cat 裡面發現processor數量,這裡的processor可以理解為邏輯上的cpu。
這裡摘抄的一段blog來說明:
什麼是執行緒池大小的阻抗匹配原則?
我在《常用模型》中提到“阻抗匹配原則”,這裡大致講一講。
如果池中執行緒在執行任務時,密集計算所佔的時間比重為 P (0 < P <= 1),而系統一共有 C 個 CPU,為了讓這 C 個 CPU 跑滿而又不過載,執行緒池大小的經驗公式 T = C/P。(T 是個 hint,考慮到 P 值的估計不是很準確,T 的最佳值可以上下浮動 50%。)
以後我再講這個經驗公式是怎麼來的,先驗證邊界條件的正確性。
假設 C = 8, P = 1.0,執行緒池的任務完全是密集計算,那麼 T = 8。只要 8 個活動執行緒就能讓 8 個 CPU 飽和,再多也沒用,因為 CPU 資源已經耗光了。
假設 C = 8, P = 0.5,執行緒池的任務有一半是計算,有一半等在 IO 上,那麼 T = 16。考慮作業系統能靈活合理地排程 sleeping/writing/running 執行緒,那麼大概 16 個“50% 繁忙的執行緒”能讓 8 個 CPU 忙個不停。啟動更多的執行緒並不能提高吞吐量,反而因為增加上下文切換的開銷而降低效能。
如果 P < 0.2,這個公式就不適用了,T 可以取一個固定值,比如 5*C。
另外,公式裡的 C 不一定是 CPU 總數,可以是“分配給這項任務的 CPU 數目”,比如在 8 核機器上分出 4 個核來做一項任務,那麼 C=4。