Я уже ответил на этот вопрос в той же ветке Unix Stackexchange, о которой упоминал @cincodenada, но подумал, что могу опубликовать свой готовый ответ здесь, видя, что ни у кого действительно нет ничего работающего:
У меня есть готовый скрипт, 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
Здесь вы быстро поймете, почему ограничение по умолчанию в 8K наблюдателей слишком мало для машины разработки, так как только экземпляр WebStorm быстро увеличивает это значение при обнаружении папки node_modules
с тысячами папок. Добавьте наблюдателя веб-пакетов, чтобы гарантировать проблемы ...
Несмотря на то, что он был намного быстрее, чем другие альтернативы, когда я делал его изначально, Саймон Маттер добавил некоторые улучшения скорости для сильно загруженного Big Iron Linux (сотни ядер), которые значительно ускорили его, сократив время с десяти минут (!) до 15. секунд на своем чудовище.
Как использовать
inotify-consumers --help
???? Чтобы получить его на свой компьютер, просто скопируйте содержимое скрипта и поместите его куда-нибудь в свой $PATH
, например /usr/local/bin
. В качестве альтернативы, если вы доверяете этому незнакомцу в сети, вы можете не копировать его и передать в bash через http:
$ 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
person
oligofren
schedule
16.03.2020