PHP MySQL'连接太多#39;问题 - Centos

时间:2015-01-28 12:28:31

标签: php mysql database-connection

我们在服务器设置上有高流量的流量,当流量超过100 + /秒时,我们面临着太多的连接' PHP&的问题MySQL的。我们为Application(PHP - 5.4.34)和Database(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
ServerLimit 1000
MaxClients 1000
MaxRequestsPerChild 99999

PHP配置:
memory_limit:2048
max_execution_time: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配置 数据库连接错误: SQLSTATE [HY000] [2003]无法在' 172.31.26.180'上连接到MySQL服务器(99)

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您的某个Apache进程会宣布由于连接太多而无法连接到MySQL。"

3500个同时连接确实是一个非常大的数字。您的数据库服务器似乎过度配置,并且此处的Web服务器受到限制。

这是您需要做的事情。

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

您也可以尝试将MaxRequestsPerChild切割为100左右。如果这大大解决了问题,那么就会在某处发生连接泄漏。

其次,在您拥有的工作负载水平上,您必须使用持久(可重用)MySQL连接。为此,您需要切换到mysqli_PDO apis。毫无疑问,这是值得的。

答案 1 :(得分:0)

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。