关于Linux 进程 open too many files 的问题

来源:互联网 发布:seo快速排名 编辑:程序博客网 时间:2024/06/07 08:28

有时tomcat 或 weblogic的服务里会报这样的错误,有些是建立socket连接时报出的错误。导致的直接原因是因为服务的进程打开了太多的文件或网络连接,超过了系统定义的值(系统定义的值可以用ulimit -n 来查看)。

调查可能会用到的命令:
ps -ef | grep 服务名 // 用于查找进程号
lsof -n | grep 进程号 | vim - // 查看这个进程都打开了哪些链接,都是什么状态的。

原因:
1. 可能是服务真的打开了超多的文件,不过这个可能会比较小。
2. 打开了太多的socket链接,而且没有关闭(我就遇到过大量废弃的tcp链接状态是CLOSE_WAT),因为系统默认的 net.ipv4.tcp_keepalive_time 是7200秒,也就是2小时才会断开。
3. 可能打开了太多了长链接,而且都在使用

解决方法:
1.在生产环境下, 重启是比较快速能解决的办法,但不能解决根本问题,运行一段时间后还会出现问题。
2. 调整net.ipv4.tcp_keepalive_time的参数 ,可以参照https://wsgzao.github.io/post/sysctl/
3. 调查代码里哪些使用了keepalive的链接,哪些疏忽了,没有及时关闭链接

原创粉丝点击