0

我有一个问题,我的应用程序必须打开很多与 MySQL 的连接并将数据写入其中,但是一段时间后,我得到越来越多的处于空闲/睡眠状态的连接,并且我的应用程序的速度会降低,直到它完全停止。我怪'wait_timeout'变量太高,

mysql> show variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+
10 rows in set (0.05 sec)

mysql> SHOW FULL PROCESSLIST;
+------+----------+----------------------------------------------------+-------------+---------+------+-------+-----------------------+
| Id   | User     | Host                                               | db          | Command | Time | State | Info                  |
+------+----------+----------------------------------------------------+-------------+---------+------+-------+-----------------------+
| 5425 | root     | ip-10-xxxxxxxx.ec2.internal:60544                 | my_db  | Sleep   | 2344 |       | NULL                  |
| 5426 | root     | ip-10-xxxxxxxx.ec2.internal:60561                 | my_db  | Sleep   | 2136 |       | NULL                  |

并且有很多这样的联系。所以我的主要问题是如何重置连接?我知道我可以,kill PID但我真的很想重置它。

你认为 wait_timeout 会解决问题吗?顺便说一句,一切都在 Amazon RDS 上。

4

2 回答 2

3

我建议这wait_timeout可能是错误的解决方案,因为正如@datasage 暗示的那样,您的应用程序可能无法优雅地处理它。解决方案是让您的应用程序在完成连接后正确关闭连接。

KILL thread_id是从服务器端重置它的正确方法,但这只是实际解决方案的一个补丁,假设这实际上是减慢您的应用程序的原因。

我的 MySQL 服务器上通常有数百个休眠线程,因为应用程序将它们保存在一个池中以供重用。休眠线程正在休眠。他们不会放慢任何速度,除非你有这么多,以至于你达到了max_connectionsRDS 的限制。

于 2013-06-20T01:16:37.763 回答
1

您可以减少wait_timeout,但您需要确信您的应用程序可以处理由服务器而不是客户端关闭的连接。

于 2013-06-18T20:54:05.590 回答