php - 调试休眠的 MySQL 连接

标签 php mysql linux performance zend-framework

我想我有一些应用程序问题正在减慢我们整个应用程序的速度并且可能会导致损坏和其他问题。
应用程序问题是由许多正在休眠的 mysql 连接引起的。

SHOW PROCESSLIST; 输出:

| 356058234 | Y  | X:39119 | D | Sleep   |  1442 |       | NULL             |
| 356058441 | Y  | X:39126 | D | Sleep   |  1442 |       | NULL             |
| 356059383 | Y  | X:46615 | D | Sleep   |  2049 |       | NULL             |
| 356059389 | Y  | X:46617 | D | Sleep   |  2052 |       | NULL             |
| 356065991 | Y  | X:39267 | D | Sleep   |  1442 |       | NULL             |
-------------  
452 rows in set (0.00 sec)

还有mysqlreport

__ Connections _________________________________________________________
Max used         8001 of 8000      %Max: 100.01
Total         356.07M    58.6/s

这表明我真的没有连接了。即使是 8000 的限制。这里必须有一些东西。但是调试这样的东西会很麻烦。

无论如何,我用 netstat 查看了进程 ID,例如像这样 netstat -ntp | grep :39267 输出:

tcp        0      0 IP_1:3306      IP_2:38727    VERBUNDEN   791/mysqld

所以我更进一步查找 791,它输出了一个长字符串(几百行),看起来像这里的那些:

tcp        0      0 IP_1:3306      IP_2:34109    VERBUNDEN   791/mysqld      
tcp        0      0 IP_1:3306      IP_3:32864    VERBUNDEN   791/mysqld      
tcp        0      0 IP_1:3306      IP_3:37231    VERBUNDEN   791/mysqld      
tcp        0      0 IP_1:3306      IP_2:38727    VERBUNDEN   791/mysqld      
tcp        0      0 IP_1:3306      IP_2:36645    VERBUNDEN   791/mysqld

但这告诉我什么?我应该收集哪些更多信息才能找到实际导致连接过多问题的线索?

有关应用程序的更多信息:
我们在几台服务器上运行代码——在我们的数据库中更新、插入和删除相当大的代码,这些服务器通过 fork 框架 Gearman 获取这些数据。我们正在运行一个 MySQL INNODB 数据库,它被我们的 PHP 5.4Zend Framework 驱动的应用程序使用。操作系统是 Linux(Debian)

最佳答案

事实上大多数(所有?)线程都在 state of Sleep 中让我觉得你的应用程序有一个开放的数据库连接,但在数据库请求之间。

您可以使用 Cacti 确认这一点与 Percona Monitoring Plugins监控Threads_running的趋势与 Threads_connected .前者通常比后者低很多,但如果它方式平均较低,那么您基本上有空闲的数据库连接,不必要地占用资源。

您可以做的几件事:

  • 延迟连接到数据库。默认情况下,Zend Framework 的数据库适配器(我最后检查的)直到第一次查询才实际连接。您可以覆盖它并强制它提前连接,但您应该尽量避免这种情况。

  • 尽早断开与数据库的连接。在 PHP 中,通常只保留资源,因为它们会在请求结束时自动清理。但这意味着您的应用程序会在不需要时保留与数据库服务器的连接一段时间,而其他应用程序请求可能正在等待它。您应该编写应用程序的代码,以便在它们获取所需的最后数据后立即断开与数据库的连接。

  • 最小化连接时间。如果您可以连接到数据库,快速获取给定页面请求所需的所有数据,然后迅速断开连接,您就可以释放服务器上的连接资源.这可能意味着重构您的 PHP 代码。无论您需要做什么来分析数据或格式化输出,都可以在关闭数据库连接后完成。

  • 不要进行不必要的连接。如果您的应用可以从 memcached 获取所需的数据或 APC或类似的缓存,那么您的某些页面请求可能根本不需要接触数据库。

  • 优化查询。另一种可能性是某些查询长时间运行,并使打开的线程处于非 sleep 状态。换句话说,实际执行查询。但是,如果查询的速率始终快于它们可以完成的平均速度,那么您往往会排起长长的连接队列。让您的查询运行得更快。

    这样做的方法太多了,无法在这里一一列举,但您可以从这里开始学习:

关于php - 调试休眠的 MySQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19190466/

相关文章:

php - yii2:在多个条件下自动填充

php - Mysql搜索 "I"不区分大小写

linux - 撤消 chown 和 chmod

linux - 如何在没有密码的情况下以另一个用户身份运行脚本?

python - 如何在 python 中设置代理值和运行 linux 命令

php - 替换字符串 PHP REGEX 中的模式

php - 在记录错误时在后台执行 PHP 脚本

php - 函数分配一个不为空的参数

PHP XMLWriter,如何插入换行符?

mysql - 如何将 mysql 表映射到 Grails 域类?