go 反向代理 timewait问题排查

背景

image.png

如图,在压测一个go写的反向代理服务时出现这个报错。
经过搜索发现这个报错是因为端口耗尽而导致的。

原因可能:

  • http.client请求后没读取完rsp.Body就close了。
  • http.Transport 的参数设置有问题。(IdleConnTimeout调高一些,可以设60s,MaxConnsPerHost,MaxIdleConnsPerHost,MaxIdleConns可以调高一些,比如1000),参数具体含义可以看下面的参考链接。

ps

如果是服务端出现大量time wait的话,可以调一下linux系统参数。

sysctl -w net.ipv4.tcp_fin_timeout=30  #修改系統默认的TIMEOUT时间,默认为60s 
sysctl -w net.ipv4.tcp_timestamps=1    #修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0,修改为1,释放TIME_WAIT端口给新连接使用
sysctl -w net.ipv4.tcp_tw_recycle=1     #修改tcp/ip协议配置,快速回收socket资源,默认为0,修改为1:
sysctl -w net.ipv4.tcp_tw_reuse = 1     #允许端口重用

参考

核心原理:https://ethantang.top/posts/go-http-keepalive/
https://studygolang.com/articles/28263
https://blog.csdn.net/skh2015java/article/details/104467217

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容