内核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
进入后修改回来