在linux下一切皆文件。
每建立一个tcp都会打开一个文件句柄,所以高并发的web场景下,如果代码写的有问题,没有及时释放资源,很可能会遇到open files过多的问题。
解决这个问题有两条路
修改最大文件句柄数的麻烦点在于要修改的参数比较多。而且这几个参数之间还有耦合关系。
首先有这几个参数要改
nr_open的默认值是1024*1024 (1048576)。对于绝大多数系统都够了。
所以我上面写了这个不一定要改。
如果要改,不要使用 下面这种方式
echo '1100000' > /proc/sys/fs/nr_open
因为重启,这种设置就会失效。建议使用修改/etc/sysctl.conf的方式
# vi /etc/sysctl.conf
fs.nr_open=1100000
修改soft nofile 和 hard nofile的方法
# vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
hard和soft设置成一样的,因为实际生效的值会按二者里最低的来
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命令来修改open_files。因为这样比较方便。
不建议这样做,因为ulimit修改的配置,重启都会失效。
ulimit就用来查看就好了。
ulimit提供对shell及其启动的进程的可用资源(包括文件句柄, 进程数量, core文件大小等)的控制。
这是进程级别的, 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符, 能fork出多少个子进程等… 。
我觉得比较稳妥点的修改方法是干脆都直接用 conf 文件的方式来改。这样比较统一,也比较安全。
# vi /etc/sysctl.conf
fs.nr_open=1100000
fs.file-max=1100000 //多留点buffer
# sysctl -p
# vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
# sysctl -p
另一条路就是我们配置的参数够大了,但是还是出现告警,那就是运行的某个进程有问题,所以要找到他。
显示现在打开的总的文件数
cat /proc/sys/fs/file-nr
应该加上告警,达到80%了需要告警。
查看openfiles最多的进程
lsof -Ki|awk '{print $2}'|sort|uniq -c|sort -n -r|head -6
这个命令可能会执行的很长时间,因为告警的时候文件数已经很多了,统计出来需要时间。
所以一定要在收到告警时就进行处理。千万不用等到句柄数都用完了,那时候命令可能都执行不了了。
2025-02-26 01:41:27
2025-02-26 01:01:15
2025-02-26 01:00:52
2025-02-26 00:53:40
2025-02-26 00:40:57
2025-02-25 01:22:59
网站内容来自网络,如有侵权请联系我们,立即删除!
Copyright © 300学识网 鲁ICP备2022029071号-7
把钱存在银行,并非完全没有风险,有几种风险不得不防