一、问题重现
- 环境: 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服务器,妥妥的。如果非要在本地做压测,可以尝试以下方法。