如何估算线程池的线程数?
Posted 宇的季节
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何估算线程池的线程数?相关的知识,希望对你有一定的参考价值。
如何估算线程池的线程数
估算线程数有个公式:
threadNum = (1 + (ioTime / cpuTime)) * coreNum
coreNum:cpu核心数
cpuTime:cpu运转时间,计算方式:注释io操作,mock结果,逻辑执行完的时间
allTime:所有逻辑正常执行的时间
ioTime = allTime - cpuTime;
推导:如果想最大化的利用cpu,就需要尽量减少cpu等待的时间,那么(1 + (ioTime / cpuTime)) * coreNum便是理想情况下线程数量,执行情况如下图:
带入公式:(1 + (ioTime / cpuTime)) * coreNum = threadNum
如果线程数量为(1 + (3 / 1)) * 1 = 4时,可以最大化利用cpu
额外的考虑点
当io主要为网络io时,需要考虑带宽的影响此时计算公式如下
threadNum = min(网卡带宽, 网络带宽) / 单个线程的平均下载速度
如果机器有其他应用,需要预留带宽,那么线程数不宜超过此数,防止造成其他应用网络拥塞
以上是关于如何估算线程池的线程数?的主要内容,如果未能解决你的问题,请参考以下文章
线程池大小设置,CPU的核心数线程数的关系和区别,同步与堵塞完全是两码事
Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?