MySQLERROR: dial tcp ip:3306:connectex:Only one usage of each socket address is normally permititted

一、问题重现

  • 环境: win10或win8
  • 错误信息

    MySQL ERROR: dial tcp X.X.X.X:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted.

  • 场景: 高并发,通过JMeter测试工具模拟.

二、原因分析

首先,该错误不是MySQL的锅,而是win10系统的问题。

一个连接由5个元素确定,即{ Protocol, Local IP, Local Port, Remote IP, Remote Port} ,当一个连接被关闭时,默认情况下会进入TIME_WAIT状态240s。

这里,我们使用的Protocol是TCP,Local IP,Remote IP和Remote Port都是固定的,那么问题肯定出在Local Port上。

当一个应用被部署在windows服务器且每次请求都要进行数据库事务操作时,在高并发情况下,会导致win10下本地端口占用过多,导致本地可用端口急速耗尽就会出现该报错信息。

三、解决方法

3.1 部署到Linux服务器

这个错误目前在Linux环境下还未发现,部署应用到Linux服务器,妥妥的。如果非要在本地做压测,可以尝试以下方法。

3.2 修改win10动态端口的范围

  1. 打开注册表
    win10下快捷键 win + R,输入regedit
  2. 修改HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. 创建DWORD类型键值对

    TcpTimedWaitDelay
    REG_DWORD: 0000001e (hex)

    MaxUserPort
    REG_DWORD: 0000fffe (hex)

    TcpNumConnections
    REG_DWORD: 00fffffe (hex)

    TcpMaxDataRetransmissions
    REG_DWORD: 00000005 (hex)

命令行修改:

netsh int ipv4 set dynamicport tcp start=2000 num=63000
netsh int ipv4 set dynamicport udp start=2000 num=63000
netsh int ipv6 set dynamicport tcp start=2000 num=63000
netsh int ipv6 set dynamicport udp start=2000 num=63000

查看可用端口:

netsh int ipv4 show dynamicportrange tcp

可用端口

3.3 修改win10连接TIME_WAIT时间

  1. 打开注册表
    win10下快捷键 win + R,输入regedit
  2. 修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. 修改键值对MaxUserPort

    MaxUserPort
    REG_DWORD: 0000fffe (hex)

  4. 新增键值对TcpTimeWaitDelay为5s

    TcpTimeWaitDelay
    REG_DWORD: 0000005

参考文献

  1. Stack Overflow Question: MySQL/PHP Error
  2. windows下如何可用连接调节及time_wait调优


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部