too many open files / 打开的文件过多
描述
- 这个问题是出现在一个线上的项目的问题,项目是tomcat中运行war项目,出现此报错时,线上项目表现出来的就是服务器IP可以ping通,但是无法访问网站(目前还无法确认是打开的文件过多导致的tomcat无法访问)。
- 一般linux的默认单个进程最多同时打开的文件数(文件句柄限制)是1024,如果超过这个数量,就会报错:‘too many open files’ 或者’打开的文件过多’。
java项目中出现此报错的示例:
- java.io.IOException: 打开的文件过多
- java.net.SocketException: 打开的文件过多 (Socket creation failed)
- Error reading file /proc/stat. java.nio.file.FileSystemException: /proc/stat: 打开的文件过多
处理
- 先要确定自己的程序是否有打开资源没有释放的情况,这个需要排查代码。
- 查看对应的程序目前打开的文件列表:
- ps -ef | grep java(找到对应程序的PID,此处找的是tomcat)
- lsof -p PID(利用lsof工具查看打开的文件列表就可以观察到对应的进程打开的文件列表了)
- lsof -p PID | wc -l(统计打开的文件数据,如果此值超过linux设定的单个进程最多同时打开的文件数,则就会报错)
- 查看和设置系统的单个进程最多同时打开的文件数
- ulimit -a(查看系统的单个进程最多同时打开的文件数,看open files行)
- ulimit -n 102400(临时修改,只在当前连接窗口(终端)有效,新的窗口还是原来的设置的值的)
- 永久修改方法
vi /etc/security/limits.conf,并在最后加上两行:
* soft nofile 10240
* hard nofile 10240
然后打开新的窗口(终端)就生效了,注意旧的窗口(终端)是没生效的。
模拟此问题的demo
http://me.heawill.top/upload/2022/09/test_too_many_files.zip
服务端最大tcp连接数与最大文件描述符(单进程最多同时打开文件)
linux系统哪些因素影响tcp连接数
https://www.51sjk.com/b19b336860/
linux 的 TCP 连接数量最大不能超过 65535 个,那服务器是如何应对百万千万的并发的?
https://www.zhihu.com/question/535823141
文件描述符(通俗易懂)
https://blog.csdn.net/weixin_47156401/article/details/125678720
彻底弄懂 Linux 下的文件描述符(fd)
https://blog.csdn.net/yushuaigee/article/details/107883964?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107883964-blog-125678720.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107883964-blog-125678720.pc_relevant_default&utm_relevant_index=1
参考
https://www.pudn.com/news/623d72d53c132a36a8101869.html
https://blog.csdn.net/zgaoq/article/details/81911860
https://zhuanlan.zhihu.com/p/397639911