第7章 アドレスの最大メモリー使用量の設定
AMQ Broker は、ブローカーをホストするマシンが制限されたメモリーで実行されている場合でも、数百万のメッセージが含まれる膨大なキューを透過的にサポートします。
このような状況では、すべてのキューを 1 度にメモリーに保存できない可能性があります。超過したメモリー消費から保護するため、ブローカーの各アドレスに許可される最大メモリー使用量を設定できます。さらに、指定のアドレスにおいてこの制限に到達した際にブローカーが実行するアクションを指定できます。
特に、アドレスのメモリー使用量が設定済みの制限に達すると、ブローカーが以下のアクションのいずれかを実行するように設定できます。
- メッセージをページ化
- メッセージを通知せずに破棄
- メッセージを破棄および送信クライアントへ通知
- クライアントのメッセージ送信をブロック
以下のセクションでは、アドレスの最大メモリー使用量と、アドレスの制限に達したときにブローカーが取る、対応するアクションの設定方法を説明します。
トランザクションを使用すると、ブローカーはトランザクションの一貫性を確保するために追加のメモリーを割り当てる可能性があります。この場合、ブローカーによって報告されるメモリー使用量は、メモリーで使用される合計バイト数を反映しない可能性があります。そのため、指定された最大メモリー使用量に基づいてメッセージをページ化、破棄、またはブロックするようにブローカーを設定する場合、トランザクションも使用しないでください。
7.1. メッセージのページングの設定
最大メモリー使用量制限が指定されたアドレスに対して、使用量制限に達した際にブローカーが実行するアクションを指定することもできます。設定可能なオプションの 1 つが ページング です。
ページングオプションを設定する場合は、アドレスの最大サイズに達すると、ブローカーは、ディスク上のそのアドレスのメッセージを、ページファイル と呼ばれるファイルに保存します。各ページファイルには設定可能な最大サイズがあります。この方法で設定する各アドレスには、ページ化されたメッセージを格納するためにファイルシステム内に専用のフォルダーがあります。
キューのメッセージを検査する際に、キューブラウザーとコンシューマーの両方がページファイルに移動できます。ただし、非常に特殊なフィルターを使用しているコンシューマーは、キュー内の既存のメッセージが最初に消費されるまで、ページファイルに保存されているメッセージを消費できない可能性があります。たとえば、コンシューマーフィルターに "color='red'"
などの文字列式が含まれているとします。この条件を満たすメッセージがプロパティー "color='blue'"
の 100 万メッセージに従う場合、コンシューマーは "color='blue'"
のメッセージが最初に消費されるまで、メッセージを消費できません。
ブローカーは、クライアントが消費する準備ができたときに、ディスクからメモリーにメッセージを転送 ( 非ページ化 ) します。ファイルのすべてのメッセージが確認されると、ブローカーはディスクからページファイルを削除します。
以下の手順は、メッセージのページングを設定する方法を示しています。
7.1.1. ページングディレクトリーの指定
以下の手順では、ページングディレクトリーの場所を指定する方法を説明します。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にpaging-directory
要素を追加します。ファイルシステムのページングディレクトリーの場所を指定します。<configuration ...> <core ...> ... <paging-directory>/path/to/paging-directory</paging-directory> ... </core> </configuration>
その後ページング用に設定するアドレスごとに、ブローカーは指定したページングディレクトリーに専用のディレクトリーを追加します。
7.1.2. ページングのアドレスの設定
以下の手順では、ページング用のアドレスを設定する方法を説明します。
前提条件
- アドレスおよびアドレス設定の設定方法を理解している。詳細は、4章アドレスおよびキューの設定 を参照してください。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 一致するアドレスまたはアドレス セット 用に設定した
address-setting
要素の場合は、設定要素を追加して最大メモリー使用量を指定し、ページング動作を定義します。以下に例を示します。<address-settings> <address-setting match="my.paged.address"> ... <max-size-bytes>104857600</max-size-bytes> <page-size-bytes>10485760</page-size-bytes> <address-full-policy>PAGE</address-full-policy> ... </address-setting> </address-settings>
max-size-bytes
-
ブローカーが
address-full-policy
に指定されたポリシーを実行する前に、アドレスに許可されるメモリーの最大サイズ ( バイト単位 )。デフォルト値は-1 で
、制限なしを意味します。指定する値は、K、MB、GB などのバイト表記もサポートします。 page-size-bytes
-
ページングシステムで使用される各ページファイルのサイズ ( バイト単位 )。デフォルト値は
10485760
( つまり 10 MiB ) です。指定する値は、K、MB、GB などのバイト表記もサポートします。 address-full-policy
アドレスの最大サイズに達したときにブローカーが取るアクション。デフォルト値は
PAGE
です。有効な値は以下のとおりです。PAGE
- ブローカーは、追加のメッセージをディスクにページングします。
DROP
- ブローカーは追加のメッセージを通知せずに破棄します。
FAIL
- ブローカーは、クライアントメッセージプロデューサーに対して追加のメッセージおよび例外をドロップします。
BLOCK
- 追加のメッセージを送信しようとすると、クライアントメッセージプロデューサーがブロックされます。
前述の例に示されて いない 追加のページング設定要素は以下のとおりです。
page-max-cache-size
-
ページングナビゲーション中に IO を最適化するためにブローカーがメモリーに保持するページファイルの数。デフォルト値は
5
です。 page-sync-timeout
-
定期的なページ同期の間隔 ( ナノ秒単位 )。非同期 IO ジャーナルを使用している場合 ( つまり、
journal-type
がbroker.xml
設定ファイルでASYNCIO
に設定されている場合 )、デフォルト値は3333333
です。標準の Java NIO ジャーナルを使用している場合 (journal-type
がNIO
に設定されている場合 )、デフォルト値はjournal-buffer-timeout
パラメーターの設定済みの値です。
前述の例では、my.paged.address
アドレスに送信されたメッセージがメモリーの 104857600 バイトを超えると、ブローカーはページングを開始します。
address-setting
要素で max-size-bytes
を指定すると、一致する 各 アドレスに値が適用されます。この値を指定すると、一致するすべてのアドレスの 合計 サイズが max-size-bytes
の値に制限されるわけでは ありません。
7.1.3. グローバルページングサイズの設定
たとえば、ブローカーで使用パターンが異なるアドレスを多数管理する場合など、アドレスごと のメモリー制限の設定は実用的ではない場合があります。このような状況では、グローバルメモリー制限を指定できます。グローバル制限は、ブローカーがすべてのアドレスに使用できるメモリーの 合計 量です。このメモリー制限に達すると、ブローカーは新しい受信メッセージに関連付けられたアドレスの address-full-policy
に指定されたポリシーを実行します。
以下の手順では、グローバルページングサイズを設定する方法を説明します。
前提条件
- ページングのアドレスの設定方法を理解している必要があります。詳細は、「ページングのアドレスの設定」 を参照してください。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stop
Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にglobal-max-size
要素を追加し、値を指定します。以下に例を示します。<configuration> <core> ... <global-max-size>1GB</global-max-size> ... </core> </configuration>
global-max-size
ブローカーがすべてのアドレスに使用できるメモリーの合計量 ( バイト単位 )。この制限に達すると、受信メッセージに関連付けられたアドレスに対して、ブローカーは
address-full-policy
の値として指定されたポリシーを実行します。global-max-size
のデフォルト値は、ブローカーをホストする Java 仮想マシン (JVM) で利用可能な最大メモリーの半分です。global-max-size
の値はバイト単位ですが、バイト表記にも対応します ( 例 : "K"、"Mb"、"GB")。上記の例では、ブローカーはメッセージの処理時に利用可能な最大 1 ギガバイトのメモリーを使用するように設定されています。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis run
Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
7.1.4. ページング時のディスク使用量の制限
ブローカーが受信メッセージをページングせずにブロックする前に、ブローカーが使用可能な物理ディスク領域の量を制限できます。
以下の手順では、ページング中にディスク使用量の制限を設定する方法を説明します。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stop
Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にmax-disk-usage
設定要素を追加し、値を指定します。以下に例を示します。<configuration> <core> ... <max-disk-usage>50</max-disk-usage> ... </core> </configuration>
max-disk-usage
メッセージのページング時にブローカーが使用できる利用可能なディスク領域の最大パーセンテージ。この制限に達すると、ブローカーはページングではなく受信メッセージをブロックします。デフォルト値は
90
です。上記の例では、ブローカーはメッセージをページングする際にディスク領域の fifty パーセントの使用に制限されます。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis run
Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe start