2013-06-18 65 views
0

我有一個問題,我的應用程序必須打開很多與MySQL的連接並將數據寫入它,但一段時間後,我得到越來越多的處於空閒/睡眠狀態的連接,並且我的應用程序速度降低直到它完全停止。我責怪'wait_timeout'變量太高,有什麼辦法可以重置mysql IDLE /睡眠連接?

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上。

回答

2

我建議wait_timeout可能是錯誤的解決方案,因爲@datasage暗示,您的應用程序可能無法正常處理它。解決方案是讓您的應用程序在完成連接時正確關閉連接。

KILL thread_id是從服務器端重置它的正確方法,但這只是實際解決方案的補丁,假設實際上是減慢應用程序的速度。

我通常在我的MySQL服務器上有數百個睡眠線程,因爲應用程序將它們保存在池中供重用。睡覺的線程正在睡覺。除非你有很多這樣的數據,否則他們不會放慢任何速度,以至於你在RDS上遇到的限制是max_connections

1

您可以減少wait_timeout但您需要確信您的應用程序可以處理由服務器而不是客戶端關閉的連接。

相關問題