从问题本身开始:我的服务器随机出现页面停止加载几分钟(通常达到300秒超时)或加载速度非常慢的问题。它不一定与流量的增加相关,但在流量增加时更可能发生。有时我只是在胡闹,事情会变慢几分钟,然后一切都恢复正常,相同的文件被访问。系统本身非常简单:除了基本数据插入和读取之外,它什么也不做,没有一个表的行数超过几千行。谷歌分析显示,在高峰时间,并发访问的峰值大约为每小时300次。
这是我们公司最近来的一个老项目。php代码非常古老,我花了很多时间重构查询,以使用集中式pdo连接,而不是每次使用mysql\u connect。但是,在旧服务器上,这些问题并没有发生,只是在新服务器上。
现在,抓住机会。我们的托管服务说这实际上是他们服务器上的一个问题,我也找不到代码原因。几个月后,我们决定在另一台主机上更换一台新的专用服务器……问题仍然存在。所以一定是代码出了什么问题,在什么地方,或者是我需要更改的配置。
问题是,没有特定的文件或脚本导致它。因为现在我有whm控制,我可以看到没有内存或cpu使用的问题。慢速日志查询为空,设置为20秒以记录。所发生的是,一切只是运行非常缓慢,然后很容易恢复正常。
我在日志中看到的错误是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总是运行得很快,在一个有29行的表上,返回1个结果。这样做没有任何意义,但它总是最后显示的查询命令,甚至发现两种情况下,线程从未退出。
所以现在我束手无策。问题不断发生,无休无止,无缘无故地来来去去去,我也找不出原因。slow\u querys日志是空的,所以它不像有一个查询挂起,它只是在这个查询之后进入休眠状态,直到超时,没有进一步的php错误,什么都没有。几分钟后,同样的脚本运行正常,就像什么都没发生一样。我甚至可以看到www/non-www有不同的结果(一个是好的,另一个不是),以及通过ip直接访问的情况。
如何调试发生了什么?可能的原因是什么?
顺便说一下,永久连接已关闭。
1条答案
按热度按时间azpvetkf1#
不幸的是,它只是没有足够的信息来推荐任何有用的东西。
你检查服务器i/o了吗?
如果mysql用户权限检查为“每域”(您可以尝试切换到“每ip”),则应该检查是否没有反向查找问题
您可以尝试mysqltuner perl,它可能会给您一些您错过的提示。
您可以尝试使用webyog工具(试用版)。它也可能给你一些线索。