web-dev-qa-db-ja.com

RabbitMQ +メモリ制限

RabbitMQの構成の詳細を調べているところですが、出くわしました

[{rabbit, [{vm_memory_high_watermark, 0}, 
           {disk_free_limit, {mem_relative, 1.0}}
          ]
}]

この構成はどういう意味ですか?

vm_memory_high_watermark 0に設定すると、=> rabbitmqアプリが起動するとすぐにすべてのパブリッシャーをブロックしますか?しかし、rabbitmqは、送信するメッセージをキューに入れることができます。

16720 rabbitmq  20   0  142m  62m 2408 S    0  **1.6**   0:06.88 beam.smp

ブローカーにメッセージを送信するたびに、このプロセスのメモリ使用量が増加します。それで、これは透かしが0に設定されているにもかかわらず、メッセージがメモリ内にあることを意味しますか?

RAMのメモリ制限に達してもメッセージが送信されている場合はどうなるのか知りたいのですが。どちらの発行者もブロックされていますか?またはメッセージが利用可能な場合、ディスクにスワップアウトされますか?

14
Tamil

Vm_memory_high_watermarkは、RabbitMQのメモリフロー制御に関連するパーセンテージ値です。

メモリフロー制御 を見ると、「メモリベースのフロー制御」の見出しの下に次のように表示されていることがわかります。

RabbitMQサーバーは、起動時およびrabbitmqctl set_vm_memory_high_watermarkフラクションが実行されたときに、コンピューターにインストールされているRAMの合計量を検出します。メモリアラームが発生し、すべての接続がブロックされます。メモリアラームがクリアされると(たとえば、サーバーがメッセージをディスクにページングしたり、クライアントに配信したりしたため)、通常のサービスが再開されます。

したがって、この値を0に設定すると、もちろんすぐにトリガーされます。 RabbitMQがより多くのメモリを使用できるようにする場合は、値を増やす必要があります。

もう1つの重要な注意:

デフォルトのメモリしきい値は、インストールされているRAMの40%に設定されています。これは、RabbitMQサーバーが40%を超えて使用することを妨げるものではなく、パブリッシャーが抑制されるポイントにすぎないことに注意してください。

したがって、アラームが発生したときにメッセージを公開しようとすると、発行者はメッセージの送信をブロックされます。

すべてのパブリッシャーをブロックする場合は、vm_memory_high_watermarkを0に設定します。メモリベースのフロー制御を「無効」にする場合は、vm_memory_high_watermarkを100に設定します。上記のリンクの詳細を参照してください。

値0を指定すると、メモリアラームがすぐにオフになり、すべての公開が無効になります(これは、公開をグローバルに無効にする場合に役立ちます。rabbitmqctlset_vm_memory_high_watermark0を使用してください)。メモリアラームがまったく鳴らないようにするには、100などの高い乗数を設定します。

16
kzhen