誰が私のinotifyリソースを消費していますか?

誰が私のinotifyリソースを消費していますか?

Fedora 15に最近アップグレードした後、次のエラーが原因で多くのツールが失敗することがわかりました。

tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling

これは単にtailinotify問題を報告する以上のものです。どのプロセスがinotifyリソースを消費しているかを調べるためにカーネルを調べる方法はありますか?現在、Inotify関連のsysctl設定は次のとおりです。

fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384

ベストアンサー1

プロセスがinotify_init()を介してinotifyインスタンスを作成すると、/ procファイルシステムのファイル記述子を表す結果ファイルは(存在しない)ファイル「anon_inode:inotify」へのシンボリックリンクであるようです。

$ cd /proc/5317/fd
$ ls -l
total 0
lrwx------ 1 puzel users 64 Jun 24 10:36 0 -> /dev/pts/25
lrwx------ 1 puzel users 64 Jun 24 10:36 1 -> /dev/pts/25
lrwx------ 1 puzel users 64 Jun 24 10:36 2 -> /dev/pts/25
lr-x------ 1 puzel users 64 Jun 24 10:36 3 -> anon_inode:inotify
lr-x------ 1 puzel users 64 Jun 24 10:36 4 -> anon_inode:inotify

概念を誤解しない限り、次のコマンドは、使用するinotifyインスタンスの数に基づいてソートされたプロセスのリスト(/ procに表示されている)を表示する必要があります。

$ for foo in /proc/*/fd/*; do readlink -f $foo; done | grep inotify | sort | uniq -c | sort -nr

犯人を探す

これは@markkcowanが以下のコメントで言及したものです。

$ find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null

おすすめ記事