【发布时间】:2014-08-02 00:42:45
【问题描述】:
我有一个加载 ajax 的脚本,它为每个访问者运行 2 个 mysql 语句(每秒约 100 个)。这是一个简单的SELECT 和UPDATE 语句。
对于我的后端,我使用的是 AWS RDS。
我注意到我的网站今天出现故障,我看到日志中充满了以下内容...
PHP-FPM-5.5 错误日志:
[11-Jun-2014 17:18:47] WARNING: [pool www] child 12203, script '/var/www/track.php' (request: "GET /track.php") executing too slow (5.282239 sec), logging
慢日志
script_filename = /var/www/track.php. [0x00007fcf11fda8f8] execute() /var/www/html/track.php:53
在 RDS 中,我的图表如下所示:
您可以看到数据库连接变得非常高。
此时我有点困惑如何防止这种情况发生。
我只能假设“备份”了一些东西,也许数据库服务器只花了几分之一秒的时间来响应?然后 PHP 基本上过载了,因为请求来得太快(太忙“等待”),这反过来又开始关闭我的服务器。
我的 MySQL 语句使用的是PHP-PDO。我尝试将PDO::ATTR_TIMEOUT => 1 添加到我的new PDO 对象中,但我不知道这是否会解决它(或者即使它是否有效......)。
我的目标是不让我的服务器因为数据库服务器缓慢或无响应而被关闭。我需要 PHP 足够聪明,不会因为 MySQL 响应不够快而等待很长时间或超载。
不过,这一切纯属猜想,也许它根本就不是 RDS,并且不知何故 PHP 得到了备份?我不太确定...
谢谢!
【问题讨论】:
-
您必须检查脚本是否存在问题。还要检查您在此脚本中使用的表是否存在字段索引。同时调整mysql查询缓存,并尝试使用memcache来最小化对数据库的请求
-
这可能是一个愚蠢的问题,但是,您是否正在关闭执行查询的函数中的连接?
-
同样使用php的mysql长连接方式使用mysql连接池避免每次都创建连接
-
这看起来像是一种恶性循环过载场景,其中数据库服务器瞬间过载,响应速度变慢。结果,php 下的 Web 服务器开始启动新的实例/线程来处理传入的请求,而不是重用现有的池。因此,数据库服务器获得了一系列新连接,并且速度更慢。 apache/httpd 中有配置变量(我也确信在 nginx 中),以防止活动实例/线程池变得太大。你应该尝试调整它。
-
+ 查看表的引擎是 myisam 还是 innodb,因为 myisam 引擎会在您每次执行 UPDATE 查询时锁定表,但 innodb 只锁定您正在执行 UPDATE 的行。也许你最好尝试使用rabbitmq 使更新过程同步以避免锁定。