【问题标题】:PHP MySQL 'too many connections' issue - Cent OSPHP MySQL“连接太多”问题 - Centos
【发布时间】:2015-01-28 12:28:31
【问题描述】:

我们在服务器设置上有很高的并发流量,当流量超过 100+/秒时,我们面临着 PHP 和 MySQL 的“连接过多”问题。我们为应用程序(PHP - 5.4.34)和数据库(MySQL - 5.5.40)有单独的 AWS 节点。

  • 在 MySQL 中,我们有 3500 个最大连接数限制,我们也进行了调整 MySQL 中的变量。
  • 在高流量时间,DB节点CPU利用率不超过10% 和 RAM 使用低于 4GB。但我们仍然面临着联系 应用程序节点问题。
  • 对数据库使用 MyISAM 引擎。
  • 使用 mysql_connect 函数并在每次页面完成时关闭连接。
  • 我们使用 Monyog 工具监控数据库,因为没有慢查询或队列。

我们搜索了解决方案,但仍然没有找到任何有价值的解决方案。

编辑:
以下是有关我们服务器设置的更多详细信息,我们使用的是 Apache prefork mpm 和下面的当前 mpm 设置。

StartServers 300
MinSpareServers 300
MaxSpareServers 350
服务器限制 1000
MaxClients 1000
MaxRequestsPerChild 99999

PHP 配置:
内存限制:2048
最大执行时间:0
超时:15
keep_alive : 0ff
keep_alive_timeout : 5

AWS EC2
应用节点:
核心:8 个 vCPU
CPU 利用率:89%
内存:30.5GB 中的 2048MB
连接:mysql_connect API

它消耗更多的 CPU 利用率和较低的 RAM 使用率。

编辑:(更新)
我们将连接 API 更新为 PDO 并实现了包中的更改。通过测试运行,我们再次发现了同样的问题。随着 PDO 更新,我们也更改了 Apache 配置。
DB 连接错误: SQLSTATE[HY000] [2003] 无法连接到“172.31.26.180”上的 MySQL 服务器 (99)

【问题讨论】:

  • 这个错误是来自 apache/ngix 还是 mysql ?
  • 这个错误出现在 apache 应用程序节点上
  • 你需要在 apache 中增加你的工人数量。
  • 我们通过更改 MySQL 服务器变量来解决“连接过多”问题。我们增加了 'max_connect_errors' 变量。现在我们面临着高 CPU 使用率。对此有何建议?
  • 这是一个非常奇怪的错误...听起来您的服务器无法处理您的网站产生的负载,这就是您的 CPU 利用率非常高的原因。长时间运行的查询也可能导致 CPU 使用率高,您可以检查您的慢查询日志。

标签: php mysql database-connection


【解决方案1】:

如果我正确理解您的问题,您的 Apache 进程之一宣布由于“连接过多”而无法连接到 MySQL。

3500 个同时连接确实是一个非常大的数字。您的数据库服务器似乎被过度配置,而您的网络服务器在这里受到限制。

这是你需要做的。

首先,尝试减少而不是增加您的 apache ThreadLimit 和 ThreadsPerChild 参数。您需要更少而不是更多的 apache / php 线程来尝试连接到您的数据库。当你没有足够的 apache 线程时会发生什么?您的客户端请求进入 TCP listen() 队列。这没有什么坏处,因为任何空闲线程都可以使用来自该队列的请求。

您也可以尝试将 MaxRequestsPerChild 减少到 100 左右。如果这极大地解决了问题,则说明某处存在连接泄漏。

其次,就您的工作负载而言,您必须使用持久(可重用)MySQL 连接。为此,您需要切换到 mysqli_PDO api。毫无疑问,这值得您费心。

【讨论】:

  • 感谢您的回复,让我们尝试使用 PDO 和这些更改。
【解决方案2】:

https://serverfault.com/questions/370150/server-crashing-too-many-connections

StartServers          2
MinSpareThreads      25
MaxSpareThreads      75 
ThreadLimit          64
ThreadsPerChild      25
MaxClients           400
MaxRequestsPerChild  20000

请使用这些值更新帖子。它将有助于故障排除。

你的 apache 配置看起来有点乱。

你的进程太多了。 http://httpd.apache.org/docs/2.0/mod/mpm_common.html#startservers

每个核心需要 1 个。最多 8 个 apache 服务器。

我会把它切换到 4

设置最小服务器数 4

设置最大服务器数 16

ServerLimit 16

这是关于 MaxClients 的一些信息 http://httpd.apache.org/docs/2.0/mod/mpm_common.html#maxclients

这是一个速率限制设置,我会将其设置为合理的值。如果您平均获得 100 rq/s,我可能会将其设置为 400。

MaxRequestsPerChild 也是一个速率限制设置。我会将其设置为不超过 200。

【讨论】:

  • 发布了我们当前的 apache 设置,请浏览并发布您的回复。谢谢
  • 让您发布记录错误的日志可能会有所帮助。我仍然不能 100% 确定是 apache 还是 mysql 导致了错误。
  • 我们检查了错误日志,发现以下错误:ERROR - 2015-1-30 11:06:26 --> Severity: Warning --> mysql_pconnect( ): 无法连接到“ip-123-3-10-46.ap-southeast-1.compute.internal”上的 MySQL 服务器 (99) ../../../mysql_driver.php 91 错误 - 2015-1-30 11:06:26 --> 无法连接到数据库
  • 我不会使用主机名来尝试连接。大多数地方都有您可以使用的内部 IP 地址。此错误表明的唯一情况是无法访问数据库服务器。
  • 我们只使用私有 IP 进行数据库连接。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 2016-04-24
  • 1970-01-01
  • 2017-10-30
  • 2020-11-20
  • 2017-12-27
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多