线程池核心线程数的设置

能搜到这个问题的必然是知道自己为什么来的,线程池作为池化思想的线程实现,可以为我们减少创建和销毁线程所带来的功耗,具体设置多少需要考虑多方面因素,我们直奔主题:

  1. 三方面因素:
    服务器配置、服务器资源预算(CPU数、内存、IO支持的最大QPS)、任务自身特性(是IO密集型还是CPU密集型)
  2. 不同任务对应的线程数量。
    在一般任务中,设CPU数量为N,任务分为IO密集型和CPU(计算)密集型,如果是IO密集型,设置线程数为2*N;如果是CPU密集型,则设置线程数为N+1(某时因为发生一个页面错误或其他原因而暂停,这个额外线程可以确保不会停止工作)。
  3. 具体操作中,很少出现纯IO和纯计算任务,大部分任务是计算后修改内存,因此要按照一个思路去设置线程数。主要考量两方面,一个是CPU的利用率+数量,另一个是IO任务支持的最大QPS
  4. *计算:

​ 首先确定一点,我们认为一个线程在运行的时候是占用一个CPU的,在这个单位时间内,CPU的使用率是100%,而如果有一个线程,处理两个耗时相同的任务,一个计算,一个IO(IO操作执行的时候,线程是会被挂起的,因为IO涉及数据的读取或修改,会遇到锁,此时CPU是不工作的),那么这整个时间段内,线程有一半时间是挂起的,因此CPU使用率=线程使用时间/总时间=50%。如果设置两个线程,那么在这段时间内,当一个线程被挂起时,另一个线程可以使用,CPU始终被使用,此时CPU利用率为100%。

​ 如上所说,我们的整体思路就是:确保每时每刻都有且仅有一条线程在运行,这样CPU的使用率就保持在100%,那么问题就转化为:IO任务进行的这段时间里,让计算任务继续进行,且每一个计算任务都分配一个线程,确保单核多线程并发执行。

假设一个任务,IO操作需要100ms,计算操作需要5ms,那么为了确保CPU使用率在100%:

单CPU设置线程数量=总任务时长/计算任务时长

​ 可计算出每个CPU需要处理的线程数量为(105/5=)21条。对于N个CPU的服务器(设8个),公式为:

线程数= N * (总任务时长/计算任务时长)

​ 即设置(21 * 8 =)168条线程,实际工作中,CPU利用率达不到100%,上面的公式是一个理想值,需要完善。

​ 接下来考量IO最大QPS(服务器每秒响应的进程请求次数),我们已经知道我们整个任务进程的处理时间为105ms,那么每秒(1000ms)能处理的进程次数为(1000/105=)9.52,这是单线程的处理能力,也就是说按照设置的168个线程,服务器的N个CPU每秒能处理的请求次数1600,为但是能处理不代表能接收,我们还要看服务器能否每秒接收这么多请求,如果服务器QPS已知最高为800,那么显然每秒会有一半数量的线程是空闲的(工厂生产能力够,但是订单不够),那么我们修改设置的线程数最终为168*(800/1600)=84个。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值