问题:程序在运行过程中报错panic
报错:
知识点:
too many open files(打开的文件过多)是linux系统种常见的错误,files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄,引起的原因是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数
解决:
第一反应是哪里文件句柄读取没有释放,排查代码发现每个打开的配置文件在读完之后都会defer file.Close()关闭
- 查看系统的配置 ulimit -a | grep open
- 查看程序服务的打开文件限制,cat /proc/40636/limits,发现服务的限制并没有继承系统设置的,还是系统默认的1024限制。(中间的40636是程序的进程号)
- 查看程序服务打开文件数(连接数)情况,lsof -p 40636 | wc -l (40636是程序的进程号)
- 程序服务打开了哪些链接 lsof -p 40636 > openfiles.log (40636是程序的进程号)
- 后发现我的程序是supervisorctl管理的,supervisorctl的默认minfds配置是1024,也就是打开文件限制是1024,修改后重启supervisorctl supervisorctl reload 得以解决
摘自:https://www.jianshu.com/p/e3b2a7a8d8aa?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com