カーネルinotify監視制限に達しました。

カーネル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や多数のファイルを監視するソフトウェアを使用する場合)

私の質問は次のとおりです。

  • この値を大きくしても安全ですか?値が高すぎるとどうなりますか?
  • 現在、どの時計が設定されていて、どのプロセスが時計を設定したかを調べて、限界に達したことがソフトウェアの欠陥によるものではないことを確認する方法はありますか?

答え1

この値を大きくしても安全ですか?値が高すぎるとどうなりますか?

はい、この値を上げるのは安全です。可能な費用は次のとおりです。 [源泉]:

  • 使用されるinotify watchは540バイト(32ビットシステム)または1kB(64ビットシステムでは2倍)を占めます。 [出典:12]
  • これはから来ていますカーネルメモリ、これは交換できません。
  • 最大値を524288に設定し、すべて使用すると仮定すると(可能性は低い)、約256 MB / 512 MBの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=524288sysctl設定に入ります。システムによっては、次のいずれかの場所にある可能性があります。
    • Debian/Red Hat:/etc/sysctl.conf
    • Arch:新しいファイルをに入れます/etc/sysctl.d//etc/sysctl.d/40-max-user-watches.conf
  • 再起動を避けるために、sysctl設定を再ロードできます。sysctl -p(Debian / RedHat)またはsysctl --system(Arch)

Inotify モニターの最大数に達していることを確認してください。

たとえば、古いファイルに(follow)オプションを使用しますtail。 - すべてがうまくいったら、最後の10行が表示され、中断するにはCtrl-Cを使用します。-ftail -f /var/log/dmesgあなたの時計が消えた、それは失敗するやや不思議なエラー:

尾: '/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]。

答え2

他のトピックでは使用しているinotifyクロックの数を取得する方法このスクリプトへの参照があります。inotify - 消費者私はこれが観察者を支配している人が誰であるかを正確に知らせるので非常に役に立つと思います。

関連情報