Как я могу узнать, нет ли у меня часов inotify?

47

Я использую приложение, которое потребляет часы inotify. Я уже установил

fs.inotify.max_user_watches=32768

в /etc/sysctl.confно прошлой ночью приложение остановлена индексация , если я запустил его вручную, что приводит меня подозревать , что я из часов.

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

Хорхе Кастро
источник
Этот вопрос снова стал весьма актуальным, поскольку, как выяснилось в 18.04, разблокировка экрана невозможна, если у вас закончились часы с инодами.
Касперд

Ответы:

64

Как узнать, что у вас нет часов? хвост покажет!

  • Начните tailс -fопции (follow) для любого старого файла, например tail -f /var/log/dmesg:
    • Если все хорошо, он покажет последние 10 строк и остановится; прервать с помощью Ctrl-C
    • Если у вас нет часов , он потерпит неудачу с этой несколько загадочной ошибкой :
      tail: не могу смотреть '/ var / log / dmsg': на устройстве не осталось места

Для любопытных: почему хвост - это «хвост»?

  • На самом деле, любое хорошо написанное приложение должно быть любезно сообщать вам, так как API inotify / вызовы ясно говорит им, в чем заключается суть сделки.
  • Попробуйте strace tail -f ...вместо этого, и когда это удастся, это заканчивается:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • но если он потерпит неудачу, то есть у вас нет часов , он скажет:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (на устройстве не осталось места)
    

Можете ли вы увеличить часы? На сколько? Есть ли компромиссы?

Краткий ответ: Конечно, нет пота. Если хотите, переходите к полумиллиону (524288) ... используемая дополнительная память должна быть незначительной в современной системе с 4 ГБ + памяти.

  • Каждые используемые часы inotify занимают 540 байт (32-разрядная система) или 1 кБ (дважды - на 64-разрядной) [источники: 1 , 2 ]
  • Это исходит из памяти ядра , которое невозможно отключить.
  • Итак, предполагая, что вы установили максимум на 524288, и все были использованы (маловероятно), вы бы использовали прибл. 256 МБ / 512 МБ 32-битной / 64-битной памяти ядра

    • Обратите внимание, что ваше приложение также будет использовать дополнительную память для отслеживания дескрипторов inotify, путей к файлам / каталогам и т. Д. - насколько это зависит от его структуры.
  • Какое максимальное значение? Я думаю, нет, теоретически, если у вас достаточно оперативной памяти. На практике приложения официально рекомендуют 524288 , и люди устанавливают его на 2 миллиона , с соответствующим использованием памяти, конечно.

иш
источник
5
Если вы также хотите узнать фактическое текущее количество часов inotify (таким образом, больше, чем да / нет), перейдитеsudo lsof | grep -i inotify | wc -l
Frank Nocke
2
Ссылка "хорошо написанное приложение" не работает.
Гаурав Шарма
11

Я не знаю, стоит ли мне просто увеличить это число

Простой способ проверить, достигли ли вы своей max_user_watchesценности, - использовать вместе с пользователем inotifywatchиз пакета inotify-toolsи проверить, можете ли вы по-прежнему собирать информацию из файла.

Например inotifywatch -v /home/bruno/.profileдля меня возвращает:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Так inotifyчто нет проблем при создании новых часов, здесь нет проблем.

Если вы достигли своего максимального предела в часах inotify, он вернет что-то вроде

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Если вы видите что-то подобное, значит, вы достигли предела, и вам нужно будет увеличить допустимое количество часов.

Это потребляет больше оперативной памяти?

Да. Но согласно этой старой статье количество, которое он потребляет, минимально по сравнению с другими аспектами работающего рабочего стола.

--ИСПОЛЬЗОВАНИЕ ПАМЯТИ--

Структуры данных inotify имеют малый вес:

Часы inotify - 40 байтов. Устройство inotify - 68 байтов. Событие inotify - 272 байта.

Таким образом, предполагая, что устройство имеет 8192 часов, структуры будут использовать только 320 КБ памяти. Максимально допустимое количество устройств - 8, но это все равно всего 2,5 МБ.

Каждое устройство может также иметь 256 событий в очереди одновременно, что составляет 68 КБ на устройство. И только 0,5 МБ, если все устройства открыты и имеют полную очередь событий.

Таким образом, примерно 3 МБ памяти используется в редких случаях, когда все открыто и полно.

Каждое средство inotify следит за тем, чтобы индекс / файл находился в памяти, размер индекса различен для каждой файловой системы, но давайте предположим, что он составляет 512 байтов.

Таким образом, предполагая, что максимальное количество глобальных наблюдений является активным, это будет определять 32 МБ инодов в кэше инодов. Опять не проблема в современной системе.

Я, конечно, предполагаю, что вещи не сильно изменились с момента написания статьи, но, глядя на цифры, я бы не волновался, и увеличение лимита не сильно увеличит потребление ОЗУ.


Похожие посты о inotify

Бруно Перейра
источник
Извините, вчера у меня был черновик, открытый несколько часов назад, и я не видел вашего ответа, прежде чем опубликовал свой. Я думаю, это нормально, так как у них есть два разных подхода :-) Не могли бы вы пояснить, что в последних ядрах inotify использует 0,5 КБ (на 32-битной) или 1 КБ (64-битной) памяти ядра на часы, так как старая информация из 2005 больше не кажется правдой?
Иш