【问题标题】:application level thread pool and tomcat应用级线程池和tomcat
【发布时间】:2018-01-14 07:20:09
【问题描述】:

假设一个 java 应用程序有自己的线程池来支持并发任务执行,总共分配了 500 个线程。 Tomcat 还配置为通过连接器配置支持总共 1000 个线程。

1000 线程的连接器配置是作为 500 线程应用程序线程池的超集,还是这两个独立的线程池?这是否意味着总共为部署的应用程序分配了 1000 个线程,还是 500 + 1000 = 1500?

【问题讨论】:

    标签: java multithreading tomcat


    【解决方案1】:

    当您将连接器配置为最多具有 1000 个线程时,连接器将最多具有 1000 个线程。它不会检查同一 VM 中可能有多少线程处于活动状态。

    您没有说明如何分配自定义线程池,但我从未遇到过将其允许线程数与系统中正在发生的其他事情相关联的线程池(除了用完记忆)。

    那么你回答的原因是 1500。

    这也很容易发现:只需将您的系统置于它应该处理 1000 个线程的负载下并导致线程转储。当您配置具有 1000 个线程的连接器时,您显然是在这样做,因为您已经测量到这是您处理的卷的合适大小,这意味着您有可以轻松生成该负载的负载测试。

    我建议不要产生所有这些线程,而是研究java.util.concurrent.Executor 及其亲属。

    【讨论】:

    • 我使用 java.util.concurrent 库只是为了创建和使用自定义线程池。
    【解决方案2】:

    Java 的后台线程池实际上被基础库的某些部分重用。因此,例如,如果您运行并行化流,则所有这些流都使用完全相同的线程池。

    Apache 软件倾向于复制基本 Java 库的原因超出我的理解,这意味着 Tomcat 使用其自己的线程池版本,与基本库线程池完全不兼容或重复使用。

    如果您运行 500 个 Java 基础库线程池线程和 1000 个 Tomcat 线程,那么实际上您正在运行 1500 个线程。如果考虑到线程切换的成本很低,那么拥有如此多的活动线程将导致系统花费大量时间在线程处理上,而不是执行实际代码。究竟有多少完全取决于内部结构和负载,但根据您描述的情况,有根据的猜测是线程切换浪费了大约 5-15% 的 CPU 时间。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2010-12-09
      • 2018-05-16
      • 2014-11-16
      • 2019-06-07
      • 1970-01-01
      • 2012-09-27
      • 2018-05-22
      • 2023-03-26
      相关资源
      最近更新 更多