如何根据cpu核数来设置线程池线程数

java | 2020-02-14 09:32:20

1.线程概念

1.1进程和线程

进程就是起的一个程序一个jar包,线程就是这个进程中具体去完成某个计算的一批指令集合。例如:老板发起一个任务让大家搬砖,这就是一个进程,然后大家都一起搬砖,你就需要把砖在指定地方拿起,运输,放到指定地方,你单个人就是一个线程,多少个人就是多少个线程。

1.2cpu的线程

线程数:是同一时刻设备能并行执行的程序个数。

我们以Intel的Core i5-8250U为例来举例,它是四核八线程的CPU ,一个CPU集成了4个核心,一般来说一个核心对应一个线程,Intel通过超线程技术来实现一个核心对应2个线程,所以它是四核8线程.
这里说的线程是CPU物理级别的,不是java程序里的逻辑线程.

1.3程序的线程

程序的线程和cpu的线程(或者说核数)没有直接关系,一个线程在执行一系列指令,会申请cpu,内存资源,但不会一直占着cpu不放,只有需要使用cpu计算的时候,才会占用cpu,当io或线程sleep时,会把cpu释放,其他的线程依然可以使用释放的cpu。

这也是为什么一个8核的cpu,计算量大的线程 8个线程就能把cpu占到100%,而IO量特别大的线程,起50个线程都不会把这个8核的cpu占满。

 

2.如何估算线程池大小

2.1 受限于物理机CPU核数

查看linux 逻辑cpu核数

cat /proc/cpuinfo| grep "processor"| wc -l

 

2.2 受限于程序资源消耗

线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

 

2.3 一般的估算方式

一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)

  • 如果是CPU密集型应用,则线程池大小设置为N+1
  • 如果是IO密集型应用,则线程池大小设置为2N+1

如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。
但是,IO优化中,这样的估算公式可能更适合:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
因为很显然,线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。


2.4 根据程序调试

越是性能要求高的程序,越是要慢慢调整参数来,慢慢测试,得出测试数据,这才是最准确的,前提是,前面的思想你得理解。

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号