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


206

私は現在、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を使用する場合、または多くのファイルを監視するソフトウェア)

だからここに私の質問があります:

  • その値を上げることは安全ですか?また、高すぎる値の結果はどうなりますか?
  • 現在設定されているウォッチが何であるか、どのプロセスがそれらを設定して、到達した制限が欠陥のあるソフトウェアによるものではないかを判断できるようにする方法を見つける方法はありますか?

これはおそらく8か月前のものなので、これまでにチェックしたことがありますが、ドライブはいっぱいですか?「テール: '/ var / log / messages'を視聴できません:デバイスにスペースが残っていません」
froggythefrog

回答:


273

その値を上げることは安全ですか?また、高すぎる値の結果はどうなりますか?

はい、その値を上げることは安全です、そして、以下は可能なコストです[ ソース ]:

  • 使用はinotify時計は540バイト(32ビットシステム)、または1キロバイト(ダブル- 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=最後に希望する値で実行します。

恒久的に(詳細情報):

  • fs.inotify.max_user_watches=524288sysctl設定に入れます。システムによっては、次のいずれかの場所にある場合があります。
    • 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で中止します - ウォッチが切れている場合、このやや不可解なエラーで失敗します

tail: '/ 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の数(ないが時計の数)を示し、第二は、そのプロセスのPIDを示し[源:12 ]。


3
I guess very few codes need the values higher than the defaultDropboxでは、ファイルの数に応じて、より高い制限が必要になる場合があります。Iv'eは問題なく鉱山を調達しました。実際、ドロップボックス通知(制限に達すると発生します)は、明示的に通知するよう指示しています。
ファルマーリ

1
@ ultrasawblade- inotifyはdnotifyに置き換えられました。dnotifyは遅く、バグがありました。inotifyはディレクトリで使用でき、そのディレクトリ内のファイルの1つ(深さ1レベル)が変更されると、ディレクトリが「変更」されます。とにかくディレクトリは単なるファイルです。
beatgammit

6
「永続的に:/ proc / sys / fs / inotify / max_user_watches内の値を置き換えます」<-これは誤りです。これを永続的にするには、変更する必要があります/etc/sysctl.conf
-Merc

3
あなたの説明では、sysctl!= systemd。また/etc/sysctl.d、新しいRedHatベースのシステムでも動作します。
-aairey

1
@stackexchangerは、これらが類似していると確信している場合(たとえば、テスト済み)、質問を送信して編集してください。私自身はチェックしていませんが、ディストリビューションはパッケージにパッチを適用する傾向があるため、同じパッケージでも動作が異なる場合があります。これは、パッケージのバージョンの違いも言うまでもありません。
シェパン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.