web-dev-qa-db-ja.com

inotifyの時計がなくなっているかどうかを確認するにはどうすればよいですか?

私はinotifyウォッチを使用するアプリケーションを使用します。 既に設定済み

fs.inotify.max_user_watches=32768

/etc/sysctl.confでしたが、昨夜、手動で実行しない限り、アプリケーションはインデックス作成を停止しました。

この数を増やすとトレードオフが何であるかわからないため(RAMをより多く消費しますか?)、この数を増やすだけでよいかどうかわかりません。これらすべての時計を使用しているかどうか、そして時計を増やすためのトレードオフが何かを知ることができます。

46
Jorge Castro

あなたが時計を失っていることをどのように知っていますか? tailが教えてくれます!

  • 古いファイルで-f(フォロー)オプションを使用してtailを開始します。 tail -f /var/log/dmesg
    • すべて順調であれば、最後の10行が表示されて一時停止します。 Ctrl-Cで中止
    • あなたが監視外の場合、これは失敗します やや不可解なエラー
      tail: '/ var/log/dmsg'を見ることができません:デバイスにスペースが残っていません

好奇心のために:なぜtailは「テルテール」ですか?

  • 実際、anyよく書かれたアプリ は、inotifyAPI/callsは、取引内容を明確に伝えます。
  • 代わりにstrace tail -f ...を試してください。成功すると、次で終了します:
     inotify_add_watch(4、 "/ var/log/dmesg"、IN_MODIFY ...) = 1
  • しかし、それが失敗した場合、つまりあなたが監視から外れている場合、それは言うでしょう:
     inotify_add_watch(4、 "/ var/log/dmesg"、IN_MODIFY ..)
    = -1 ENOSPC(デバイスにスペースが残っていない)

時計を増やすことができますか?いくらですか?トレードオフはありますか?

短い答え:確かに、汗はありません。必要に応じて50万(524288)に直行します。使用される追加メモリは、4GB以上のメモリを備えた最新のシステムでは無視できるはずです。

  • usedinotifyウォッチは、540バイト(32ビットシステム)、または1 kB(ダブル-64ビット)を使用します[ソース: 12 ]
  • これは、カーネルメモリから発生します。これはスワップ不可です。
  • したがって、最大値を524288に設定し、すべてが使用された(ありそうにない)と仮定すると、約1を使用することになります。 256MB/512MBの32ビット/ 64ビットカーネルメモリ

    • また、アプリケーションは追加メモリを使用して、inotifyハンドル、ファイル/ディレクトリパスなどを追跡します。その量は、その設計に依存します。
  • 最大値はいくらですか?理論的には、十分なRAMがあればどれもないと思います。実際には、524288 アプリによって公式に推奨されています 、そして人々は 2 million に設定され、もちろん、メモリ使用量。

63
ish

この数を増やすべきかどうかわかりません

max_user_watches値に到達したかどうかを確認する簡単な方法は、ユーザーがパッケージinotify-toolsからinotifywatchを使用し、ファイルから情報を収集できるかどうかを確認することです。

たとえば、inotifywatch -v /home/bruno/.profile for meは以下を返します。

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

したがって、inotifyには新しい時計の作成に問題はなく、ここには問題がありません。

Inotifyウォッチの上限に達した場合、次のような結果が返されます。

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

このようなものが表示される場合は、制限に達しているため、許可される時計の制限を増やす必要があります。

より多くのRAMを消費しますか?

はい、そうです。しかし、これによると 古い記事 消費する量は、実行中のデスクトップの他の側面と比較して最小限です。

- メモリ使用量 -

Inotifyデータ構造は軽量です。

inotifyウォッチは40バイトですinotifyデバイスは68バイトですinotifyイベントは272バイトです

したがって、デバイスに8192個のウォッチがあると仮定すると、構造は320KBのメモリしか消費しません。一度に存在できるデバイスの最大数は8つですが、これはまだ2.5 MBのみです

各デバイスは、一度に256個のイベントをキューに入れることができます。これは、デバイスごとに合計で68KBになります。また、すべてのデバイスが開かれ、イベントキューがいっぱいになっている場合は、わずか0.5 MBです。

そのため、まれにすべてが開いていっぱいになると、約3 MBのメモリが使用されます。

各inotifyウォッチはメモリ内のディレクトリ/ファイルのiノードを固定します。iノードのサイズはファイルシステムごとに異なりますが、512バイトと仮定します。

したがって、グローバルウォッチの最大数がアクティブであると仮定すると、iノードキャッシュ内の32 MBのiノードが固定されます。ここでも、最新のシステムでは問題ありません。

もちろん、記事が書かれてから物事に大きな変化はなかったと思いますが、心配しない数値を見て、制限を増やしても_ ​​RAMの消費はそれほど増えません。


inotifyに関する関連記事

10
Bruno Pereira