【问题标题】:PHP + MySQL 'DB connections' slowing server downPHP + MySQL“数据库连接”减慢服务器速度
【发布时间】: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 使更新过程同步以避免锁定。

标签: mysql nginx pdo php


【解决方案1】:

我在最近的项目中使用 MySQL,但不能否认 MySQL 可能存在一些性能问题。

您可以尝试向您的数据库发送一个选择请求,如果它返回 true,您就可以更新该行。在这种情况下,您需要每个用户和每个页面加载两个连接。因此,我建议您使用只需要一个脚本连接的存储过程。在您的场景中使用存储过程可以将连接时间减半。

我的第二个解决方案是根据您所需的设置配置您的 my.conf。这是一个在线工具,可帮助您进行合适的配置https://tools.percona.com/wizard。

MySQL 最多可以使用 40% 的系统资源进行日志记录,因此请尝试限制一些日志,例如访问日志、错误日志以及您可能正在使用的任何其他日志。

【讨论】:

  • 注意:在链接的网站上,您需要在向导结束时注册以获取生成的配置。如果您对此不满意,则不必浪费时间。
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 2013-12-30
  • 2012-11-11
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多