ls /proc/12345/fd | wc -l
ulimit -n
// 代码
f, err := os.Open(p)
if err != nil { return err }
defer f.Close()

服务跑到晚上开始大量报错,提示打开文件过多,重启后恢复正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,打开的文件或连接没有关闭,句柄数累积超过系统上限,长连接和高并发场景下增长更快。

「Go 句柄泄漏」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:确认进程句柄数;检查 defer close 是否覆盖所有分支;按需调整系统上限。

改完只确认一件事:句柄数稳定在合理范围,服务连续运行不再出现该错误。

作者 9823189