【发布时间】:2014-05-23 09:08:05
【问题描述】:
我在调查与许多休眠 MySQL 连接有关的问题时遇到了麻烦。
每隔一两天我就会注意到所有 (151) 个 MySQL 连接 被带走了,而且他们似乎都在睡觉。
我对此进行了调查,最合理的解释之一是 PHP 脚本刚刚被杀死,留下了 MySQL 连接。我们在请求开始时记录访问,并在请求完成时更新该日志,因此我们可以判断确实有些请求确实开始了,但没有完成,这表明脚本确实以某种方式被杀死。
现在,令人担忧的是,这只发生在 1 个特定用户上,并且只发生在 1 个特定页面上。该页面适用于其他所有人,当我在生产环境中以该用户身份登录并执行完全相同的操作时,一切正常。
现在,我有两个问题:
我想知道为什么 PHP 脚本被杀死了。这可能与客户有关吗?客户端可以做“某事”来结束请求并终止 php 脚本吗?如果是这样,为什么我在 Apache 日志中没有看到任何证据?或者也许我不知道要寻找什么?如何确定脚本是否确实被杀死或者是什么原因导致的?
我该如何防止这种情况发生?我能否以某种方式限制每个 PHP 会话的 mysql 连接数?或者我可以以某种方式检测长期运行和休眠的 mysql 连接并杀死它们吗?将连接超时设置为更短的时间不是我的选择,因为有些进程运行时间要长得多,并且 151 个连接在不到 2 分钟的时间内用完。同样增加连接数也不是解决办法。所以,基本上..我如何杀死睡眠时间超过 1 分钟的进程?
最好的解决方案是我找出为什么 1 个用户的请求会吃掉所有数据库连接并基本上关闭整个应用程序。以及如何防止这种情况。
非常感谢任何帮助。
【问题讨论】:
-
您的设置到底是什么? PHP 作为 apache 模块还是 FCGI?受影响的日志中有信息吗?
-
您的网络服务器配置为处理多少并发连接?也许允许的 Web 进程比 MySQL 的
max_connections可以处理的更多,每个都可以连接到 MySQL?这可能会导致超出限制,而不会任意杀死任何进程。 -
所描述的行为在默认配置下不正常,建议不要更改配置,而是尝试查找问题的根源。
-
@DanFromGermany 如果网络服务器可以创建比 MySQL 可以处理的更多的进程,这将是非常正常的行为。由于杀死 PHP 进程仍然只是提问者的一个猜测......但我承认仔细研究是有道理的。
-
我使用 PHP 作为 Apache 模块。似乎 Apache 可以处理比 mysql 更多的连接,所以这确实是最终数据库拒绝任何更多并且新连接开始失败的原因。所以我会更新这些设置,导致新请求排队。但是,我仍然不知道为什么mysql连接会进入睡眠状态,以及为什么它们在Apache会话结束后没有终止......
标签: php mysql sleep connection