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

你可能感兴趣的:(go 反向代理 timewait问题排查)