fs.nr_open: 控制单个进程可以打开的文件描述符的最大数量。单个进程的文件描述符限制可以通过 ulimit 命令来设置。


  • /proc/sys/fs/nr_open 是一个系统级别的全局参数,表示系统中单个进程能够打开的文件描述符总数的限制。
  • /proc/sys/fs/file-max 系统级别,当前系统可打开的最大数量
  • /etc/security/limits.conf 用户级别,指定用户可以打开的最大数量

问题描述:

kubernetes 集群使用promtail收集日志,发现一段时间有些机器日志收集不到查看promtail日志出现以下报错:error="filetarget.fsnotify.NewWatcher: too many open files"

 1、单个进程打开文件书过多,修改文件描述符

vim /etc/security/limits.conf
* soft nofile 100001
* hard nofile 100002
root soft nofile 100001
root hard nofile 100002
  • soft nofile 65535
  • hard nofile 65535                这两个值都需要小于/proc/sys/fs/nr_open设置的值

2、操作系统打开文件句柄数过多

整个操作系统可以打开的文件句柄数是有限的,受内核参数“fs.file-max”影响。

可以通过执行“echo 100000000 > /proc/sys/fs/file-max”命令来动态修改该值,也可以通过修改"/etc/sysctl.conf"文件来永久修改该值

3.修改inotify

  • fs.inotify.max_user_instances

含义: 限制单个用户能够创建的 inotify 实例的数量。 默认值: 取决于内核版本,通常是 128。 为什么会影响问题?

如果此值太低,用户将无法创建足够的 inotify 实例来监视文件和目录,可能导致 too many open files错误。通过将其增加到 819200,你提高了系统同时处理的 inotify 实例的数量,从而有助于避免相关的错误。

  • fs.inotify.max_queued_events

含义: 限制 inotify 队列中待处理事件的数量。 默认值: 通常是 16384。 为什么会影响问题:
如果监视的事件发生得太快,队列可能会变满,导致后续事件丢失。通过增加此值,你扩大了系统处理事件的缓冲区,有助于防止队列溢出。

  • fs.inotify.max_user_watches

含义: 限制单个用户能够为其监视的文件和目录设置的监视器(watches)的总数。 默认值: 通常是 8192。 为什么会影响问题:
如果监视的文件或目录数量太多,可能会达到默认的监视器数目上限,导致 too many open files 错误。通过将其增加到52428800,你提高了单个用户可以设置的监视器的数量,从而有助于避免相关的错误。 总体来说,通过调整这些 inotify参数,你扩大了系统处理文件系统事件的容量,从而减少了 too many open files错误的可能性。

需要注意的是,在调整这些参数时,要确保系统资源足够,以及对应的硬件和内核版本支持所需的数值。在生产环境中,调整这些参数之前最好进行适当的测试和评估。

[root@dell730-fm-100-2 ~]# sysctl fs.inotify.max_user_instances
fs.inotify.max_user_instances = 128
[root@dell730-fm-100-2 ~]# sysctl fs.inotify.max_user_instances=1024
fs.inotify.max_user_instances = 524288

echo fs.inotify.max_user_instances=81920 >> /etc/sysctl.conf &&  sysctl -p
echo fs.inotify.max_queued_events=1638400 >> /etc/sysctl.conf &&  sysctl -p
echo fs.inotify.max_user_watches=52428800 >> /etc/sysctl.conf &&  sysctl -p