根据CPU核心数确定线程数

refer 根据CPU核心数确定线程池并发线程数

  • 当任务是计算型的,创建CPU核心数一样多的线程数
  • 当任务是阻塞型的,需要尽可能多的创建线程,需要首先确定阻塞系数

如何理解上面两句话,比如:

对于计算型任务:4核心CPU,你创建了8个线程,其中一个线程A执行的好好的,但CPU却切换到另一个线程去执行,当再切换回来的时候,又要恢复A的执行上下文,这种情况反而对性能造成消耗;

对于阻塞性任务:4核心CPU,创建了8个线程,任务经常是阻塞的,这个时候CPU切换到其他线程去执行,就避免了阻塞造成的CPU占用,提高CPU使用率;

线程数 Nthreads= Ncpu*Ucpu*(1+w/c)

Ncpu=CPU核心数

Ucpu=cpu使用率,0~1,一般我们肯定是想让CPU充分使用或接近100%,即 Ucpu≈1

W/C=等待时间与计算时间的比率

一般情况需要创建多少线程

对于计算型任务,我们认为线程不会阻塞,则 w>=0,则 Nthreads >= Ncpu*1*(1+0/c) >= Ncpu

对于阻塞性任务,我们假定阻塞时间和计算时间是相等的,则 w/c = 1 => Nthreads = Ncpu*1*(1+1) = Ncpu * 2

同理,如果阻塞时间比较长,则创建的线程数应该更多

最后

开发中一般不过于关注这个问题,因为大多数项目里,会涉及到多个业务使用线程,可以先与CPU核心数保持一致即可

还有一种设置方法,Nthreads = Ncpu + 1,多设置一个线程,

深入研究

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注