Sometimes people don't need advice, they just need someone to listen and care.
Toggle navigation
Home
Archives
Tags
About
Golang 踩坑记之 Http Client 连接未释放
2019-08-26 07:59:34
1167
0
0
william
最近踩了 Golang Http Client 的一个坑,查了许久,终于找到原因,特此记录,避免别人踩坑。我们有两个go程序服务A和B,其中A服务会调用B服务的http接口。然而程序运行一段时间后会发现A服务调用B服务无响应,B服务无法响应任何请求。查看B服务日志,会报如下错误: ```bash accept4: too many open files; retrying in 1s ``` 此时怀疑是B的HTTP链接数过多导致,但是B的QPS正常不会超过10,怎么会出现这种情况呢? 于是怀疑 A->B 的链接未断开,查看B所在机器的监控数据显示,B的链接数超过了1K(B上并未运行其他服务)。 登录B机器,查看链接情况: ```bash netstat -an |grep 9999 ``` 结果如下:  证明猜想是正确的,那么是什么原因导致的链接不释放呢? 然后把B和A通信的代码都看了一下, 发现 A 中的一端代码的端倪: ```golang resp, err := c.HttpClient.Do(req) if err != nil { klog.Errorf("DoHttpRequest %s:%s error.%v", url, method, err) return nil, code, err } ``` 由于 A 调用完 B,未调用 ```golang resp.Body.Close() ``` 来主动关闭与服务端的链接,导致 B 的链接永远得不到释放。最终的结果就是连接数过多,无法响应其他请求。 最终在 A 中国加入了 `resp.Body.Close()` 这段代码,重启 B 服务后一切正常。
Pre:
Kubernetes 踩坑记之 集群node无法访问service
Next:
Kubernetes网络插件 Flannel + LVS FULLNAT 性能测试
0
likes
1167
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
Table of content