【问题标题】:mysql TIME_WAIT ; too many connections problemmysql TIME_WAIT ;连接太多问题
【发布时间】:2011-02-21 05:59:22
【问题描述】:

当我在现场检查 mysql 加载时间时。我得到的结果显示连接为 TIME_WAIT。即使我在每一页上都关闭了连接。有时该网站不会加载说太多的连接。有什么办法可以解决这个问题?

提前感谢您的任何回复或建议

【问题讨论】:

  • 一定是某个流路中的一些连接泄漏,或者可能是php在调用mysql_close之前抛出错误。如果您使用 mod_php,请考虑持久连接 php.net/manual/en/function.mysql-pconnect.php
  • 它只是简单的选择查询,我正在使用 mysql_connect() 和 mysql_close() 函数。我猜持久连接会产生问题,即使它们关闭,它们有时也会处于睡眠模式

标签: mysql


【解决方案1】:

如果客户端连接到 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”。这会减少新连接和关闭连接的数量。

【讨论】:

  • 如果客户端关闭连接,你会得到一个TIME_WAIT。这个语句中的“你”指的是谁?如果它指的是“mysqlserver”,那么这个说法是不正确的。
【解决方案2】:

如果您在 Mysql 服务器上获得大量 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.

【讨论】:

    【解决方案3】:

    正如@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

    【讨论】:

    • 我曾尝试通过放置条件来检查 它打印回“连接关闭”。 php中是否有任何明确的关闭连接来关闭数据库连接?
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2017-12-27
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多