我有一个问题,我的应用程序必须打开很多与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会解决问题吗?顺便说一句,一切都在亚马逊RDS上。
答案 0 :(得分:2)
我建议wait_timeout
可能是错误的解决方案,因为正如@datasage暗示的那样,您的应用程序可能无法正常处理它。解决方案是让您的应用程序在完成连接后正确关闭连接。
KILL thread_id
是从服务器端重置它的正确方法,但这只是实际解决方案的补丁,假设这实际上是减慢了应用程序的速度。
我的MySQL服务器上通常有数百个休眠线程,因为应用程序将它们保存在池中以供重用。睡觉的线程正在睡觉它们不会减慢任何速度,除非你有这么多,以至于你达到了RDS的max_connections
限制。
答案 1 :(得分:1)
您可以减少wait_timeout
,但您需要确信您的应用程序可以处理由服务器而不是客户端关闭的连接。