关于端口reuse的问题

最近在调试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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭