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动态端口的范围
- 打开注册表
win10下快捷键win + R,输入regedit - 修改
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 创建
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时间
- 打开注册表
win10下快捷键win + R,输入regedit - 修改
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 修改键值对
MaxUserPortMaxUserPort
REG_DWORD: 0000fffe (hex) - 新增键值对
TcpTimeWaitDelay为5sTcpTimeWaitDelay
REG_DWORD: 0000005
参考文献
- Stack Overflow Question: MySQL/PHP Error
- windows下如何可用连接调节及time_wait调优
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
