我有一个应用程序服务器(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状态).
我有这个服务器的测试环境,但它从来没有任何问题.它显然没有获得太多的流量,应用程序服务器不断重新启动,所以调试没有多大帮助.我想我可以深入研究每个应用程序并编写一个负载测试,这将测试数据库代码,但这需要花费很多时间/麻烦.
任何想法如何我可以追踪抓住所有这些连接并永不放手的应用程序?
答案似乎是在 [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(请参阅下面的链接)
| 归档时间: |
|
| 查看次数: |
13177 次 |
| 最近记录: |