mysql TIME_WAIT; 太多连接问题

Par*_*rag 4 mysql

当我在现场检查mysql的加载时间时。我得到的结果显示连接为TIME_WAIT。即使我关闭每个页面上的连接。有时,该站点未加载,说明连接过多。有什么办法可以解决这个问题?

在此先感谢您的任何答复或建议

Tre*_*her 5

如果客户端连接到MySQL服务器,则通常会打开一个本地端口,例如:

 localhost:12345 -> mysqlserver:3306
Run Code Online (Sandbox Code Playgroud)

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

在Web上每个请求打开mysql-connection的高频率应用程序上,期望有大量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
Run Code Online (Sandbox Code Playgroud)

“ 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
Run Code Online (Sandbox Code Playgroud)

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

# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Run Code Online (Sandbox Code Playgroud)

设置/proc/sys/net/ipv4/tcp_tw_recycle/proc/sys/net/ipv4/tcp_tw_reuse也可能很有趣。(但是我们在这些设置下遇到了奇怪的副作用,因此最好避免使用它们。此答案中的更多信息)

b。持久连接

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


Ana*_*hah 3

正如 @Zimbabao 在评论中建议的那样,调试代码中是否存在任何可能停止执行关闭 Mysql 连接的潜在错误。

如果没有任何效果,请检查 my.cnf 中是否有名为 的系统变量wait_timeout。如果它不存在,请将其添加到该部分[mysqld]并重新启动您的 Mysql 服务器。

[mysqld]
wait_timeout = 3600
Run Code Online (Sandbox Code Playgroud)

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

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

华泰