【问题标题】:tomcat - ratio between HTTP Connector maxThreads / acceptCount and JDBC pool maxActivetomcat - HTTP 连接器 maxThreads / acceptCount 和 JDBC 池 maxActive 之间的比率
【发布时间】:2019-04-10 01:58:43
【问题描述】:

是否有一些常识可以接受的比例

  • HTTP 连接器 ma​​xThreads(处理用户请求的最大 HTTP 线程数),
  • HTTP 连接器 acceptCount(当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度)
  • 数据库池ma​​xActive(池中的最大数据库连接数)配置属性

当涉及到使用大量使用数据库的 tomcat 的 Web 基础应用程序时?

我的意思是,例如我们几乎每个 HTTP 请求连接都在密集使用数据库。因此,当我们配置的 DP 池 ma​​xActive(例如 100)要少得多,而 HTTP 连接器 ma​​xThreads(例如 200)则要大两倍。 那么就有可能在 HTTP 连接之间共享一个相同的 DB 连接。这可能会导致大量使用数据库 / 数据库停止连接

我知道在大多数情况下 Web HTTP 请求配置与数据库池配置无关,但是属性之间的比率 (maxThreads/acceptCount maxActive) 是否存在常见案例/实践?例如。 HTTP maxThreads 比 DB maxActive 大是一种常见的做法(但是根据我们的示例,认为大 100% 太大了 - 可以说最大 20% 或 50%?),假设我们的 accpetCount 具有更大的值,所以要在应用程序处理其他 HTTP 请求时将 HTTP 请求排队?

这里有类似的问题:Tomcat - Configuring maxThreads and acceptCount in Http connector 但没有更准确的答案

【问题讨论】:

    标签: java tomcat httpconnection jdbc-pool


    【解决方案1】:

    首先,澄清几点:

    • 线程之间不共享 JDBC 连接以避免破坏隔离要求。如果池耗尽,请求将在队列中等待,直到分配连接或发生超时。
    • 请求在达到 ma​​xThreads 值时得到处理,任何额外的请求都被放入队列中,直到 acceptCount 值。

    acceptCount:传入连接请求的最大队列长度当所有可能的请求处理线程都在使用时

    • ma​​xActive 是您示例中的瓶颈,因此超出该数量的请求将等待数据库连接。更准确地说,瓶颈在数据库连接池上。您不会得到停滞的数据库连接,而是等待来自池的连接的线程。

    也就是说,找到这些值之间的比率没有太大价值,因为 ma​​xActive 会施加限制。 ma​​xThreads >= maxActive 是显而易见的经验法则。

    ma​​xThreads 永远不会达到,除非您的应用程序负载如此说明,但您的数据库池应该能够应对该负载,否则您的应用程序将失败。

    在这种情况下调整性能更多的是调整数据库连接池和线程池动态,而不是设置限制。一旦达到限制,就没什么可做的了,要么找到导致缓慢的代码,要么扩大规模。

    池动态是指最小空闲conn/threads,保持空闲多长时间,一次在池中创建多少新条目等。

    希望这会有所帮助!

    Tomcat 7 HTTP connector docs.

    【讨论】:

    • 感谢 Luis 的描述性回复。按照您的意见,为了避免 http 线程等待数据库连接(我们假设用户 http 请求正在密集使用数据库),也许值得让 maxActive 和 maxThreads 两个值更相似,这意味着 maxThreads 的值不会比 maxActive 的值大多少,因为在这种情况下我们可能会遇到一些前端停止连接(因为前端 http 线程将等待可用的数据库连接)?例如。 maxActive=100 和 maxThreads=130 或类似 - 但不是 maxThreads 数量的两倍/三倍
    • maxThreads=200 默认情况下,为什么不保持原样?降低该值不会提高性能。另一方面,连接停滞可能是由于应用程序未按时响应造成的。也许 maxActive=100 不足以满足您的工作量。性能调优是发现瓶颈并修复它们,而不是设置限制。
    • 是的,但是在我们的例子中,http 线程正在等待来自池的数据库连接,当数据库池已满时 - 所有数据库连接都被其他 http 线程使用。使这两个属性具有相似的值可能会避免停止连接,并水平扩展应用程序本身 - 实例数。不幸的是,增加每个实例的数据库连接数将限制另一侧的数据库连接的数据库限制数据库实例。最后是 H scale up/maxThreads/maxActive 的组合 - 差异性能测试将显示最佳组合
    • 所以如果我需要一个 jdbc 连接来处理任何 http 请求设置 maxThreads == maxActive 好不好?如果我有一些其他线程(cron 或其他)可能是 maxThreads
    • maxActive 应该以某种方式遵循 maxThreads 的规定,这取决于 http 请求的负载。两者都应该适应为您的应用程序提供最大稳定负载以及一些合理的开销。 maxThreads < maxActive 我猜这不是常见的情况,在这种情况下 jdbc 池可能会过大。
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2010-11-23
    • 2021-04-23
    • 2013-05-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多