程序网络访问出错:lacked sufficient buffer space

之前在用Go语言做一个批量程序时出现在下错误

dial tcp 127.0.0.1:80: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

环境:程序操作是一直模拟访问网站,不断Get一些网页或Post一些数据,运行在服务器上,刚开始正常,一会数据过大之后就出现如上错误了。

网上查找资料后了解到,这并不是Go特有的,这是由于程序不断打开关闭连接,有些操作完成后没有正常手动关闭,导致大量连接处于CLOSE_WAIT状态,直到计算机再也找不到可供使用的端口,程序就出错了。

解决:解决的最优方法当然是优化程序代码,把所有的错误都处理掉,连接正常关闭。实在不行就是通过修改服务器配置,来加大可用端口数量或减少CLOSE_WAIT等待时间(CLOSE_WAIT状态默认会保持120秒):

打开注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

建一个DWORD项,名字为MaxUserPort,值为十进制65534(十六进制0000FFFE),表示最大可用端口为65534

建一个DWORD项,名字为TCPTimedWaitDelay,值为十进制30(十六进制0000001e),表示TCP连接等待时间30秒


我重启之后问题解决了,不过这方法冶标不冶本,建议有条件还是优化您的代码吧。

========== 不羁的分割线 =========

优化方法可以参考:http://my.oschina.net/waknow/blog/293852

就是打开的http连接,http.Response需要Close掉:

resp.Body.Close()



你可能感兴趣的:(tcp,golang,close_wait)