我在Go中运行一个程序,它在读取文件后不断发送数据/proc/stat.使用ioutil.ReadFile("/proc/stat")
After运行约14小时后,我得到了错误:too many files open /proc/stat
点击此处获取代码片段.
我怀疑f.CloseGo有时会忽略defer ,或者它正在跳过它.
代码片段(如果play.golang.org比stackoverflow.com更早死亡):
package main
import ("fmt";"io/ioutil")
func main() {
for {
fmt.Println("Hello, playground")
fData,err := ioutil.ReadFile("/proc/stat")
if err != nil {
fmt.Println("Err is ",err)
}
fmt.Println("FileData",string(fData))
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
原因可能是你的程序中的某个地方:
你忘了关闭文件了,或者
你依靠垃圾收集器来自动关闭对象终结的文件,但是Go的保守垃圾收集器没有这样做.在这种情况下,您应该检查程序的内存消耗(在程序运行时是否稳定增加).
在任何一种情况下,尝试检查内容,/proc/PID/fd以查看程序运行时打开文件的数量是否在增加.