首页 Linux 正文
385

解决“Too many open files”

  • yiqingpeng
  • 2020-01-23
  • 0
  •  
查看打开句柄数最多的进程ID。
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more


通过上步的进程ID找到进程名。
ps -ef|grep 进程ID


查看当前登录用户的资源限制数(只是当前用户的)
ulimit -a


文件打开数硬限制查看,超过此限制会报错
ulimit -Hn


文件打开数软限制查看,超过此限制会报警
ulimit -Sn


为当前用户设置新的文件打开限制数:(-n表示文件打开数,-d数据段长度,-m最大内存, -s堆栈,-tCPU时间,-v虚拟内存,-u并发进程数)
ulimit -n <file_num/unlimited> 
但是此设置只是临时设置的(当前登录会话有效),下次重新登录会消失。
要为用户设置永久限制的话,可以:
1.修改配置文件/etc/security/limits.conf
在该文件中添加如下行:
<username> soft nofile xxxxx(具体数值) #软限制
<username> hard nofile xxxxx #硬限制
username可以是星号(*),表示对所有用户都有效。


2.除了上面的方法外,还可以在用户的profile文件中添加指令:
ulimit -n <file_num>
这种方法只对此用户有效。


以上是用户级的限制,还有一个是系统级的限制(所有程序打开的文件数的最大值)。
系统级限制必须大于用户级限制,这样才能保证用户级限制的设置预期。
查看系统级限制数的方法:
cat /etc/sys/fs/file-max
修改系统级限制数的方法:
在文件/etc/sysctl.conf中添加fs.file-max=xxxxx
再运行命令:/sbin/sysctl -p 使配置生效。




查看当前系统有多少文件被打开(正在使用):
cat /proc/sys/fs/file-nr
结果类似于:
2720    0     97868
2720表示当前使用数,97868表示系统设置的最大数。


查看某个正在运行的进程的限制数:
先得到进程ID,
ps aux | grep <process-name>
通过进程ID打开如下文件,
cat /proc/xxxx(进程ID)/limits

正在加载评论...