go - accept tcp [::]:accept4:打开的文件太多;1s重试
问题描述
我们有一个在golang上运行的API,流量很大,今天突然出现以下错误
http:接受错误:接受tcp [::]:8443:accept4:打开的文件太多;1s重试
我之前检查的几件事是,最大 FD 大小,每个进程的大小为 16k,但由于某种原因,它在没有提供太多细节的情况下达到了最大值。
是否有任何 gotools 或提示来检查我如何找到可能导致此问题的原因?
解决方案
我不确定是否存在 Go 工具来帮助解决此类问题。代码中可能存在一些连接泄漏。
可能发生的常见泄漏是resp.Body.Close()
在消耗http.Response
.
空闲连接可能是另一个可能的原因。根据 HTTP 包文档:
默认情况下,Transport 缓存连接以供将来重用。当访问许多主机时,这可能会留下许多打开的连接。可以使用 Transport 的 CloseIdleConnections 方法以及 MaxIdleConnsPerHost 和 DisableKeepAlives 字段来管理此行为。
如果是这种情况,您可以尝试CloseIdleConnections
在您的Transport
句柄上显式调用,或减少MaxIdleConnsPerHost
值。
推荐阅读
- javascript - Exceljs锁定单元格创建空行
- php - 移动到另一台服务器后,wordpress 出现奇怪的错误
- javascript - Twitter API:警告:无法对未安装的组件执行 React 状态更新
- apache-flink - Flink ValueState“向 RocksDB 添加数据时出错”
- mysql - 如何在单行中对具有多个数据集的数据进行排序?
- java - 如何将大数字转换为 ZonedDateTime java 字段
- java - Spring Boot Security 无法正常工作
- mysql-workbench - 为什么我在 mysql 中调用过程时得到空值?
- bridge - Apache ActiveMQ Artemis 服务器上的核心网桥是否可以在同一源服务器和目标服务器之间配置
- java - 英里转换为公里