ThreadPoolExecutor参数设置

原文地址:http://www.eussi.top/view/18

生产上遇到后端系统任务在线程池中累积了几个小时的情况,主要是线程池统一配置,没有根据具体交易的情况进行具体设置造成的,经过查阅网上相关资料,总结一下如何对线程池的几个参数进行设置:

1-首先预估系统负载,需要以下几个值:

  • tasks :每秒的任务数,假设为50~100
  • taskTime:每个任务花费时间,假设为0.1s
  • responseTime:系统允许容忍的最大响应时间,假设为30s

2-计算

1)corePoolSize

每个任务需要taskTime秒处理,则每个线程每秒可处理1/taskTime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:

threadcount = tasks/(1/taskTime) = tasks*taskTime = (10~20)*0.05 = 5~10

根据计算可知,corePoolSize设置应该大于5小于10。

具体数字最好根据80/20原则,即80%情况下系统每秒任务数,若系统80%的情况下每秒任务数小于80,最多时为100,则corePoolSize可设置为8即可。

2)queueSize

任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为

queueSize = (corePoolSize/taskTime)*responseTime = (8/0.1) * 30 = 2400

根据计算可知,队列长度可设置为2400

另外需要注意的是,队列长度设置过大,会导致任务响应时间过长,切忌将队列长度设置为Integer.MAX_VALUE,将会导致线程数量永远为corePoolSize,再也不会增加,当任务数量陡增时,任务响应时间也将随之陡增。

3)maxPoolSize

当系统负载达到最大值时,核心线程数已无法按时处理完所有任务,这时就需要增加线程。每秒提交过来80个任务没问题,但是某段高峰时期达到了最大任务数,每一秒多提交了20个任务,达到了100个任务,每秒多出的20个任务需要在responseTime内处理完毕

maxPoolSize = ( max(tasks) - 80%(tasks) ) / responseTime / (1/taskTime) + corePoolSize = (100-80)/ 30 / (1/0.1) + 8 = 15

有上面的计算可知,最大线程数可设置为 15

4)keepAliveTime:

当负载降低时,可减少线程数量,如果一个线程空闲时间达到keepAliveTiime,该线程就退出。此值在对资源不敏感情况下默认设置即可。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值