当前位置: 首页 > 知识库问答 >
问题:

线程池大小应远远大于核心数+1

白赞
2023-03-14

自定义线程池的建议大小是number_of_cores+1(请参见此处和此处)。假设有一个Spring应用程序在一个系统上有两个核心,配置如下所示

<task:executor id="taskExecutor" 
pool-size="#{T(java.lang.Runtime).getRuntime().availableProcessors() + 1}" />
<task:annotation-driven executor="taskExecutor" />

在这种情况下,将有一个ExecutorService在几个请求之间共享。因此,如果有10个请求到达服务器,那么在ExecutorService中只能同时执行其中的3个请求。这可能会产生瓶颈,并且随着请求数量的增加,结果会变得更糟(请记住:默认情况下,tomcat最多可以处理200个同时请求=200个线程)。该应用程序在没有任何池的情况下会表现得更好。

通常一个内核一次可以处理多个线程。例如,我创建了一个服务,它调用了两次https://httpbin.org/delay/2。每个调用执行需要2秒。因此,如果不使用线程池,服务的响应时间平均为4.5秒(通过20个同时请求对此进行了测试)。如果使用线程池,则reponse会根据池大小和硬件而变化。我在4个不同池大小的核心机器上运行了一个测试。下面是以毫秒为单位的最小、最大和平均响应时间的测试结果

共有1个答案

毋澄邈
2023-03-14

您链接到的两个页面都明确表示,这只适用于未阻塞的、CPU绑定的任务。

您的任务被阻止在远程计算机上等待,因此此建议不适用。

忽略不适用于您的建议没有错,因此您可以并且应该增加线程池大小。

陈峰,在他的博客“旧的新事物”上

 类似资料:
  • 当我们用来谈论核心池大小和最大池大小之间的区别到底是什么? 可以借助示例来解释吗?

  • 问题内容: 许多次我听说最好将线程池中的线程数保持在该系统中的内核数以下。具有比核心数多两倍或更多的线程不仅浪费,而且还可能导致性能下降。 那些是真的吗?如果不是,那么揭露这些主张的基本原则是什么(特别是与Java有关)? 问题答案: 许多次我听说最好将线程池中的线程数保持在该系统中的内核数以下。具有比核心数多两倍或更多的线程不仅浪费,而且还可能导致性能下降。 这些主张 作为一般性陈述 是不正确的

  • 我正在尝试从构建镜像。构建后,命令报告的镜像虚拟大小为1.917 GB。我登录检查大小(),它是573 MB。我很确定这个巨大的大小通常是不可能的。这是怎么回事?如何获得正确的图像大小?更重要的是,当我推送这个存储库时,大小是1.9 GB而不是573 MB。 输出

  • null 其他地方配置了工人数,当前;是而是。我在一台拥有两个核心和8GB内存的Macbook Pro 10上测试这一点;生产服务器要大得多。我正在与之交谈的数据库背后是一个速度极慢的VPN。我使用Oracle的Javase1.8JVM运行所有这些。本地服务器是Tomcat7。Oracle JDBC驱动程序是10.2版(我也许能够说服那些使用较新版本的能力)。所有方法要么返回要么返回并且应该是非阻

  • 本文向大家介绍php获取远程文件大小,包括了php获取远程文件大小的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php获取远程文件大小的方法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助,大家能够喜欢小便的文章,大家共同进步。

  • 我是Git新手,有一个相当大的项目,我想在Github上推送到远程回购(repo B)。最初的项目也在Github上,但来自不同的回购协议(RepoA)。在我可以在Repo B上设置项目之前,我必须对Repo A中的文件进行一些更改。我已经设置了远程设备、ssh密钥等,并且在将代码库推到Repo B时遇到了问题。 我一直收到以下错误: 我在本地gitconfig中更改了以下设置 ...运行git