我怎样才能知道注册了哪些inotify手表?

fri*_*rio 41 linux inotify

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

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

Dav*_*nós 39

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

  • `lsof` 将只显示 inotify 实例(`inotify_init` / `max_user_instances`)。它不显示手表,这是OP询问的(`inotify_add_watch`/`max_user_watches`) (4认同)

oli*_*ren 32

已经在@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
Run Code Online (Sandbox Code Playgroud)

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

尽管它比我最初制作时的其他替代方案快得多,但 Simon Matter 为重载的 Big Iron Linux(数百个内核)添加了一些速度增强功能,极大地加快了速度,将其从 10 分钟(!)减少到 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
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

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

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

改变限制

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

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的剧本!**这应该是公认的答案**。哦,你的脚本应该可以在 Yum 和 Apt 存储库中使用,在我看来,它应该在每个 Linux 发行版中占有一席之地! (3认同)

zee*_*vfu 15

  1. 默认最大inotify手表数量为8192; 可以通过写入/ proc/sys/fs/inotify/max_user_watches来增加它.
    您可以sysctl fs.inotify.max_user_watches用来检查当前值.

  2. 使用tail -f验证,如果你的OS不超过inotify最高限额的手表.命令
    的内部实现tail -f使用该inotify机制来监视文件更改.
    如果您的inotify手表耗尽,您很可能会收到此错误:

    tail:inotify不能使用,恢复轮询:打开文件太多

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

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


Gui*_*ido 5

我认为

sudo ls -l /proc/*/fd/* | grep notify
Run Code Online (Sandbox Code Playgroud)

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

我不知道如何获得比这更多的信息!华泰