如果客户端连接到 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)
b.持久连接
一些编程语言和库支持持久连接。另一种解决方案可能是使用本地安装的代理,如“ProxySQL”。这会减少新连接和关闭连接的数量。