根据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,多设置一个线程,