Too many open files问题的原因及解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/wteruiycbqqvwt/article/details/90483224

问题:    Too many open files 

 这个问题经常在Linux上出现,而且常见于高并发访问文件系统、多线程网络连接等场景。之所以出现这个问题,大多数情况是你的程序没有正常关闭一些资源引起的。 

       在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,即通常所说的“一切皆文件”。程序操作这些文件时,系统就需要记录每个当前访问file的name、location、access authority等相关信息,这样一个实体被称为file entry。这些实体被记录在open files table中,Linux系统配置了open files table中能容纳多少file entry。如果超过这个配置值,则Linux就会拒绝其他文件操作的请求,并抛出Too many open files。

解决方案


解决这个问题可以从两方面着手,一是可以修改系统的配置信息;另外一个是从你的程序层面解决。

修改系统配置

根据应用权限,又可以分为系统级和用户级。系统级的修改会对所有用户有效,而用户级只限制每个登录用户的可连接文件数。

系统级

通过命令cat /proc/sys/fs/file-max或者sysctl -a来查看fs.file-max的配置数量。改动可以分为临时改动和永久改动,临时改动直接可用sysctl -w [变量名]=[值]来解决。例如:synctl -w fs.file-max=4096。永久改动就需要修改/etc/sysctl.conf文件,如果文件中没有fs.file-max属性,则添加。设置完成后,使用sysctl -p来加载系统参数,在不指定文件位置的情况下,默认会从/etc/sysctl.conf文件中加载。

用户级

直接通过命令ulimit -n 设置的数量进行配置,例如:ulimit -n 2048。

修改代码

上面那种方法在你的代码没有问题的情况下,可能能解决问题。但是如果是你的程序的原因,则很难有效的解决问题。所以出现这个问题,应该首先检查的你程序,是不是打开的文件或socket没有正常关闭。 
lsof命令可以查看你进程打开的文件,进程打开的端口(TCP、UDP)。由于该命令需要访问核心内存和各种文件,所以需要root用户才能执行。lsof -c 进程名列出指定进程所打开的文件或者lsof -p 进程号列出指定进程号所打开的文件。 

lsof命令是Linux中的一个系统监视命令,可以查看进程打开的文件、端口等,功能强大。

lsof

比如查询PID为25950的进程,使用的命令是

lsof |grep 25950

检查程序问题

如果你对你的程序有一定的了解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析,

1)打开的这些文件是不是都是必要的?
2)定位到打开这些文件的代码
3)是否程序操作了文件写入,但是没有进行正常关闭
4)是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)

如果程序中存在这些问题的话,无论系统句柄数设置的多么大,随着时间的推移,也一定会占用完。

命令一

出现这个错误原因是打开文件数(Linux一切皆文件,所以打开文件数包含文件和Socket连接数)超过Linux设置的最大值

使用lsof -p  pid | wc -l  查看Tomcat进程打开文件数5622   pid ---表示程序的进程号
~ # lsof -p 998 | wc -l 
959
~ # lsof -p 998 | wc -l 
961

命令二

lsof -p 998 > lsof.log,筛选出占用句柄前十的信息

cat lsof.log | awk '{print $8}' | sort | uniq -c | sort -rn | head -n 10

命令三

查看当前系统打开的文件数量

lsof | wc -l
watch "lsof | wc -l"


查看某一进程的打开文件数量

lsof -p pid | wc -l
lsof -p 1234 | wc -l

猜你喜欢

转载自blog.csdn.net/wteruiycbqqvwt/article/details/90483224
今日推荐