我想我有一些应用程序问题正在减慢我们整个应用程序的速度并且可能会导致损坏和其他问题。
应用程序问题是由许多正在休眠的 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.4 和 Zend 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/