如何排查Go语言并发环境下文件描述符泄露问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计923个文字,预计阅读时间需要4分钟。
`Go 程序在 Linux 上运行时突然报错 `。请提供具体的错误信息,以便我能够提供更准确的帮助。
常见错误场景:在 HTTP handler、goroutine 或循环里反复调用 os.Open 或 os.Create,但只在成功路径里 Close,panic 或 early return 时直接漏掉。
- 用
defer f.Close()是最稳妥的,但注意:如果f是 nil(比如os.Open返回 error 时f == nil),直接 defer 会 panic - 正确写法是先判错再 defer:
f, err := os.Open("x.txt") if err != nil { return err } defer f.Close() // 此时 f 非 nil
- 并发下更危险:100 个 goroutine 同时打开文件又不关,几秒就打满默认 1024 限制
如何快速定位哪段代码在泄漏 fd
别猜,直接看进程当前打开的 fd 数量和来源。
本文共计923个文字,预计阅读时间需要4分钟。
`Go 程序在 Linux 上运行时突然报错 `。请提供具体的错误信息,以便我能够提供更准确的帮助。
常见错误场景:在 HTTP handler、goroutine 或循环里反复调用 os.Open 或 os.Create,但只在成功路径里 Close,panic 或 early return 时直接漏掉。
- 用
defer f.Close()是最稳妥的,但注意:如果f是 nil(比如os.Open返回 error 时f == nil),直接 defer 会 panic - 正确写法是先判错再 defer:
f, err := os.Open("x.txt") if err != nil { return err } defer f.Close() // 此时 f 非 nil
- 并发下更危险:100 个 goroutine 同时打开文件又不关,几秒就打满默认 1024 限制
如何快速定位哪段代码在泄漏 fd
别猜,直接看进程当前打开的 fd 数量和来源。

