Ubuntu 16.04 上 inotify 监视的用户数量已达到限制

Ubuntu 16.04 上 inotify 监视的用户数量已达到限制

我刚刚安装了 Ubuntu 16.04,启动时收到此警告智能Git

IOException: User limit of inotify watches reached

此外,我收到此警告tail -f

tail: inotify resources exhausted 

tail: inotify cannot be used, reverting to polling

我在使用 Ubuntu 14.04 时从未遇到过此错误,并且我在新 Ubuntu 上使用的应用程序和文件与我在以前的版本中使用的完全相同。

唯一相关的区别是我在 PC 上添加了一个额外的硬盘,并且配置了 Ubuntu 的备份工具。这个问题是否与第二个磁盘或备份工具有关?

答案1

Xenial 上的当前默认值是 8192(参见内核源代码中的 fs/notify/inotify/inotify_user.c),您可以通过将文件打印到标准输出来验证这一点:

cat /proc/sys/fs/inotify/max_user_watches
8192

您可以将数字增加一倍至 16384,方法是:

echo 16384 | sudo tee /proc/sys/fs/inotify/max_user_watches

请记住,inotify 监视确实会消耗内存,我认为在 64 位系统上每个监视大约消耗 160 字节。

要永久设置此功能,请在 /etc/sysctl.conf 中添加一个条目,例如:

echo fs.inotify.max_user_watches=16384 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

..或者手动编辑/etc/sysctl.conf(您需要 root 权限才能更新它)然后运行sudo sysctl -p

答案2

上述答案很有效,但它并没有解释为什么我一直在寻找一个完整的答案 -

为什么?

同步文件的程序(例如 dropbox、git 等)使用 inotify 来通知文件系统的更改。可以通过以下方式查看限制 -

cat /proc/sys/fs/inotify/max_user_watches

对我来说,这表明100000。当此限制不足以监控目录内的所有文件时,就会抛出此错误。


增加 inotify 观察者的数量(简短版本):

如果你正在跑步Debian、RedHat 或其他类似的 Linux 发行版,在终端中运行以下命令:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

如果你正在跑步ArchLinux,请运行以下命令(请参阅此处了解原因):

echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

然后将其粘贴到您的终端并按回车键运行它。


技术细节:

Listen 在 Linux 上默认使用 inotify 来监控目录的更改。系统对可监控文件数量的限制并不罕见。例如,Ubuntu Lucid(64 位)的 inotify 限制设置为 8192。

您可以通过执行以下命令获取当前的 inotify 文件监视限制:

$ cat /proc/sys/fs/inotify/max_user_watches

当此限制不足以监视目录内的所有文件时,必须增加限制以使 Listen 正常工作。

您可以使用以下方式临时设置新的限制:

$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p

如果您想让您的限制永久生效,请使用:

$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p

如果 Listen 继续抱怨,您可能还需要注意 max_queued_events 和 max_user_instances 的值。

来源:https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers

答案3

您可以检查现有的限制,并在此基础上根据您的要求进行修改

To Check : cat /proc/sys/fs/inotify/max_user_watches To Alter : sudo sysctl fs.inotify.max_user_watches=524288

这将解决错误。

相关内容