通俗解释线程池如何设置核心池大小

通俗解释线程池如何设置核心池大小

首先明确使用线程池的目的:充分利用多核CPU资源提高多线程任务执行效率,缩短总的执行时间。核心就是提高多核CPU的利用率。
Cpu资源消耗分两种:1.计算2.上下文切换
所以最理想的状况是让每一个cpu核心处于计算状态,并且一个线程的执行周期中不发生上下文切换。
网上最常见的一种说法是核心池大小取决于你的执行任务是cpu密集型,还是io密集型。
假设CPU核数是N
Cpu密集型是N+1最合理
IO密集型是2N+1最合理
但是其实这种说法是存在很大漏洞的
第一条CPU密集型N+1相对合理一点,一个任务如果执行的全部时间都耗费在CPU计算上,那N个CPU执行各自执行一个任务总计N个其实是最合理的。 那CPU密集型任务可能指的是大多时间(比如说百分之95)是耗费在cpu计算上。但是还有5%的CPU空闲时间,所以多加一个任务进来去充分利用剩余的百分之五的空闲时间。
第二条其实是更经不住推敲的,2N的出现其实可以理解为任务执行时CPU和IO的时间各自一半,但是各自一半的情况下开2N个线程就非常合理了。后边的加一完全没办法解释。

另外一种更为精确的说法是 用一个任务的IO时间+CPU时间的和除以CPU时间然后乘以核数N
或者使用阻塞系数去进行计算结果基本是相同的 公式如下:
Ncpu / (1-阻塞系数) = Ncpu * ( 1 + w/c )

这一种更准确,但是也要结合实际使用场景。
如果场景中只有线程池中的任务占用CPU才是上述公式的理想环境
但是实际应用场景中很难如此,往往线程池运行的同时还会有其他的线程以及其他的进程在占用着CPU资源
所以具体的核心池大小还得去结合其他线程及进程对CPU的使用情况,获取到线程池实际可以使用的CPU资源平均值,再结合任务执行的CPU空闲时间和计算时间去进行计算一个相对合理的数量区间 然后进行实地测试获取最理想的值。
同时也要考虑给cpu预留一定的空闲,cpu利用率长时间保持在百分之90以上甚至百分之百也是很危险的一件事情,如果其他线程突然在某个时间段内需要占用的cpu资源比较高就会造成系统卡顿甚至崩溃。比较健康的状况是尽量使cpu保持在百分之80多的使用率上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值