【问题标题】:Tomcat线程池大小和内核数[关闭]
【发布时间】:2022-01-23 00:03:54
【问题描述】:

Tomcat 默认创建 25 个线程,默认创建最多 200 个额外线程。

但问题是,cpu核心数很少超过32。

也就是说,由于并行处理的数量在32左右,所以我认为线程池的最大数量是50。

不知道为什么Tomcat把最大线程数设为200。

或者当请求进来时分配一个线程并排队,即使它不能并行处理?如果是这样,那就太奇怪了。为什么要将甚至无法执行的资源分配给线程? (当然我知道,如果线程池中没有线程,就会排队。)

【问题讨论】:

  • 你为什么会这么想?

标签: java multithreading tomcat


【解决方案1】:

在处理请求的过程中可能会发生各种各样的事情:可以读取文件,可以在远程数据库服务器上执行查询,可以调用远程 Web 服务,所有这些操作都是上下文切换到另一个的机会线程。

【讨论】:

  • 那么,线程池的数量是否足以应对I/O阻塞的情况?那么,如果线程池使用的 CPU 数量与核心数量相同,那么所有后续请求都会被拒绝?是否应该至少有一个 cpu 核心处于空闲状态?
【解决方案2】:

the number of cpu cores rarely exceeds 32. 正如其他人所提到的,线程提供并发性 - 另一个线程可以在另一个线程处于阻塞状态时执行。如果所有线程都处于活动状态,那么确实某些线程将上下文切换到分配给其核心的另一个线程。但无论如何,这似乎也是一个可配置的参数 - https://www.baeldung.com/java-web-thread-pool-config

【讨论】:

    【解决方案3】:

    我第一次编写多线程程序时,它的目的是在只有一个 CPU 内核的计算机上运行。发明线程是为了提供concurrency,这是一个比parallel processing 更广泛的主题。如果这些线程花费大量时间处于阻塞状态(例如,等待磁盘 I/O),则 Web 服务器拥有比 CPU 更多的池工作线程可能是有利的。


    cpu核心数很少超过32

    我不知道什么是稀有的,什么不是,但一些计算机的数量远远超过 32 个。IBM 当前最大的大型计算机可以配置超过 200 个内核。

    https://en.wikipedia.org/wiki/IBM_Z

    【讨论】:

    • 那么,线程池的数量是否足以应对I/O阻塞的情况?那么,如果线程池使用的 CPU 数量与核心数量相同,那么所有后续请求都会被拒绝?是否应该至少有一个 cpu 核心处于空闲状态?
    • @majava,我不是配置和调整 Web 服务器的专家。我知道 Apache 产品往往是高度可配置的。就像你说的那样,这些数字——25 个线程,200 个额外的线程——是默认值。你可以改变它们。但您的网站的最佳值可能取决于许多因素,其中一些可能超出我的理解范围。
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2016-05-21
    • 2022-06-19
    相关资源
    最近更新 更多