gpt4 book ai didi

PHP MySQL 'too many connections' 问题 - Centos

转载 作者:行者123 更新时间:2023-11-29 00:04:27 25 4
gpt4 key购买 nike

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

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

我们用谷歌搜索了解决方案,但我们仍然没有在这个问题上得到任何有值(value)的解决方案。

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

StartServers 300
MinSpareServers 300
MaxSpareServers 350
服务器限制 1000
最大客户端 1000
MaxRequestsPerChild 99999

PHP 配置:
内存限制:2048
最大执行时间:0
超时:15
keep_alive : 0ff
保持事件超时: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”(99) 上的 MySQL 服务器

最佳答案

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

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

这是您需要做的。

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

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

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

关于PHP MySQL 'too many connections' 问题 - Centos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28192270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com