it-swarm-ru.tech

Достигнут предел наблюдения за ядром inotify

В настоящее время я сталкиваюсь с проблемой в Linux, где в качестве пользователя root у меня есть команды, возвращающие ошибку, потому что достигнут предел наблюдения inotify.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Я немного погуглил, и каждое решение, которое я нашел, заключается в увеличении лимита с помощью:

Sudo sysctl fs.inotify.max_user_watches=<some random high number>

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

Итак, вот мои вопросы:

  • Безопасно ли повышать это значение и каковы будут последствия слишком высокого значения?
  • Есть ли способ узнать, какие часы установлены в данный момент и какой процесс настроил их, чтобы определить, не является ли достигнутый предел вызванным неисправным программным обеспечением?
221
Ultraspider

Безопасно ли повышать это значение и каковы будут последствия слишком высокого значения?

Да, безопасно повысить это значение, и ниже указаны возможные затраты [ источник ]:

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

Чтобы проверить максимальное количество часов inotify:

cat /proc/sys/fs/inotify/max_user_watches

Чтобы установить максимальное количество часов inotify

Временно:

  • Запустить Sudo sysctl fs.inotify.max_user_watches= с вашим предпочтительным значением в конце.

Постоянно ( более подробная информация ):

  • положил fs.inotify.max_user_watches=524288 в ваши настройки sysctl. В зависимости от вашей системы они могут находиться в одном из следующих мест:
    • Debian/RedHat: /etc/sysctl.conf
    • Arch: положить новый файл в /etc/sysctl.d/, например /etc/sysctl.d/40-max-user-watches.conf
  • вы можете перезагрузить настройки sysctl, чтобы избежать перезагрузки: sysctl -p (Debian/RedHat) или sysctl --system (Арка)

Проверьте, было ли достигнуто максимальное количество часов inotify:

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

tail: не могу смотреть '/ var/log/dmsg': на устройстве не осталось места

Чтобы узнать, что использует часы inotify

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

В первом столбце указывается количество inotify fds (но не количество часов), а во втором - PID этого процесса [sources: 1 , 2 ].

294
tshepang