网站更新内容:请访问: https://bigdata.ministep.cn/

confluence 在高负载期间变慢并超时

 

由于数据库连接池,Confluence 在高负载期间变慢并超时

诊断

在减速过程中需要 10线程转储间隔 20 - 30 秒并分析线程转储。

您会发现许多 HTTP 线程正在等待获取与数据库的连接,如下所示。

"http-8080-Processor150" daemon prio=1 tid=0x08543368 nid=0x11aa in Object.wait() [0x665a4000..0x665a51b0]
at java.lang.Object.wait(Native Method)
- waiting on <0x83140488> (a com.mchange.v2.resourcepool.BasicResourcePool)
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAcquire(BasicResourcePool.java:968)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:208)
- locked <0x83140488> (a com.mchange.v2.resourcepool.BasicResourcePool)

或者

"TP-Processor3" daemon prio=1 tid=0x1fc5bd30 nid=0x279c in Object.wait() [0x1e47d000..0x1e47dda0]
	at java.lang.Object.wait(Native Method)
	at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1315)
	at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
	- locked <0x32cf7538> (a com.mchange.v2.resourcepool.BasicResourcePool)
	at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)

您还会看到许多 HTTP 线程实际上正在正常运行。

"http-8080-Processor47" daemon prio=1 tid=0x098d5d40 nid=0xe2a runnable [0x757fc000..0x757ff1b0]

计算正常运行的HTTP 线程数。

原因

为数据库连接池配置的连接数太小,无法处理高峰负载时间传入的请求数。

例如,在执行诊断/测试后,大部分 HTTP 连接都在等待获取与数据库的连接。如上例所示,HTTP 线程 150 正在等待与数据库的连接。这表明 Confluence 有近 150 个并发的事情需要做。

几乎每个 HTTP 线程都需要连接到数据库以执行某种工作。但是如果DB的连接数太少,这个资源就会成为瓶颈。

在上面的例子中,我们可以统计到通常有 30 个线程在运行并实际工作。三十是数据库池中的默认数据库连接数。

此外,如果流氓或贪婪线程消耗大量资源,它会强制安装进入垃圾收集模式。当 JRE 执行此操作时,它会将所有应用程序线程从 CPU 上移开。最终结果是请求继续从用户那里累积,但是 Confluence 无法完成这些请求,并最终耗尽了池中所有可用的数据库连接。

解决

  1. 优化数据库连接池。这定义了数据库池中的最大连接数。此数字应至少比高峰时间将使用的 HTTP 线程数高 10 个计数或高 25%(以较大者为准)(请参阅下面的设置 HTTP 线程。)这是为了考虑用于活动 HTTP 线程之上的后台作业。(拿一个外部线程转储在高峰加载时间并计算正在使用的 HTTP 线程数)。
    1. 如果你设置了到数据库的直接 JDBC 连接:
      检查你的confluence.cfg.xml文件,在你的 <confluence-home> 目录中找到。您会发现以下行,您需要根据自己的需要对其进行更新:

      <property name="hibernate.c3p0.max_size">60</property>

      如果您运行的是 Confluence 7.14 或更高版本,请将这两个属性更新为相同的 。 

      <property name="hibernate.c3p0.max_size">60</property>
      <property name="hibernate.hikari.maximumPoolSize">60</property>
    2. 如果您在以下位置使用数据源conf/server.xml:如果使用 Confluence 5.8.x 或更高版本(捆绑了 Tomcat 8):配置参数。另请注意,配置选项  已重命名 为See
      maxTotal maxWait maxWaitMillis in Tomcat8.  在 Apache Tomcat 中配置 MySQL 数据源举个例子。 

      <Resource name="jdbc/confluence" auth="Container" type="javax.sql.DataSource"
      ...
      maxTotal="60"
      />


      如果使用 Confluence 5.7.x 或更低版本(捆绑了 Tomcat 7 或更低版本):改为配置参数(此属性在 Tomcat 8 中maxActive重命名为)。maxTotal

      <Resource name="jdbc/confluence" auth="Container" type="javax.sql.DataSource"
      ...
      maxActive="60"
      />
    3. 假设定义的数量大约等于进行线程转储时正在运行的 HTTP 线程数,其余线程正在等待与数据库的连接。在这种情况下,这表明您与数据库的连接数不足。
  2. 将可用的 HTTP 线程数限制为更接近可用的数据库连接数。如果您将遇到瓶颈,那么 HTTP 线程池比数据库连接池更好,因为等待 HTTP 连接时消耗的资源更少。
    如何做到这一点取决于您的应用程序服务器是如何配置的。
    1. 对于使用默认连接器的独立配置,更改(或添加,如果它不存在)maxThreads定义在 Connector 的属性 <conf-install>\conf\server.xml。如果未指定此参数,则默认为 200。

          maxThreads="48"
  3. 评估数据库性能。
  4. 建立超时。看配置数据库查询超时 了解更多信息。

[由于数据库连接池,Confluence 在高负载期间变慢并超时 | 合流 | Atlassian 文档](https://confluence.atlassian.com/confkb/confluence-slows-and-times-out-during-periods-of-high-load-due-to-database-connection-pool-146407630.html)

[在 Apache Tomcat 中配置 MySQL 数据源 | Confluence 数据中心和服务器 5.9 | Atlassian 文档](https://confluence.atlassian.com/conf59/configuring-a-mysql-datasource-in-apache-tomcat-792499579.html)

posted @ 2023-02-12 23:47  ministep88  阅读(181)  评论(0编辑  收藏  举报
网站更新内容:请访问:https://bigdata.ministep.cn/