我将我的 inotify 监视限制设置为 1024(我认为默认值为 128?)。尽管如此,yeoman、Guard 和 Dropbox 还是经常失败,并告诉我提高我的 inotify 限制。在这样做之前,我想知道是什么消耗了我所有的手表(我的 Dropbox 中的文件很少)。
是否有 /proc 或 /sys 的某些区域,或者我可以运行的某些工具,以找出当前注册的手表?
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
我已经在@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
默认最大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 -消费-my-inotify-resources
https://bbs.archlinux.org/viewtopic.php?pid=1340049
我认为
sudo ls -l /proc/*/fd/* | grep notify
可能有用。您将获得已注册 inotify fd 的 pid 列表。
我不知道如何获得比这更多的信息!高温高压
以下终端命令在我的 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"]
由于这在 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
如果您对那个大杂烩的作用以及原因感兴趣,我在原始答案中进行了深入解释。
基于对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
非常方便。