解决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脚本来计算
[root@ccm ~]# grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
806123
[root@ccm ~]# cat /proc/sys/fs/file-max
798336
/proc/sys/fs/file-nr
这个文件有3个值,分别表示已分配文件句柄的数目、分配了但没有使用的句柄数、文件句柄的最大数目
[root@ccm ~]# cat /proc/sys/fs/file-nr
864 0 798336
修改file-max方法:
在/etc/sysctl.conf中增加
fs.file-max = 798336
四、ulimit相关内容
ulimit 用于限制 shell 启动进程所占用的资源。
ulimit支持以下各种类型的限制:
所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。
使用ulimit命令可以查看
[root@ccm ~]# ulimit -n
655350
[root@Ali-BJ-OL-priv-java-0-92 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31401
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 655350
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 31401
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@ccm ~]#
该如何修改配置呢?
CentOS5用户修改这个文件/etc/security/limits.conf 就可以了。
[root@ccm~]# grep '^*' /etc/security/limits.conf
* soft nproc 102400
* hard nproc 102400
* soft nofile 102400
* 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
[root@ccm ~]# cat /proc/sys/fs/nr_open
1048576
[root@ccm ~]# sysctl -a |grep nr_open
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配置示例
DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000
注意:修改了system.conf后,需要重启系统才会生效。
针对单个Service,也可以设置,以nginx为例。
编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:
[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000
然后运行如下命令,才能生效。
sudo systemctl daemon-reload
sudo systemctl restart nginx.service
另外,CentOS7还多了一个/etc/security/limits.d/20-nproc.conf 里面有可能有配置,要仔细查看。
六、监控
文件打开数这个值如此重要,怎能不监控起来?
在Zabbix客户端添加如下设置,然后只做新的模板就可以使用了,如下图。
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