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

206

В настоящее время я сталкиваюсь с проблемой в 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 с большим количеством папок или программного обеспечения, которое отслеживает много файлов)

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

  • Безопасно ли повышать это значение и каковы будут последствия слишком высокого значения?
  • Есть ли способ узнать, какие часы установлены в данный момент и какой процесс позволяет им определить, не является ли достигнутый предел вызванным неисправным программным обеспечением?
Ultraspider
источник
Вы, наверное, уже проверяли это, так как этому уже исполнилось 8 месяцев, но ваш диск заполнен? "tail: не могу смотреть" / var / log / messages ': на устройстве не осталось места "
froggythefrog

Ответы:

273

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

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

  • Каждые используемые часы inotify занимают 540 байт (32-разрядная система) или 1 кБ (дважды - на 64-разрядной) [источники: 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(Arch)

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

Используйте tailс параметром -f(follow) для любого старого файла, например 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 ].

tshepang
источник
3
I guess very few codes need the values higher than the defaultDropbox может потребовать более высокий лимит, в зависимости от того, сколько у вас файлов. Iv'e поднял мой без проблем. на самом деле, уведомление о сбрасывании (которое происходит, когда оно достигает своего предела) явно указывает на его повышение.
Фальмарри,
1
@ ultrasawblade- inotify заменен dnotify. Уведомление было медленным и глючным. inotify может использоваться в каталогах, и каталог будет «изменен» при изменении одного из файлов в этом каталоге (на один уровень глубины). В любом случае каталоги - это просто файлы.
beatgammit
6
«Постоянно: замените значение в / proc / sys / fs / inotify / max_user_watches» <- это неверно. Чтобы сделать этот перманент нужно поменять/etc/sysctl.conf
Merc
3
sysctl! = systemd, в вашем объяснении. А /etc/sysctl.dтакже работает на более новых системах на базе RedHat.
aairey
1
@stackexchanger, если вы уверены, что они похожи (например, вы тестировали), тогда, пожалуйста, отправьте и отредактируйте вопрос. Я сам не проверял, и я знаю, что дистрибутивы имеют тенденцию исправлять пакеты, поэтому поведение может быть различным для тех же пакетов. Это не говоря уже о различиях в версиях пакетов.
Чепанг