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