Как узнать, какие часы inotify были зарегистрированы?

У меня установлен лимит просмотра inotify на 1024 (думаю, по умолчанию 128?). Несмотря на это, yeoman, Guard и Dropbox постоянно терпят неудачу и говорят мне увеличить лимит inotify. Прежде чем сделать это, я хотел бы знать, что потребляет все мои часы (у меня очень мало файлов в моем Dropbox).

Есть ли какая-то область /proc или /sys или какой-то инструмент, который я могу запустить, чтобы узнать, какие часы зарегистрированы в настоящее время?


person frio    schedule 07.12.2012    source источник
comment
Значение по умолчанию — 8192, и даже это абсурдно мало, если вы делаете что-то существенное с помощью inotify. Вам следует поднять значение, и, возможно, довольно сильно. В моих системах значение, которое я использую, находится в диапазоне от 131072 до 1048576...   -  person Michael Hampton    schedule 14.12.2013
comment
См. также: unix.stackexchange.com/q/386877/143394   -  person Tom Hale    schedule 18.08.2017


Ответы (7)


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
person David Canós    schedule 28.07.2014
comment
lsof будут отображаться только экземпляры inotify (inotify_init / max_user_instances). Он не показывает часы, о чем спрашивал ОП (inotify_add_watch / max_user_watches) - person Todd Freed; 25.04.2021

Я уже ответил на этот вопрос в той же ветке 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
comment
Просто идея: ваш сценарий также может предоставить некоторую информацию о текущих значениях max_user_watches и max_user_instances для удобства. - person Nicolas Göddel; 16.03.2020
comment
@Николас Готово. Добавлены --help и --list - person oligofren; 17.03.2020
comment
Спасибо за ваш сценарий! Это должен быть принятый ответ. О, и ваш скрипт должен быть доступен в репозиториях Yum и Apt, IMO, он заслуживает место в каждом дистрибутиве Linux! ???? - person BenMorel; 13.10.2020
comment
Потрясающий сценарий! - person Daniel F; 12.04.2021

  1. По умолчанию максимальное количество часов inotify равно 8192; его можно увеличить, написав в /proc/sys/fs/inotify/max_user_watches.
    Вы можете использовать sysctl fs.inotify.max_user_watches для проверки текущего значения.

  2. #P2# <блочная цитата> #P3#
  3. Чтобы узнать, какие inotify часы были зарегистрированы, вы можете обратиться к этому, и это. Я пробовал, но идеального результата не получил. :-(

Ссылка:
https://askubuntu.com/questions/154255/how-can-i-tell-if-i-am-out-of-inotify-watches
https://unix.stackexchange.com/вопросы/15509/кто-потребление-моих-инотифи-ресурсов
https://bbs.archlinux.org/viewtopic.php?pid=1340049

person zeekvfu    schedule 03.12.2013
comment
его можно увеличить, написав в /proc/sys/fs/inotify/max_user_watches, поэтому мы можем использовать cat /proc/sys/fs/inotify/max_user_watches для получения текущего значения:) - person Weekend; 13.07.2018
comment
fs.inotify.max_user_watches = 524288 в Arch Linux - person Paul Hargreaves; 27.03.2020

я думаю

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

может пригодиться. Вы получите список pids, для которых зарегистрирован inotify fd.

Я не знаю, как получить больше информации, чем это! ХТН

person Guido    schedule 03.12.2013
comment
что делать, если вы находитесь на рабочей машине и у вас нет доступа к этим папкам - person Tim Boland; 24.06.2017

Поскольку это высоко в результатах Google, я копирую часть своего ответа из аналогичного вопроса на Unix/Linux StackExchange:

Я столкнулся с этой проблемой, и ни один из этих ответов не дает ответа на вопрос «сколько часов использует каждый процесс в настоящее время?» Все однострочники показывают, сколько экземпляров открыто, что является лишь частью истории, а трассировка полезна только для того, чтобы увидеть, как открываются новые часы.

Это даст вам файл со списком открытых 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

Если вам интересно, что делает этот большой клубок беспорядка и почему, я подробно объяснил на исходный ответ.

person cincodenada    schedule 22.02.2018
comment
Связанный ответ дает хороший обзор вашего подхода. Доброго копания дружище! - person six-k; 18.03.2018
comment
Это на самом деле не работает на моей машине. Получение lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. - person oligofren; 22.02.2019
comment
Я получаю то же предупреждение, что и @oligofren, и вообще ничего не выводит. Я даже не могу найти ни одного anon_inode в выводе lsof. Так что кажется, что ответ подходит не для каждой системы, в моем случае это Ubuntu 16.04. - person Nicolas Göddel; 16.03.2020
comment
@Nicolas У меня есть отличное решение в виде скрипта, который можно увидеть на Unix StackExchange: resources/502812#502812" title="кто потребляет мои ресурсы inotify">unix.stackexchange.com/questions/15509/ В нем будет указано количество наблюдателей на процесс, а также указано имя процесса, отсортированное крупнейшим преступником. - person oligofren; 16.03.2020

Следующая команда терминала отлично сработала для меня на моей машине с 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, я уменьшил количество экземпляров на 5, добавив большую папку Node.js «node_modules» в список игнорирования в настройках Sublime.

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

Источник: https://github.com/SublimeTextIssues/Core/issues/1195

person brenthompson2    schedule 07.09.2017
comment
Хотя список некоторых часов действительно есть, он далеко не полный. Я получаю около 30 наблюдателей, если суммирую первый столбец, что далеко не предел, если 8k. Либо мы должны умножить эти цифры на какой-то коэффициент, либо цифры не показывают то, что вы говорите. - person oligofren; 22.02.2019
comment
Не удалось отредактировать мой предыдущий комментарий, но, оказывается, я пропустил использование вами instances вместо watches, то есть ваш ответ не содержит ложной информации, но он не отвечает на фактический вопрос, который заключался в том, не как найти количество экземпляров, а количество просмотров. К сожалению, я не смог получить ответ от @cincodenada для работы, который действительно отвечает на вопрос :-( - person oligofren; 22.02.2019

Основываясь на прекрасном анализе cincodenada, я сделал свой собственный однострочный код, который работает лучше для меня:

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

Это помогает найти всех наблюдателей inotify и количество их просмотров. Он не переводит идентификаторы процессов в их имена и не сортирует их каким-либо образом, но для меня это не имело значения. Я просто хотел выяснить, какой процесс потребляет большую часть часов. Затем я смог найти этот процесс, используя его идентификатор процесса.

Вы можете опустить последнюю команду column, если она у вас не установлена. Это только для того, чтобы результат выглядел лучше.

Хорошо, как видите, есть аналогичный и менее жадный до форка подход от @oligofren. Лучше воспользуйтесь его простым скриптом. Это очень приятно. Я также смог уменьшить свой однострочник, потому что я не знал о параметре -lname для find, который здесь очень удобен.

person Nicolas Göddel    schedule 16.03.2020