プロセスがinotifyで監視しているオブジェクトの数を取得する

inotifyを使っていると、プロセスが監視しているファイルの数がfs.inotify.max_user_watchesの値を上回ってno space left on deviceのエラーとなる…ということはよくあるのだけど、じゃあ今いくつ監視しているのか?を知りたくなるので調べた。結論としては、プロセスがオープンしいるinotifyインスタンスに監視中のオブジェクト一覧が保存されており、数えると知ることができる。 まずは調査用のプロセスが欲しいので、無限にファイルを作りそれを監視するプログラムを用意する。 このプログラムを実行したあと(プロセスIDは4244)、/proc/32531/fdを見てみる。anon_inode:inotifyへのリンクになっている3が調査対象となるfd。 次に、/proc/4244/fdinfo/3の中を見てみると、監視しているディスクリプタ一覧がある。inotifyから始まる行を数えると、そのinotifyインスタンスで監視しているファイル数がわかる。 これをメトリクス化すれば、no space left on deviceエラーが発生した時に監視対象がmax_user_watchesの値を越えそうになっているのだな、ということが確認できるのではないか? 参考文献 https://github.com/google/cadvisor/issues/1581 https://github.com/yousong/gists/blob/master/shell/inotify_watchers.sh https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html https://github.com/torvalds/linux/blob/v4.15/Documentation/filesystems/proc.txt#L1744 https://tutorialmore.com/questions-553099.htm