67

我将我的 inotify 监视限制设置为 1024(我认为默认值为 128?)。尽管如此,yeoman、Guard 和 Dropbox 还是经常失败,并告诉我提高我的 inotify 限制。在这样做之前,我想知道是什么消耗了我所有的手表(我的 Dropbox 中的文件很少)。

是否有 /proc 或 /sys 的某些区域,或者我可以运行的某些工具,以找出当前注册的手表?

4

7 回答 7

57

inotify 文件系统选项

sysctl fs.inotify

打开的文件

lsof | grep inotify | wc -l

像这样增加值

  • sysctl -n -w fs.inotify.max_user_watches=16384
  • sysctl -n -w fs.inotify.max_user_instances=512
于 2014-07-28T11:31:17.830 回答
46

已经在@cincodenada 提到的 Unix Stackexchange 上的同一个线程中回答了这个问题,但我认为我可以在这里重新发布我现成的答案,因为没有人真正有有效的东西:


我有一个预制脚本, inotify-consumers,它为您列出了最严重的违规者(较新的版本还列出了拥有该进程的用户名,见下文):

$ time inotify-consumers  

   INOTIFY
   WATCHER
    COUNT     PID     CMD
----------------------------------------
    6688    27262  /home/dvlpr/apps/WebStorm-2018.3.4/WebStorm-183.5429.34/bin/fsnotifier64
     411    27581  node /home/dvlpr/dev/kiwi-frontend/node_modules/.bin/webpack --config config/webpack.dev.js
      79     1541  /usr/lib/gnome-settings-daemon/gsd-xsettings
      30     1664  /usr/lib/gvfs/gvfsd-trash --spawner :1.22 /org/gtk/gvfs/exec_spaw/0
      14     1630  /usr/bin/gnome-software --gapplication-service
    ....

    7489  WATCHERS TOTAL COUNT

real    0m0.099s
user    0m0.042s
sys 0m0.062s

node_modules在这里,您很快就会明白为什么 8K 观察者的默认限制在开发机器上太少了,因为当遇到包含数千个文件夹的文件夹时,WebStorm 实例会迅速将其最大化。添加一个webpack watcher来保证问题...

尽管在我最初制作它时它比其他替代方案快得多,但 Simon Matter 为重负载的 Big Iron Linux(数百个内核)添加了一些速度增强,极大地加快了它的速度,从十分钟(!)减少到 15秒在他的怪物装备上。

如何使用

inotify-consumers --help 要在您的计算机上获取它,只需复制脚本的内容并将其放在您的某个位置$PATH,例如/usr/local/bin. 或者,如果您信任网络上的这个陌生人,您可以避免复制它并通过 http 将其通过管道传输到 bash:

$ curl -s https://raw.githubusercontent.com/fatso83/dotfiles/master/utils/scripts/inotify-consumers | bash 

       INOTIFY
       WATCHER
        COUNT     PID USER     COMMAND
    --------------------------------------
        3044   3933 myuser node /usr/local/bin/tsserver
        2965   3941 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/bin/tsserverForkStart /hom
         979   3954 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/node_modules/typescript/li
           1   7473 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i
           1   3899 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i

        6990  WATCHERS TOTAL COUNT

它是如何工作的?

作为参考,脚本的主要内容就是这个(灵感来自这个答案

find /proc/*/fd \
    -lname anon_inode:inotify \
    -printf '%hinfo/%f\n' 2>/dev/null \
    \
    | xargs grep -c '^inotify'  \
    | sort -n -t: -k2 -r 

更改限制

如果您想知道如何增加限制

$ inotify-consumers --limits 

Current limits
-------------
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 524288


Changing settings permanently
-----------------------------
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # re-read config
于 2020-03-16T11:47:42.613 回答
21
  1. 默认最大inotify观看次数为 8192;可以通过写入/proc/sys/fs/inotify/max_user_watches来增加它。
    您可以使用sysctl fs.inotify.max_user_watches来检查当前值。

  2. 用于tail -f验证您的操作系统是否超出了inotify最大观看限制。
    命令的内部实现tail -f使用该inotify机制来监视文件更改。
    如果您的inotify手表用完了,您很可能会收到此错误:

    tail:无法使用inotify,恢复轮询:打开的文件太多

  3. 要了解哪些inotify手表已注册,您可以参考thisthis。我试过了,但没有得到理想的结果。:-(

参考:
https ://askubuntu.com/questions/154255/how-can-i-tell-if-i-am-out-of-inotify-watches
https://unix.stackexchange.com/questions/15509/whos -消费-my-inotify-resources
https://bbs.archlinux.org/viewtopic.php?pid=1340049

于 2013-12-03T15:34:02.523 回答
4

我认为

sudo ls -l /proc/*/fd/* | grep notify

可能有用。您将获得已注册 inotify fd 的 pid 列表。

我不知道如何获得比这更多的信息!高温高压

于 2013-12-03T15:39:42.833 回答
4

以下终端命令在我的 Ubuntu 16.04 机器上非常适合我:

for foo in /proc/\*/fd/*; do readlink -f $foo; done | grep '^/proc/.*inotify' |cut -d/ -f3 |xargs -I '{}' -- ps --no-headers -o '%p %U %a' -p '{}' |uniq -c |sort -n

我的问题是我的大部分 HDD 作为文件夹加载到Sublime Text中。在/opt/sublime_text/plugin_host 8992和之间/opt/sublime_text/sublime_text,Sublime 有 18 个 inotify 实例,而我的其余程序都在 1-3 之间。

由于我在进行 Ionic 移动应用程序开发,因此我通过将大型 Node.js 文件夹“node_modules”添加到 Sublime 设置的忽略列表中,将实例数量减少了 5 个。

"folder_exclude_patterns": [".svn", ".git", ".hg", "CVS", "node_modules"]

来源:https ://github.com/SublimeTextIssues/Core/issues/1195

于 2017-09-07T21:28:42.247 回答
4

由于这在 Google 搜索结果中很高,因此我从 Unix/Linux StackExchange 上的一个类似问题中复制粘贴了部分答案:

我遇到了这个问题,这些答案都没有给你“每个进程当前使用多少手表?”的答案。one-liners 都告诉你打开了多少个实例,这只是故事的一部分,trace 的东西只对看到打开的新手表有用。

这将为您提供一个文件,其中包含打开的inotify实例列表和它们拥有的手表数量,以及产生它们的 pid 和二进制文件,按手表数量按降序排序:

sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); exe=$(sudo readlink $(dirname $(dirname $fdi))/exe); echo -e $count"\t"$fdi"\t"$exe; done | sort -nr > watches

如果您对那个大杂烩的作用以及原因感兴趣,我在原始答案中进行了深入解释。

于 2018-02-22T23:00:59.843 回答
2

基于对cincodenada的出色分析,我制作了自己的单线,这对我来说效果更好:

find /proc/*/fd/ -type l -lname "anon_inode:inotify" -printf "%hinfo/%f\n" | xargs grep -cE "^inotify" | column -t -s:

它有助于找到所有 inotify 观察者及其观看人数。它不会将进程 ID 转换为进程名称或以任何方式对它们进行排序,但这对我来说不是重点。我只是想找出哪个进程消耗了大部分手表。然后我能够使用它的进程 ID 搜索该进程。

column如果您没有安装它,您可以省略最后一个命令。它只是为了使输出看起来更好。

好的,正如您所看到的,@oligofren 提供了一种类似且更少分叉的方法。最好使用他的简单脚本。这是很不错的。我还能够缩小我的单线,因为我不知道这里的-lname参数find非常方便。

于 2020-03-16T12:33:57.053 回答