我在调查许多睡眠MySQL连接的问题时遇到了麻烦。
每隔一两天我会注意到所有(151)MySQL连接 被带走,所有人似乎都在睡觉。
我对此进行了调查,其中一个最合理的解释是PHP脚本刚被杀死,后面留下了MySQL连接。我们在请求开始时记录访问,并在请求完成时更新该日志,因此我们可以确定一些请求确实已经开始,但是没有完成,这表明该脚本确实以某种方式被杀死。
现在,令人担忧的是,这只发生在1个特定用户上,而且只发生在1个特定页面上。该页面适用于其他所有人,当我在生产环境中以此用户身份登录并执行完全相同的操作时,一切正常。
现在,我有两个问题:
我想找出PHP脚本被杀的原因。这可能与客户有什么关系吗?客户可以做些什么'结束请求并杀死PHP脚本?如果是这样,为什么我在Apache日志中没有看到任何证据?或许我不知道该找什么?如何确定脚本是否确实被杀死或者是什么原因造成的?
如何防止这种情况?我可以以某种方式设置每个PHP会话的mysql连接数限制吗?或者我可以以某种方式检测长时间运行和睡眠的mysql连接并杀死它们?我不能将连接超时设置为更短的时间,因为有些进程运行时间要长得多,并且151个连接在不到2分钟的时间内就用完了。增加连接数也无法解决问题。所以,基本上..我如何杀死睡眠时间超过1分钟的进程?
最好的解决方案是我找出为什么1个用户的请求可以占用所有数据库连接并基本上关闭整个应用程序。以及如何防止这种情况。
任何帮助非常感谢。
答案 0 :(得分:3)
您可以减少MySQL服务器的wait_timeout
variable。这指定MySQL在中止连接之前等待非交互式连接上的任何内容的秒数。默认值为28800
秒,这似乎很高。您可以通过执行SET GLOBAL wait_timeout = X;
一次动态设置它。
你仍然可以再次为cronjobs增加它。只需在cronjob的开头执行查询SET SESSION wait_timeout = 28800;
即可。这只会影响当前连接。
如果你设置得太低,请注意这个might cause problems。虽然我没有看到那么多问题。大多数脚本应该在不到一秒钟内完成。因此设置wait_timeout=5
应该不会造成伤害......