我们在服务器设置上有高流量的流量,当流量超过100 + /秒时,我们面临着太多的连接' PHP&的问题MySQL的。我们为Application(PHP - 5.4.34)和Database(MySQL - 5.5.40)提供了单独的AWS节点。
我们搜索了解决方案,但我们仍未就此问题获得任何有价值的解决方案。
修改
以下是有关我们服务器设置的更多详细信息,我们在下面使用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)
答案 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。