最近在调试php程序的时候发现了一个很郁闷的问题
自己写的程序是将大概22w条数据post到指定接口
程序在服务器A运行得好好的,但是一放到服务器B就会出现post失败的现象
22w条大概会失败3w多条,而且是间断并且随机的post失败
我用的是curl库,curl_exec后返回false
后面经人指点才知道原来是端口惹的祸
因为curl库在post请求的时候是在底层创建tcp连接的
每次创建可能都是使用不同的端口,端口在被使用后不会立马被关闭
而是置于 TIME_WAIT状态一定时间(2*msl)以保证数据不会丢失
这一策略可以保证TCP的可靠性,但是如果程序占用过多端口导致端口不够用时,就会报端口被占用的错误信息。
最后解决的方法是编辑/etc/sysctl.conf文件,增加三行:
引用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
说明:
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
再执行以下命令,让修改结果立即生效:
/sbin/sysctl -p