[轉]如何根據cpu的processor數來肯定程序的併發線程數量

原文:http://blog.csdn.net/kirayuan/article/details/6321967性能

咱們能夠在cat 裏面發現processor數量,這裏的processor能夠理解爲邏輯上的cpu。操作系統

這裏摘抄的一段blog來講明:.net

什麼是線程池大小的阻抗匹配原則? 
我在《經常使用模型》中提到「阻抗匹配原則」,這裏大體講一講。線程

若是池中線程在執行任務時,密集計算所佔的時間比重爲 P (0 < P <= 1),而系統一共有 C 個 CPU,爲了讓這 C 個 CPU 跑滿而又不過載,線程池大小的經驗公式 T = C/P。(T 是個 hint,考慮到 P 值的估計不是很準確,T 的最佳值能夠上下浮動 50%。)blog

之後我再講這個經驗公式是怎麼來的,先驗證邊界條件的正確性。資源

假設 C = 8, P = 1.0,線程池的任務徹底是密集計算,那麼 T = 8。只要 8 個活動線程就能讓 8 個 CPU 飽和,再多也沒用,由於 CPU 資源已經耗光了。it

假設 C = 8, P = 0.5,線程池的任務有一半是計算,有一半等在 IO 上,那麼 T = 16。考慮操做系統能靈活合理地調度 sleeping/writing/running 線程,那麼大概 16 個「50% 繁忙的線程」能讓 8 個 CPU 忙個不停。啓動更多的線程並不能提升吞吐量,反而由於增長上下文切換的開銷而下降性能。線程池

若是 P < 0.2,這個公式就不適用了,T 能夠取一個固定值,好比 5*C。sso

另外,公式裏的 C 不必定是 CPU 總數,能夠是「分配給這項任務的 CPU 數目」,好比在 8 核機器上分出 4 個核來作一項任務,那麼 C=4。經驗

相關文章
相關標籤/搜索