После недавнего обновления до Fedora 15 я обнаружил, что некоторые инструменты перестали работать с ошибками, такими как:
tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling
Также tail
сообщается о проблемах с inotify. Есть ли способ опросить ядро, чтобы выяснить, какой процесс или процессы потребляют ресурсы inotify? Текущие sysctl
настройки, связанные с inotify , выглядят так:
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null
Вероятно, у вас заканчиваются часы inotify, а не экземпляры. Чтобы узнать, кто создает много часов:
echo 1 >> /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
чтобы включить отслеживание добавления часов;cat /sys/kernel/debug/tracing/tracing_enabled
чтобы убедиться, что он установлен в 1, и если это не такecho 1 >> /sys/kernel/debug/tracing/tracing_enabled
;/sys/kernel/debug/tracing/trace
чтобы узнать, сколько часов создано и какими процессами.Когда вы закончите, убедитесь, что выведите 0 в файл включения (и в файл tracing_enabled, если вам нужно было также включить это), чтобы отключить трассировку, чтобы не понизить производительность при продолжении трассировки.
источник
echo 1 | sudo tee /sys/kernel/debug/tracing/tracing_on
на современных дистрибутивах (Ubuntu 18.04.2 LTS).Как сказал @Jonathan Kamens, у вас, вероятно, заканчиваются часы. У меня есть Premade сценарий ,
inotify-consumers
, что списки это для вас:Здесь вы быстро увидите, почему ограничение по умолчанию для 8K наблюдателей слишком мало на компьютере разработчика, так как только экземпляр WebStorm быстро достигает максимума при обнаружении
node_modules
папки с тысячами папок. Добавить наблюдателя веб-пакета, чтобы гарантировать проблемы ...Просто скопируйте содержимое скрипта (или файл на GitHub) и поместите его где-нибудь в свой
$PATH
, например/usr/local/bin
. Для справки, основное содержание сценария простоЕсли вам интересно, как увеличить лимиты, вот как сделать его постоянным:
источник
Я столкнулся с этой проблемой, и ни один из этих ответов не дает ответа на вопрос "сколько часов каждый процесс использует в настоящее время?" Все строки указывают на то, сколько экземпляров открыто, что является лишь частью истории, а трассировка полезна только для того, чтобы увидеть, как открываются новые часы.
TL; DR: Это даст вам файл со списком открытых
inotify
экземпляров и количеством часов, которые они имеют, а также pids и двоичные файлы, которые их породили, отсортированные в порядке убывания по количеству часов:Это большой беспорядок, вот как я туда попал. Для начала я запустил
tail
тестовый файл и посмотрел на открытые файлы:Итак, 4 - это то, что мы хотим исследовать. Давайте посмотрим, что
fdinfo
для этого:Это выглядит как запись для часов внизу!
Давайте попробуем что-нибудь с большим количеством часов, на этот раз с
inotifywait
утилитой, просто наблюдая за тем, что есть/tmp
:Ага! Больше записей! Итак, у нас должно быть шесть вещей
/tmp
:Отлично. Мой новый
inotifywait
имеет одну запись в своемfd
списке (это то, что подсчитывают другие однострочники), но шесть записей в своемfdinfo
файле. Таким образом, мы можем выяснить, сколько часов использует данный fd для данного процесса, просмотрев егоfdinfo
файл. Теперь, чтобы сложить его с некоторыми из вышеперечисленных, можно получить список процессов, у которых открыты часы уведомлений, и использовать их для подсчета записей в каждомfdinfo
. Это похоже на вышеприведенное, поэтому я просто дам здесь однострочник:Здесь есть некоторые толстые вещи, но основы в том, что я использую,
awk
чтобы построитьfdinfo
путь изlsof
выходных данных, захватывая pid и число fd, убирая флаг u / r / w из последнего. Затем для каждого построенногоfdinfo
пути я подсчитываю количествоinotify
строк и выводю количество и pid.Было бы неплохо, если бы у меня были процессы, которые эти пиды представляют в одном месте, правда? Я так и думал. Так, в частности , грязных немного, я остановился на вызов
dirname
дважды наfdinfo
пути , чтобы получить пакет к/proc/<pid>
, добавив/exe
к нему, а затем работаетreadlink
на том , что , чтобы получить имя еха процесса. Также добавьте это, отсортируйте по количеству часов и перенаправьте в файл для сохранности, и мы получим:Запустив это без sudo, чтобы просто показать мои процессы, которые я запустил выше, я получаю:
Отлично! Список процессов, fd, и сколько часов каждый использует, что именно то, что мне нужно.
источник
lsof
для этой цели я бы рекомендовал использовать-nP
флаги, чтобы избежать ненужных поисков обратных DNS и имен портов. В этом конкретном случае-bw
также рекомендуется добавить, чтобы избежать потенциально блокирующих системных вызовов. Тем не менее, приlsof
сожжении 3 секунд времени настенных часов на моей скромной рабочей станции (из которых 2 секунды тратятся в ядре), этот подход хорош для исследования, но увы не подходит для целей мониторинга.lsof | awk '/a_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | sed 's/fdinfo.*//' | sort | uniq > uniq-o
затемcat uniq-o | while read fdi; do count=$(cat ${fdi}fdinfo/* | grep -c inotify 2>/dev/null); exe=$(readlink ${fdi}exe); echo -e $count"\t"${fdi}"\t"$exe; done > watches
Чтобы отследить, какие процессы потребляют часы inotify (не экземпляры), вы можете использовать функцию динамического ftrace ядра, если она включена в вашем ядре.
Опция ядра вам нужна
CONFIG_DYNAMIC_FTRACE
.Сначала смонтируйте файловую систему debugfs, если она еще не смонтирована.
Перейдите в
tracing
подкаталог этого каталога debugfsВключить отслеживание вызовов функций
Фильтровать только
SyS_inotify_add_watch
системные вызовыОчистить буфер трассировки, если он не был пуст
Включить трассировку, если она еще не включена
Перезапустите подозрительный процесс (в моем случае это был crashplan, приложение для резервного копирования)
Посмотрите, как исчерпаны inotify_watch
Готово
источник
источник
Я изменил скрипт, представленный выше, чтобы показать список процессов, которые потребляют ресурсы inotify :
Я думаю, что есть способ заменить мой двойной сед .
Да. Используйте либо
или же
и вы получите только пид.
Также, если вы добавите
в поиске вы избавитесь от досадных ошибок, которые выдает команда find. Так что это будет работать:
источник