如何计算线程数的最优值?——咱有公式

简介: 如何计算线程数的最优值?——咱有公式

计算出应该用于应用程序的理论最优线程数非常简单。但是,您需要了解应用程序运行时特征。它主要是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)

image.png

在Goetz(2002)描述最优的线程数计算公式如下,

threads = number of cores * (1 + wait time / service time)

image.png

我们可以将wait time / service time视为衡量任务争用程度的指标。


Goetz 和 Subramaniam 统一意见


出于兴趣,我们可以证明两个IO绑定公式都是等价的。 从Goetz的公式开始,我们设w + s = 1,消掉s后会出现,

image.png

化简得到,

image.png

相关文章
|
监控 算法 Java
Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算
目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件                                           procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ...
7583 0
|
8月前
|
Java
Java并发计算判断线程池中的线程是否全部执行完毕
Java并发计算判断线程池中的线程是否全部执行完毕
69 0
|
Dubbo NoSQL Java
别再纠结线程池大小了,没有固定公式的!终于有人说清楚了。。
可能很多人都看到过一个线程数设置的理论: CPU 密集型的程序 - 核心数 + 1 I/O 密集型的程序 - 核心数 * 2 不会吧,不会吧,真的有人按照这个理论规划线程数?
185 0
别再纠结线程池大小了,没有固定公式的!终于有人说清楚了。。
|
测试技术
【高并发】高并发场景下创建多少线程才合适?一条公式帮你搞定!!
创建多少线程合适, 要看多线程具体的应用场景。一般来说,我们可以将程序分为:CPU密集型程序和I/O密集型程序, 而针对于CPU密集型程序和I/O密集型程序,其计算最佳线程数的方法是不同的 。
226 0
|
监控 Java 应用服务中间件
如何计算tomcat线程池大小?
背景   在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢?   接下来,我将介绍本人是怎么设计以及计算的。 目标   确定tomcat服务器线程池大小 具体方法   众所周知,tomcat接受一个request后处理过程中,会涉及到cpu和IO时间。
1567 0
|
1天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
1天前
|
缓存 安全 Java
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
|
1天前
|
数据采集 安全 Java
Python的多线程,守护线程,线程安全
Python的多线程,守护线程,线程安全