线程设置数量

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密集型、混合型,针每种类型的程序我们有不同的配置方案。

1 CPU密集型

CPU密集型也就是计算密集型,常常指算法复杂的程序,需要进行大量的逻辑处理与计算,CPU在此期间是一直在工作的。
在这种情况下CPU的利用率会非常高,我们的最大核心数设置为CPU的核心数即可。
这种情况下CPU几乎满负荷运行,我们配置的数字在大也没有效果,反而会增大额外的切换开销。
在《Java Concurrency in Practice》中,推荐将CPU密集型最大线程数设置为最大线程数 = CPU核心数 + 1,这样能发挥最高效率。
核心线程数一般会设置为 核心线程数 = 最大线程数 * 20%
如下图所示,CPU密集型更多的是计算任务会持续占用CPU。
notion image

2 IO密集型

IO密集型是指我们程序更多的工作是在通过磁盘、内存或者是网络读取数据,在IO期间我们线程是阻塞的,这期间CPU其实也是空闲的,这样我们的操作系统就可以切换其他线程来使用CPU资源。
通常在进行接口远程调用,数据库数据获取,缓冲数据获取都属于IO操作。
这时我们线程数可以通过以下公式进行计算:最大线程数 = CPU核心数 / (1 - 阻塞占百分比)
我们很好理解比如在某个请求中,请求时长为10秒,调用IO时间为8秒,这时我们阻塞占百分比就是80%,有效利用CPU占比就是20%,假设是八核CPU,我们线程数就是8 / (1 - 80%) = 8 / 0.2 = 40个。
也就是说 我们八核CPU在上述情况中,可满负荷运行40个线程。这时我们可将最大线程数调整为40,在系统进行IO操作时会去处理其他线程。
通常我们会设置为最大线程数 = CPU核心数 * 2
核心线程数一般会设置为 核心线程数 = 最大线程数 * 20%
如下图所示,IO密集型是同一个任务只有部分时间是在进行计算,很长时间都在进行IO阻塞。这样CPU同时刻就能处理更多的任务。
notion image

3 混合型

混合型程序,指既包含CPU密集型,又包含IO密集型。
对于此类程序,我们可以将任务划分成cpu密集型任务与IO密集型任务,分别针对这两种任务使用不同的线程池去处理。这样我们就可以针对这两种情况对线程池配置不同的参数。
作者:CoderJie链接:https://juejin.cn/post/7072281409053786120来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP