CPU密集型最大线程数设置为最大线程数 = CPU核心数 + 1
IO 最大线程数 = CPU核心数 / (1 - 阻塞占百分比) = 8核 / (1-0.8)= 0/0.2 = 40
请求时长为10秒,调用IO时间为8秒,这时我们阻塞占百分比就是80%,有效利用CPU占比就是20%,假设是八核CPU,我们线程数就是8 / (1 - 80%) = 8 / 0.2 = 40个。
要根据具体情况来分析
比如:图片合成视频,图片操作切片等这种,利用单核,单核心cpu 跑满,那么就要留下来 1 核给系统用,8 核心就是 8-1 = 7线程(如果我给多了那么上下文切换还会减少事件)
另外就是常见业务操作,实际上非算法问题,业务上基本都是(ifelse 数据库 缓存 网络 请求)cpu利用率很低的,10核心的php跑100+线程的后台轮询任务也没关系;要结合系统是不是对外提供服务、还是单纯的后台任务,如果单纯后台任务,跑任务线程数跟qps差不多一个概念了,跑几百问题不大吧?
随着多核CPU的发展,多线程编程的应用越来越广泛,为了降低频繁创建线程,销毁线程所产生额外的资源开销,推出了线程池技术。使用线程池技术我们需要设置核心线程数与最大线程数,许多中间件也会将这两个参数交由我们自己设置,那么如何科学合理的去设置这两大参数呢?下面我们来一起研究一下。
一般我们的程序都会分为以下几种类型,CPU密集型(计算密集型)、IO密集型、混合型,针每种类型的程序我们有不同的配置方案。
CPU密集型也就是计算密集型,常常指算法复杂的程序,需要进行大量的逻辑处理与计算,CPU在此期间是一直在工作的。
在这种情况下CPU的利用率会非常高,我们的最大核心数设置为CPU的核心数即可。
这种情况下CPU几乎满负荷运行,我们配置的数字在大也没有效果,反而会增大额外的切换开销。
在《Java Concurrency in Practice》中,推荐将CPU密集型最大线程数设置为最大线程数 = CPU核心数 + 1,这样能发挥最高效率。
核心线程数一般会设置为 核心线程数 = 最大线程数 * 20%。
如下图所示,CPU密集型更多的是计算任务会持续占用CPU。