线程数与多核CPU的关系

多线程程序大家都在写,那多核CPU的服务器上,线程数开多少个比较合适,你知道吗?

这里,首先要厘清CPU数、核数、processor数这么几个概念。

比如,使用top查看负载时,按1,看到的CPU0~CPUn,这里的数量其实是processor数。

使用cat /proc/cpuinfo看到的输出中,就可以看到cpu cores、processor这几个概念。

这几个概念区别是什么?

厘清了这些概念之后,那么应该怎么去选择设置程序的线程数呢?

理论上来说,对于计算密集型的任务,线程数应该和CPU所能提供的并行数一致。那这里的“并行数”应该采取物理核数还是processor数呢?

用事实说话。

我用一个2CPU,每个CPU上12个物理核,每个物理核上2个逻辑processor的服务器做测试。线程数分别使用6、10、12、30、48、96。

以看到,线程数超过processor数量(48),或者小于物理核数量(24),吞吐量都会收到较大影响。所以对于测试的计算密集型任务,线程数应该设置再24~48之间。

具体来看,吞吐量、CPU负载在24(物理核数)到48(processor数)之间,没有明显变化。但是99时延有个缓慢的上升(10%)左右,平均时延有小幅下降(4%)。

对时延更具体的统计也可以看到,时延曲线的毛刺会随着线程数的降低而降低。

那么,为什么这里“超线程”技术,并没有像理论中的那样加大并行度,从而提高吞吐量呢?

我想,可能是由于在我的程序(以及大部分程序)中,对各个计算部件(FPU\ALU)的使用并不是均匀的,一般ALU的使用占大头,FPU的使用只占小部分,所以超线程技术并不能带来很大的并行度提升;而这一点点提升,也被线程切换带来的消耗所抵消了。

综上,对于计算密集型的任务,一般建议将线程数设置为物理核数。具体的,还需要针对不同的程序,做对应压力测试得到合适的参数选择。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180818G1KZSO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券