在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 (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 1000000hard和soft设置成一样的,因为实际生效的值会按二者里最低的来
fs.file-max: 整个系统上可打开的最大文件数,但不限制 root 用户file-max 这个参数只限制非 root 用户。当发生文件打开过多时,使用普通用户无法使用 ps,kill 等命令,就是这个原因。所以遇到这种情况直接用 root 去 kill 就行了
file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算
grepMemTotal /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=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这个命令可能会执行的很长时间,因为告警的时候文件数已经很多了,统计出来需要时间。
所以一定要在收到告警时就进行处理。千万不用等到句柄数都用完了,那时候命令可能都执行不了了。
友情提醒: 请添加客服微信进行免费领取流量卡!
QQ交流群:226333560 站长微信:qgzmt2
原创文章,作者:sunyaqun,如若转载,请注明出处:https://www.dallk.cn/52575.html