mysql TIME_WAIT;连接太多问题

时间:2011-02-21 05:59:22

标签: mysql

当我在网站上检查mysql加载时间时。我得到的结果显示连接为TIME_WAIT。即使我在每个页面上关闭连接。有时网站没有加载说太多的连接。什么可以解决这个问题?

提前感谢任何回复或建议

3 个答案:

答案 0 :(得分:4)

如果客户端连接到MySQL-Server,它通常会打开一个本地端口,例如:

 localhost:12345 -> mysqlserver:3306

如果客户端关闭连接,则客户端获取TIME_WAIT。由于TCP路由,数据包可能会在临时端口上迟到。 TIME_WAIT中的连接只丢弃这些数据包。如果没有TIME_WAIT,本地端口可能会重用于另一个连接,并且可能会从以前的连接接收数据包。

在Web上的高频率应用程序中,每个请求打开一个mysql连接,可以预期大量的TIME_WAIT连接。它没有任何问题。

如果您的本地端口范围太小,可能会出现问题,因此您无法再打开传出连接。通常的超时设置为60秒。因此,在低范围内,每秒超过400个请求就已经出现问题。

检查:

要检查TIME_WAIT的数量,可以使用以下命令:

$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

" tw"之后的值,在本例中为33365,显示TIME_WAIT的数量。

<强>解决方案:

一个。 TIME_WAIT调优(基于Linux的操作系统示例):

减少TIME_WAIT的超时时间:

# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout

增加本地端口的端口范围:

# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

设置/proc/sys/net/ipv4/tcp_tw_recycle/proc/sys/net/ipv4/tcp_tw_reuse也可能很有趣。 (但是我们经历了这些设置的奇怪副作用,所以最好避免它们。更多信息在这个answer

湾持久连接

某些编程语言和库支持持久连接。另一种解决方案可能是使用本地安装的代理,例如&#34; ProxySQL&#34;。这减少了新连接和关闭连接的数量。

答案 1 :(得分:2)

正如@Zimbabao在评论中所建议的那样,调试代码以防止任何可能导致关闭Mysql连接的执行停止的错误。

如果无效,请检查my.cnf以查找名为wait_timeout的系统变量。如果不存在,请将其添加到[mysqld]部分并重新启动Mysql服务器。

[mysqld]
wait_timeout = 3600

服务器在关闭非交互式连接之前等待活动的秒数。更多信息可以在http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout

找到

根据您的要求调整图3600(1小时)。

HTH

答案 2 :(得分:2)

如果你在Mysql Server上获得了很多TIME_WAIT连接,那么这意味着Mysql服务器正在关闭连接。在这种情况下最可能的情况是主机或多个主机进入阻止列表。您可以通过运行

来清除它
mysqladmin flush-hosts

获取每个ip运行的连接数列表,

 netstat -nat | awk {'print $5'} | cut -d ":" -f1 | sort | uniq -c | sort -n

您也可以通过访问连接和telnet到端口3306时遇到问题的客户来确认这种情况。它会发送消息,例如,

telnet mysqlserver 3306
Trying 192.168.1.102...
Connected to mysqlserver.
Escape character is '^]'.
sHost 'clienthost.local' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.