由于数据库连接池,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 无法完成这些请求,并最终耗尽了池中所有可用的数据库连接。
解决
- 优化数据库连接池。这定义了数据库池中的最大连接数。此数字应至少比高峰时间将使用的 HTTP 线程数高 10 个计数或高 25%(以较大者为准)(请参阅下面的设置 HTTP 线程。)这是为了考虑用于活动 HTTP 线程之上的后台作业。(拿一个外部线程转储在高峰加载时间并计算正在使用的 HTTP 线程数)。
-
如果你设置了到数据库的直接 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>
-
如果您在以下位置使用数据源
conf/server.xml
:如果使用 Confluence 5.8.x 或更高版本(捆绑了 Tomcat 8):配置参数。另请注意,配置选项 已重命名 为SeemaxTotal
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" />
- 假设定义的数量大约等于进行线程转储时正在运行的 HTTP 线程数,其余线程正在等待与数据库的连接。在这种情况下,这表明您与数据库的连接数不足。
-
- 将可用的 HTTP 线程数限制为更接近可用的数据库连接数。如果您将遇到瓶颈,那么 HTTP 线程池比数据库连接池更好,因为等待 HTTP 连接时消耗的资源更少。
如何做到这一点取决于您的应用程序服务器是如何配置的。-
对于使用默认连接器的独立配置,更改(或添加,如果它不存在)
maxThreads
定义在 Connector 的属性<conf-install>\conf\server.xml
。如果未指定此参数,则默认为 200。maxThreads="48"
-
- 评估数据库性能。
- 建立超时。看配置数据库查询超时 了解更多信息。
[由于数据库连接池,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)
标签:HTTP,变慢,数据库,confluence,线程,mchange,超时,com,BasicResourcePool From: https://www.cnblogs.com/ministep/p/17115046.html