调试 MySql 消失的错误,随机获得多个休眠线程

Debugging MySql Gone away errors, randomly geting multiple sleeping threads

从问题本身开始:我的服务器随机出现页面停止加载几分钟(通常达到 300 秒超时)或加载速度极慢的问题。它不一定与流量增加相关,但更有可能在流量增加时发生。有时我只是在胡闹,事情变慢了几分钟,然后一切恢复正常,访问了相同的文件。系统本身非常简单:除了基本的数据插入和读取外,它什么都不做,table 没有超过几千行。 Google 分析显示峰值并发访问在高峰时段约为每小时 300。

这是我们公司最近来的一个老项目。 PHP 代码很旧,我花了很多时间重构查询以使用集中式 PDO 连接,而不是每次之前都使用 mysql_connect。 但是,在旧服务器上,这些问题并没有发生,只是在新服务器上。

现在,开始吧。我们的托管服务说这实际上是他们服务器上的问题,我也找不到代码原因。几个月后,我们决定更换到另一台主机上的新专用服务器……问题仍然存在。所以一定是代码有问题,某处有问题,或者我需要更改配置。

事实是,没有特定的文件或脚本导致它。由于现在我拥有 WHM 控制权,我可以看到内存或 CPU 使用没有问题。慢日志查询为空,设置为20秒记录。发生的事情是 运行 一切都非常缓慢,然后很容易 returns 就正常了。

我在日志中看到的错误 MySql 已经消失,或者其他类似

AH01071: Got error 'Primary script unknown

(70007)The timeout specified has expired: [client IP] AH01075: Error dispatching request to : (polling) (Timeout is set at 300 seconds, nothing should take more than a couple to run).

我打开常规日志并注意到一件有趣的事情:当它发生时,一些线程需要一分多钟才能关闭。查询在日志中是这样的

SELECT *, 
    COUNT(DISTINCT(command_type)) as conta, 
    MIN(event_time) as inicio, 
    MAX(event_time) as fim, 
    timediff(MAX(event_time),MIN(event_time)) as diferenca 
FROM `general_log` 
WHERE user_host LIKE '%hostname%' 
GROUP BY thread_id HAVING diferenca > "00:01:00"

它显示了一些结果,我知道其中一个结果与感知到的缓慢有关。更有趣的是,减速前的最后一个命令是 select

SELECT * FROM publicidade WHERE secao = 1 ORDER BY posicao ASC, data_insercao DESC LIMIT 2

事情是,这个 select 总是 运行 很快,在 table 有 29 行,返回 1 个结果。把事情搞砸是没有意义的,但它始终是显示的最后一个查询命令,甚至发现了 2 种线程从未退出的情况。

所以在这一点上我束手无策。问题不断发生,它是间歇性的,无缘无故地来来去去,我也找不到原因。 slow_queries 日志是空的,所以它不像有一个查询挂起,它只是在这个查询之后进入休眠状态直到它超时,没有进一步的 PHP 错误,什么都没有。几分钟后,相同的脚本 运行 正常,就好像什么也没发生一样。我什至可以看到 www / non www 有不同结果的情况(一个很好,另一个不好),以及通过 IP 直接访问。

我如何调试正在发生的事情?可能的原因是什么?

顺便说一句,持久连接已关闭。

遗憾的是,信息不足,无法推荐任何有用的东西。

  • 您检查过服务器 I/O 了吗?
  • 如果您mysql检查了用户权限'per domain',您应该检查是否没有反向查找问题(您可以尝试切换到'per IP')
  • 你可以试试MySQLTuner-perl,它可能会给你一些你错过的提示。
  • 您可以尝试使用webyog tools(试用)。它也可能会给你一些线索。