追踪MySQL连接泄漏

jck*_*111 6 mysql linux

我有一个应用程序服务器(linux盒子上的jetty 6)托管15个人应用程序(个人战争).每隔3或4天,我会从nagios收到有关打开的TCP连接数的警报.经过检查,我发现绝大多数这些连接都是针对MySQL服务器的.

netstat -ntu | grep TIME_WAIT
Run Code Online (Sandbox Code Playgroud)

在应用程序服务器上显示MySQL服务器上的10,000多个连接(请注意状态为TIME_WAIT).如果我重新启动jetty,连接几乎为零.

显示状态中的一些有趣值:

mysql> show status;
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| Aborted_clients          | 244       |
| Aborted_connects         | 695853860 |
| Connections              | 697203154 |
| Max_used_connections     | 77        |
+--------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

"show processlist"没有显示任何异常(这是我所期望的,因为大多数连接都是空闲的 - 记住上面的TIME_WAIT状态).

我有这个服务器的测试环境,但它从来没有任何问题.它显然没有获得太多的流量,应用程序服务器不断重新启动,所以调试没有多大帮助.我想我可以深入研究每个应用程序并编写一个负载测试,这将测试数据库代码,但这需要花费很多时间/麻烦.

任何想法如何我可以追踪抓住所有这些连接并永不放手的应用程序?

jck*_*111 5

答案似乎是在 [mysqld] 下的 my.cnf 中添加以下条目:

wait_timeout=60
interactive_timeout=60
Run Code Online (Sandbox Code Playgroud)

我在这里找到了它(一直在底部):http://community.livejournal.com/mysql/82879.html

终止失效连接的默认等待时间为 22800 秒。核实:

mysql> show variables like 'wait_%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 60    |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了提及,我还在 /etc/sysctl.conf 中添加了以下内容:

net.ipv4.tcp_fin_timeout = 15
Run Code Online (Sandbox Code Playgroud)

这应该有助于降低操作系统在重用连接资源之前等待的阈值。

编辑2:/etc/init.d/mysql reload不会真正重新加载你的my.cnf(请参阅下面的链接)

  • 我不确定重新加载实际上会重新加载设置而无需完全重新启动。检查其行为和文档。 (2认同)