web-dev-qa-db-ja.com

カーネルの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

その値を上げても安全ですか?値が高すぎるとどうなりますか?

はい、その値を上げても安全です。以下は可能なコストです[ source ]:

  • usedinotifyウォッチは540バイト(32ビットシステム)、または1 kB(ダブル-64ビット)を使用します[ソース: 12 ]
  • これはカーネルメモリから取得され、スワップできません。
  • 最大値を524288に設定し、すべてが使用された(ありそうにない)場合、約256MB/512MBの32ビット/ 64ビットカーネルメモリを使用します。
    • アプリケーションは、追加のメモリを使用して、inotifyハンドル、ファイル/ディレクトリパスなどを追跡することにも注意してください。設計に依存します。

inotifyウォッチの最大数を確認するには:

cat /proc/sys/fs/inotify/max_user_watches

inotifyウォッチの最大数を設定するには

一時的に:

  • 最後に任意の値を使用してSudo sysctl fs.inotify.max_user_watches=を実行します。

永久に( 詳細情報 ):

  • sysctl設定にfs.inotify.max_user_watches=524288を追加します。システムに応じて、次の場所のいずれかにある可能性があります。
    • 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(フォロー)オプションとともに使用します。 tail -f /var/log/dmesg:-すべて問題なければ、最後の10行を表示して一時停止します。 Ctrl-Cで中止-あなたがウォッチから出ている場合、これは失敗します やや不可解なエラー

テール: '/ 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の数を示しますが(ウォッチの数ではありません)、2番目の列はそのプロセスのPIDを示します[ソース: 12 ]。

294
tshepang