【问题标题】:What is killing my PHP process, and leaving so many sleeping mysql connections?是什么杀死了我的 PHP 进程,并留下了这么多休眠的 mysql 连接?
【发布时间】:2014-05-23 09:08:05
【问题描述】:

我在调查与许多休眠 MySQL 连接有关的问题时遇到了麻烦。

每隔一两天我就会注意到所有 (151) 个 MySQL 连接 被带走了,而且他们似乎都在睡觉。

我对此进行了调查,最合理的解释之一是 PHP 脚本刚刚被杀死,留下了 MySQL 连接。我们在请求开始时记录访问,并在请求完成时更新该日志,因此我们可以判断确实有些请求确实开始了,但没有完成,这表明脚本确实以某种方式被杀死。

现在,令人担忧的是,这只发生在 1 个特定用户上,并且只发生在 1 个特定页面上。该页面适用于其他所有人,当我在生产环境中以该用户身份登录并执行完全相同的操作时,一切正常。

现在,我有两个问题:

  1. 我想知道为什么 PHP 脚本被杀死了。这可能与客户有关吗?客户端可以做“某事”来结束请求并终止 php 脚本吗?如果是这样,为什么我在 Apache 日志中没有看到任何证据?或者也许我不知道要寻找什么?如何确定脚本是否确实被杀死或者是什么原因导致的?

  2. 我该如何防止这种情况发生?我能否以某种方式限制每个 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


【解决方案1】:

您可以减少 MySQL 服务器的wait_timeout variable。这指定了 MySQL 在中止连接之前等待非交互式连接上的任何内容的秒数。默认值为28800 秒,看起来相当高。您可以通过执行一次SET GLOBAL wait_timeout = X; 来动态设置它。

您仍然可以再次为 cronjobs 增加它。只需在 cronjob 的开头执行查询SET SESSION wait_timeout = 28800;。这只会影响当前的连接。

请注意这个might cause problems,如果你设置得太低的话。虽然我没有看到那么多问题。大多数脚本应该在一秒钟内完成。因此,设置wait_timeout=5 应该不会造成任何伤害……

【讨论】:

  • 谢谢。我会试试这个。它并不完美,但它可能暂时解决我的问题。仍然需要找出它发生的原因,因为用户提交相同请求的速度更快,我又遇到了同样的问题。但感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多