[线程池]——ThreadPoolExecutor参数设置

wangxm 8月前 ⋅ 215 阅读

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

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,该线程就退出。此值在对资源不敏感情况下默认设置即可。


全部评论: 0

    评论: