当我检查网站上的mysql加载时间时,结果显示连接为TIME_WAIT。即使我在每个页面上关闭了连接。有时候网站无法加载,显示连接过多。这个问题的解决方案是什么?
非常感谢您提供任何回复或建议。
当我检查网站上的mysql加载时间时,结果显示连接为TIME_WAIT。即使我在每个页面上关闭了连接。有时候网站无法加载,显示连接过多。这个问题的解决方案是什么?
非常感谢您提供任何回复或建议。
localhost:12345 -> mysqlserver:3306
$ 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的数量。
解决方案:
a. 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
也可能很有趣。(但是我们尝试这些设置时经历了奇怪的副作用,最好避免使用。更多信息可以在此答案中找到)
b. 持久连接
一些编程语言和库支持持久连接。另一个解决方案可能是使用本地安装的代理,例如“ProxySQL”。这会减少新建和关闭连接的数量。
如果您在Mysql服务器上得到了很多TIME_WAIT连接,那么这意味着Mysql服务器正在关闭连接。在这种情况下最有可能的情况是某个主机或几个主机被列入了阻止列表。您可以通过运行以下命令来清除此问题:
mysqladmin flush-hosts
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.
正如@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小时)。
希望对您有所帮助。