内核Bug解决经验小结:
错误提示:
VFS: file-max limit 8192 reached
重现Bug:
开XXX服务器:监视文件描述符数,发现不断在涨
watch -n 1 cat /proc/sys/fs/file-nr
LK:
get_empty_filp()==>
if(get_nr_files() > old_max)
printk(VFS: file-max limit xxxx reached)
goto fail;
此类Bug就是创建打开文件过程因达文件描述符数上限而拒绝导致出错
===》思路一:加锁解锁有问题,fput没成功
以()对照,发现没问题,文件成功打开又关闭
==>思路二:文件在创建时,->f_count多计数了一次
后查明在代码里,get_file(file{}->f_count)多执行了一次
所以随着系统运行,经此内核模块执行的文件打开操作,文件描述符只增不减
直至超越上限
*************************************************
查最大值:
sysctl -a | grep file-max
sysctl -A | grep fs.file-max
cat /proc/sys/fs/file-max
*************************************************
当前打开的文件总数:
cat /proc/sys/fs/file-nr
*************************************************
修改方法:
登录到linux上,执行如下命令:
sysctl -w fs.file-max=16384
即可将这个内核参数设置到16384
这个命令不需要重启系统即可生效,但是下次重启系统,内核参数fs.file-max又会变成系统默认的8192
永久修改需要修改配置文件/etc/sysctl.conf
加入如下一行:
fs.file-max=16384
保存退出
这样即便重启了服务器,参数也是指定的16384了
当改得太小:如:fs.file-max=100
引起XServer起不来
改成fs.file-max=1000时,终端打不开,gedit打开文件全是死在那
fs.file-max=3000--4000系统才能正常跑起来
**************************************************
一旦改错,有时引起系统启不起来
可修改grub:
在命令行上加入:
single rw
进入后修改回来
转载于:https://blog.51cto.com/rambler/690098