最新消息:网站迁移至香港,数据恢复中。

解决too many open files

Linux ipcpu 82浏览

解决too many open files.md

一、概述

too many open files是一个很常见的报错,但要处理起来也没那么简单,下面我们来总结下。

二、相关的配置文件

/proc/sys/fs/file-max 这个文件是系统层面的总文件打开数
ulimit 当前shell以及由它启动的进程的资源限制
systemd 服务的资源限制

三、file-max相关内容

/proc/sys/fs/file-max

当前内核可以打开的最大的文件句柄数,默认值约为内存的10%。
可以使用shell脚本来计算

  1. [[email protected] ~]# grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
  2. 806123
  3. [[email protected] ~]# cat /proc/sys/fs/file-max
  4. 798336

/proc/sys/fs/file-nr

这个文件有3个值,分别表示已分配文件句柄的数目、分配了但没有使用的句柄数、文件句柄的最大数目

  1. [[email protected] ~]# cat /proc/sys/fs/file-nr
  2. 864 0 798336

修改file-max方法:
在/etc/sysctl.conf中增加

  1. fs.file-max = 798336

四、ulimit相关内容

ulimit 用于限制 shell 启动进程所占用的资源。
ulimit支持以下各种类型的限制:
所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
使用ulimit命令可以查看

  1. [[email protected] ~]# ulimit -n
  2. 655350
  3. [[email protected]-BJ-OL-priv-java-0-92 ~]# ulimit -a
  4. core file size (blocks, -c) 0
  5. data seg size (kbytes, -d) unlimited
  6. scheduling priority (-e) 0
  7. file size (blocks, -f) unlimited
  8. pending signals (-i) 31401
  9. max locked memory (kbytes, -l) 64
  10. max memory size (kbytes, -m) unlimited
  11. open files (-n) 655350
  12. pipe size (512 bytes, -p) 8
  13. POSIX message queues (bytes, -q) 819200
  14. real-time priority (-r) 0
  15. stack size (kbytes, -s) 10240
  16. cpu time (seconds, -t) unlimited
  17. max user processes (-u) 31401
  18. virtual memory (kbytes, -v) unlimited
  19. file locks (-x) unlimited
  20. [[email protected] ~]#

该如何修改配置呢?
CentOS5用户修改这个文件/etc/security/limits.conf 就可以了。

  1. [[email protected]~]# grep '^*' /etc/security/limits.conf
  2. * soft nproc 102400
  3. * hard nproc 102400
  4. * soft nofile 102400
  5. * hard nofile 102400

CentOS6和CentOS7需要同时修改/etc/security/limits.d/90-nproc.conf文件,内容一致就可以。

TIPS:实际上/etc/security/limits.d/90-nproc.conf文件优先级更高些。

那么这里面的nproc、nofile都是什么意思呢?

core – limits the core file size (KB)
nofile – max number of open files
nproc – max number of processes
更多的选项可以参考以下链接
https://access.redhat.com/solutions/61334

ulimit最高只能到100W?

较真的朋友发现,ulimit数值并不是无限大的,当设置到100万以上时,发现SSH就登陆不了了。

因为还有个限制文件 /proc/sys/fs/nr_open

  1. [[email protected] ~]# cat /proc/sys/fs/nr_open
  2. 1048576
  3. [[email protected] ~]# sysctl -a |grep nr_open
  4. fs.nr_open = 1048576

若ulimit超出100万,可以先修改此值的大小,写入到sysctl.conf里。

五、centos7带来的新烦恼

在CentOS7中,使用Systemd替代了之前的SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,与上面讲的一样,通过 /etc/security/limits.conf 和 limits.d 来配置即可。
对于systemd service的资源限制,如何配置呢?

全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。 同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/.conf 和 /etc/systemd/user.conf.d/.conf
其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

systemd-system.conf配置示例

  1. DefaultLimitCORE=infinity
  2. DefaultLimitNOFILE=100000
  3. DefaultLimitNPROC=100000

注意:修改了system.conf后,需要重启系统才会生效。

针对单个Service,也可以设置,以nginx为例。
编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:

  1. [Service]
  2. LimitCORE=infinity
  3. LimitNOFILE=100000
  4. LimitNPROC=100000

然后运行如下命令,才能生效。

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart nginx.service

另外,CentOS7还多了一个/etc/security/limits.d/20-nproc.conf 里面有可能有配置,要仔细查看。

六、监控

文件打开数这个值如此重要,怎能不监控起来?
在Zabbix客户端添加如下设置,然后只做新的模板就可以使用了,如下图。

  1. UserParameter=fdcurrent,cat /proc/sys/fs/file-nr | awk '{print $1}'

七、总结

要解决too many open files要查看的配置文件:

/proc/sys/fs/nr_open
/proc/sys/fs/file-max
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf
ulimit命令的直接控制
CentOS7需要查看Systemd配置和/etc/security/limits.d/20-nproc.conf

八、参考资料

https://www.kernel.org/doc/Documentation/sysctl/fs.txt
http://zhangxugg-163-com.iteye.com/blog/1108402
http://www.opstool.com/article/166
http://blog.yufeng.info/archives/2568
http://yangrong083.lofter.com/post/1cc5e2f7_5265618
http://www.chengweiyang.cn/2015/11/14/how-to-enlarge-linux-open-files-upper-cell/
http://qujunorz.blog.51cto.com/6378776/1703295
https://my.oschina.net/anglix/blog/525305?p=%7B%7Bpage%7D%7D#OSC_h2_1

转载请注明:IPCPU--网络之路 » 解决too many open files