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

时间:2012-12-07 07:38:51

标签: linux inotify

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

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

7 个答案:

答案 0 :(得分:32)

inotify filesystem options

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

答案 1 :(得分:16)

already answered this在Unix Stackexchange上的同一线程中,就像@cincodenada提到的那样,但我认为我可以在这里重新发布现成的答案,因为没有人真正可以工作:


我创建了一个premade scriptinotify-consumers,该速度非常快(<0.1秒),其中列出了最严重的违规者:

$ 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

在这里,您很快就会看到为什么8K观察者的默认限制在开发机器上太少了,因为遇到一个有成千上万个文件夹的node_modules文件夹时,只有WebStorm实例很快将其最大化。添加webpack观察程序以确保出现问题...

只需复制脚本的内容(或GitHub上的文件)并将其放在$PATH中的某个位置,例如/usr/local/bin。供参考,脚本的主要内容就是这样

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

如果您想知道如何增加限制,可以使用以下方法使其永久存在:

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

答案 2 :(得分:14)

  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。我试过了,但没有得到理想的结果。 : - (

  4. 参考:
    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

答案 3 :(得分:4)

由于Google搜索结果很高,我在Unix / Linux StackExchange上从类似的问题中复制粘贴my answer的一部分:

我遇到了这个问题,这些答案都没有给出答案“每个进程当前使用了多少手表?”单行代码都会显示有多少实例是打开的,这只是故事的一部分,跟踪内容只对查看新手表的打开非常有用。

这将为您提供一个文件,其中包含已打开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

如果你对这个混乱的大球有什么感觉以及为什么这么做,我会在the original answer上深入解释。

答案 4 :(得分:3)

我认为

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

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

我不知道如何获得更多信息! HTH

答案 5 :(得分:3)

以下终端命令在我的Ubuntu 16.04计算机上完美适用于我:

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

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

由于我正在进行Ionic Mobile App开发,我通过添加大型Node.js文件夹&#34; node_modules&#34;将实例数减少了5。到Sublime设置中的忽略列表。

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

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

答案 6 :(得分:0)

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

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

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

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

好吧,正如您所看到的,@ oligofren也有类似的方法,减少了饥饿感。最好您使用他的简单脚本。这是很不错的。我还可以缩小单线,因为我不知道-lname的{​​{1}}参数,在这里非常方便。