这是一台六核 32 GB RAM 的计算机。我安装了 MySQL 5.1.47(反向移植)。配置几乎是标准的,除了 max_connections 设置为 2000。另一方面,nginx 上有 PHP5.3/FastCGI。有一个非常简单的 php 应用程序可供使用。NGINX 可以在这台机器上并行处理数千个请求。此应用程序通过 mysqli 访问 MySQL。在 mysqli 中使用非持久连接时,达到 100 个并发连接时会出现问题。
[错误] 14074#0:*296 FastCGI 在 stderr 中发送:“PHP 警告:mysqli::mysqli():[2002] 资源暂时不可用(尝试通过 unix:///tmp/mysqld.sock 连接)位于 /var/www/libs/db.php 第 7 行
我不知道该如何解决这个问题。通过 tcp 连接到 mysql 非常慢。有趣的是,当使用持久连接(在 mysqli 中将“p:”添加到主机名)时,前 5000-10000 个请求会失败,并出现与上述相同的错误,直到达到最大连接数(来自 Web 服务器,设置为 1500)。在第一个请求之后,MySQL 保持 1500 个打开的连接,一切正常,因此我可以发出 1500 个并发请求。嗯?这可能是 PHP FastCGI 的问题吗?
答案1
这听起来像是连接没有及时清理。如果是这样的话,“show processlist”应该会显示连接。查看 MySQL 文档,除非调整某些 PHP 参数,否则这似乎在 PHP 中很常见。您可能需要查看以下文章和评论:http://dev.mysql.com/doc/refman/5.0/en/too-many-connections.html
TCP 连接速度非常慢还可能引发另一种可能性,即 MySQL(或 tcpwrappers)可能正在尝试查找主机名以进行访问,但查找速度很慢。使用 unix 套接字时这种情况似乎不太可能发生,但如果它尝试匹配本地主机或系统主机名,则可能需要研究是否可以将任何访问规则移至 IP 或将其删除。
答案2
有可能,如果您一次连接 10,000 次,那么其中 1500 次将被接受,而其余 8500 次将被拒绝(也就是说,不会延迟,直到持久连接可用)。然后,后续请求将使用 1500 大持久池。
启动服务器时打开一次持久连接是否存在问题?
答案3
这是在什么操作系统上运行的?Windows 的 TCP 连接超时时间非常长。大约 90 秒。您必须进行一些注册表编辑才能将其缩短到更短的时间。将 10k 的端口限制提高到更高的值也很有用。
答案4
您是否还调整了 max_user_connections 参数? 可能是 nginx 被视为单个用户,并受该参数限制。