大家好,欢迎来到IT知识分享网。
在linux下一切皆文件。
每建立一个tcp都会打开一个文件句柄,所以高并发的web场景下,如果代码写的有问题,没有及时释放资源,很可能会遇到open files过多的问题。
解决这个问题有两条路
- 最大文件句柄数确实设置的太小,那么就去加大最大文件句柄数
- 程序有问题,需要去找到是哪个进程
修改最大文件句柄数。
修改最大文件句柄数的麻烦点在于要修改的参数比较多。而且这几个参数之间还有耦合关系。
首先有这几个参数要改
- fs.nr_open (不一定需要改)
- nofile(其实 nofile 还分 soft 和 hard)
- fs.file-max
这几个参数的区别
- soft nofile 和 fs.nr_open的作用一样,它两都是限制的单个进程的最大文件数量。区别是 soft nofile 可以按用户来配置,而 fs.nr_open 所有用户只能配一个,在一台 Linux 上只能配一次。。
nr_open的默认值是1024*1024 ()。对于绝大多数系统都够了。
所以我上面写了这个不一定要改。
如果要改,不要使用 下面这种方式
echo '' > /proc/sys/fs/nr_open
因为重启,这种设置就会失效。建议使用修改/etc/sysctl.conf的方式
# vi /etc/sysctl.conf fs.nr_open=
修改soft nofile 和 hard nofile的方法
# vi /etc/security/limits.conf * soft nofile * hard nofile
hard和soft设置成一样的,因为实际生效的值会按二者里最低的来
- fs.file-max: 整个系统上可打开的最大文件数,但不限制 root 用户
file-max 这个参数只限制非 root 用户。当发生文件打开过多时,使用普通用户无法使用 ps,kill 等命令,就是这个原因。所以遇到这种情况直接用 root 去 kill 就行了
file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算
grep MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
另外,注意一点。
修改了fiel-max最好同步修改下inode-max
inode-max 约等于 3或4 倍file-max。
否则可能改好了文件句柄数的问题,后面与会遇到inode不足的问题。
关于ulimit
有人喜欢使用ulimit命令来修改open_files。因为这样比较方便。
不建议这样做,因为ulimit修改的配置,重启都会失效。
ulimit就用来查看就好了。
ulimit提供对shell及其启动的进程的可用资源(包括文件句柄, 进程数量, core文件大小等)的控制。
这是进程级别的, 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符, 能fork出多少个子进程等… 。
总之:
我觉得比较稳妥点的修改方法是干脆都直接用 conf 文件的方式来改。这样比较统一,也比较安全。
# vi /etc/sysctl.conf fs.nr_open= fs.file-max= //多留点buffer # sysctl -p # vi /etc/security/limits.conf * soft nofile * hard nofile # sysctl -p
找到那个进程
另一条路就是我们配置的参数够大了,但是还是出现告警,那就是运行的某个进程有问题,所以要找到他。
显示现在打开的总的文件数
cat /proc/sys/fs/file-nr
应该加上告警,达到80%了需要告警。
查看openfiles最多的进程
lsof -Ki|awk '{print $2}'|sort|uniq -c|sort -n -r|head -6
这个命令可能会执行的很长时间,因为告警的时候文件数已经很多了,统计出来需要时间。
所以一定要在收到告警时就进行处理。千万不用等到句柄数都用完了,那时候命令可能都执行不了了。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/164992.html