我的inotify监视限制设置为1024(我认为默认值是128?)。尽管如此,自耕农,Guard和Dropbox经常失败,并告诉我提高我的inotify限制。在此之前,我想知道我的所有手表消耗了什么(我的Dropbox中的文件很少)。
是否有/ proc或/ sys的某个区域,或者我可以运行的某些工具,以找出当前注册的手表?
答案 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 script,inotify-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)
inotify
手表的默认最大数量为8192;可以通过写入 / proc / sys / fs / inotify / max_user_watches 来增加它。
您可以使用sysctl fs.inotify.max_user_watches
检查当前值。
使用tail -f
验证您的操作系统是否确实超出inotify
最高值限制。
tail -f
命令的内部实现使用inotify
机制来监视文件更改
如果您的inotify
手表耗尽,则最有可能出现此错误:
tail:无法使用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
答案 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"]
答案 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}}参数,在这里非常方便。