问题以及可能的原因
问题
随着系统业务负载 升高服务器不堪重负
数据库峰值每秒处理 1.5 万 个请求包含查询和插入
并产生3-4万个链接 其中包含 2.8万个 由3380(数据库链接) 产生的 TIME_WAIT
然后那玩意 就还挂了 报这个错误 Cannot assign requested address
小知识
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.
可能的原因
1.重复实例化 MYSQL 链接过多
2.可能有位大佬没有使用 mysql.colse()
优化以及建议
数据库端
1.将所有数据驱动改为PDO
2.使用长链接
3.保持主进程一进程 以及下面的子进程 共用一个长链接
4.实例化两台主机数据库链接 用来做热切换
5.WEB 端维持单一请求 一个长链接
优化对比
[root@localhost 31]# netstat -anlp | grep :3306 | grep TIME_WAIT -wc 33
转载请注明:(●--●) Hello.My Weicot » MYSQL 大并发情况 出现 Cannot assign requested address 问题 以及基础的TCP/IP TIME_WAIT状态原理解析