首页 > 解决方案 > accept tcp [::]:accept4:打开的文件太多;1s重试

问题描述

我们有一个在golang上运行的API,流量很大,今天突然出现以下错误

http:接受错误:接受tcp [::]:8443:accept4:打开的文件太多;1s重试

我之前检查的几件事是,最大 FD 大小,每个进程的大小为 16k,但由于某种原因,它在没有提供太多细节的情况下达到了最大值。

是否有任何 gotools 或提示来检查我如何找到可能导致此问题的原因?

标签: go

解决方案


我不确定是否存在 Go 工具来帮助解决此类问题。代码中可能存在一些连接泄漏。

可能发生的常见泄漏是resp.Body.Close()在消耗http.Response.

空闲连接可能是另一个可能的原因。根据 HTTP 包文档:

默认情况下,Transport 缓存连接以供将来重用。当访问许多主机时,这可能会留下许多打开的连接。可以使用 Transport 的 CloseIdleConnections 方法以及 MaxIdleConnsPerHost 和 DisableKeepAlives 字段来管理此行为。

如果是这种情况,您可以尝试CloseIdleConnections在您的Transport句柄上显式调用,或减少MaxIdleConnsPerHost值。


推荐阅读