调试 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(试用)。它也可能会给你一些线索。
从问题本身开始:我的服务器随机出现页面停止加载几分钟(通常达到 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(试用)。它也可能会给你一些线索。