GitHub Actions Ubuntu环境运行go test出现too many open files错误
问题根因
你遇到的too many open files报错是Linux系统单进程文件描述符(FD)上限限制触发的,和两个特性相关:
- Linux默认的单进程最大FD上限通常为1024,远低于Windows系统的默认上限,因此Windows环境运行不会触发该问题
- Go测试默认会并行执行同包内的测试用例,如果你的测试用例存在打开文件、建立网络连接、初始化数据库连接等需要占用FD的操作,并行执行时累计占用的FD会随着用例数量上涨,超过上限就会抛出错误,注释一半用例后总占用FD低于阈值自然恢复正常
解决方法
前置验证步骤
先确认是FD上限导致的问题:
- 本地Ubuntu终端执行
ulimit -n查看当前上限,默认输出一般为1024 - 执行
ulimit -n 65535临时调高当前shell的FD上限后重新跑测试,如果不再报错即可确认根因 - GitHub Actions环境可在测试执行步骤前添加
sudo ulimit -n 65535临时调高上限验证
永久修复方案
优先采用代码侧优化,不需要修改系统配置:
- 修复测试资源泄漏:检查所有测试用例中的文件、网络连接、数据库连接等资源,确保打开后通过
defer语句调用Close()方法主动释放,避免FD长期被无用资源占用 - 复用公共测试资源:将可全局复用的资源(如测试配置文件、公共数据库连接池)提取到
TestMain函数中统一初始化,所有测试用例共用一份资源,全部测试执行完成后再统一释放,避免每个用例重复初始化占用额外FD - 调整测试并行度:执行测试时添加
-parallel N参数限制最大并行测试数,降低并发占用的FD总量,例如go test -parallel 8 ./src/interface/service/user,也可添加-p 1参数强制串行执行测试
如果需要从系统层面彻底解决:
- 本地Ubuntu永久调高FD上限:编辑
/etc/security/limits.conf文件,添加如下两行配置后重启系统生效:* soft nofile 65535 * hard nofile 65535 - GitHub Actions环境直接在测试执行的步骤前添加
sudo ulimit -n 65535即可,不需要永久修改环境配置
内容的提问来源于stack exchange,提问作者Heikkisorsa
相关产品推荐
相关产品推荐

