PHP curl:Cannot assign requested address
By zmLiu In 技术最近有个需求,需要两台服务器通过PHP curl来通讯。最后压力测试的时候发现当请求量达到一定数量时,curl回返回Cannot assign requested address的错误。
登陆到服务器,使用netstat -an发现有很多TIME_WAIT。
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方,socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime)。TIME_WAIT状态下的socket不能被回收使用。TIME_WAIT累积起来会严重影响服务器性能,甚至耗尽可用的socket。
刚刚好此处的应用会导致这个情况出现。
linux下,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系统默认的 TIMEOUT 时间。
再次测试发现不再出现错误。
No Comment