计算出应该用于应用程序的理论最优线程数非常简单。但是,您需要了解应用程序运行时特征。它主要是CPU密集型工作还是主要等待IO?
在这篇博客中,我们将介绍如何为基于CPU和IO的任务计算出良好的线程池大小。
CPU绑定任务
对于CPU绑定任务,Goetz建议:
threads = number of CPUs + 1
很显然,如果CPU一直处于工作状态,就不能再做其它的工作。Goetz声称的额外的线程(加的1个)已被证明是一种提高而不是省略它。但是其他人不同意,认为线程数等于CPU数量是最佳的。
I/O绑定任务
计算IO绑定任务的最优值不是太明显。在 IO绑定任务期间,CPU将处于空闲状态(等待或阻塞)。此空闲时间可以更好地用于启动另一个IO绑定请求。
Subramaniam(2011,p.31)用以下公式描述了最佳线程数,
threads = number of cores / (1 – blocking coefficient)
在Goetz(2002)描述最优的线程数计算公式如下,
threads = number of cores * (1 + wait time / service time)
我们可以将wait time / service time
视为衡量任务争用程度的指标。
Goetz 和 Subramaniam 统一意见
出于兴趣,我们可以证明两个IO绑定公式都是等价的。 从Goetz的公式开始,我们设w + s = 1,消掉s后会出现,
化简得到,