4

我正在使用带有 2 个应用程序服务器和 1 个数据库服务器的 MySQL 和 PHP。随着用户数量的增加(现在大约 1000 个),我收到以下错误:

SQLSTATE[08004] [1040] Too many connections

参数max_connections设置为1000inmy.cnfmysql.max_persistent设置为-1in php.ini

一次最多有 1500 个 apache 进程在运行,因为MaxClientsapache 参数等于 750,并且我们有 2 个应用程序服务器。

  • 我应该按照此处的说明将其提高max_connections1500吗?
  • 或者我应该设置mysql.max_persistent为 750(出于性能原因,我们使用 PDO 和持久连接,因为数据库服务器与应用程序服务器不同)?
  • 还是我应该尝试别的?

提前致谢!

4

2 回答 2

3

我认为您的连接关闭速度不够快,并且它们会堆叠直到达到默认时间。我有同样的问题,我用 wait_timeout 解决了问题。

您可以尝试在 my.cnf 中进行设置

set-variable = max_connections=1000 // max connection
set-variable = max_user_connections=100 // max user connection per hour
wait_timeout = 60 // wait timeout for connection in seconds

as 将在 60 秒后终止任何现有连接

于 2010-05-24T09:02:48.220 回答
1

如果您可以摆脱持久连接,我认为您应该查看 PHP 代码。

持久连接的问题在于,即使在脚本退出后,php 实例仍使它们保持打开状态,直到数据已发送到客户端并且 php 实例被释放给下一个客户。

持久连接的另一个问题是,一些 PHP 代码可能会使用与启动时不同的设置、不同的语言环境或临时表离开套接字。

如果您可以重写代码,使每个连接只有一个或几个 mysql_connects,并且数据库句柄被传递到代码的不同部分或保存在 GLOBAL 中,那么丢失持久连接对性能的影响可以忽略不计。

而且,当然,将 max_connections 加倍也没什么坏处。无论如何,它对 PHP 不是很有用,因为 PHP/Apache 子程序总是经常退出并关闭句柄。max_connections 在其他环境中更有用。

于 2010-10-07T14:44:48.170 回答