第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>
<configuration ...> <core ...> ... <paging-directory>/path/to/paging-directory</paging-directory> ... </core> </configuration>
Copy to Clipboard Copied! その後ページング用に設定するアドレスごとに、ブローカーは指定したページングディレクトリーに専用のディレクトリーを追加します。
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> <max-size-messages>20000</max-size-messages> <page-size-bytes>10485760</page-size-bytes> <address-full-policy>PAGE</address-full-policy> ... </address-setting> </address-settings>
<address-settings> <address-setting match="my.paged.address"> ... <max-size-bytes>104857600</max-size-bytes> <max-size-messages>20000</max-size-messages> <page-size-bytes>10485760</page-size-bytes> <address-full-policy>PAGE</address-full-policy> ... </address-setting> </address-settings>
Copy to Clipboard Copied! max-size-bytes
-
ブローカーが
address-full-policy
属性に指定されたアクションを実行する前に、アドレスに許可されるメモリーの最大サイズ (バイト単位)。デフォルト値は-1
で、制限がないことを意味します。指定する値は、K、MB、GB などのバイト表記もサポートします。 max-size-messages
-
ブローカーが
address-full-policy
属性に指定されたアクションを実行する前に、アドレスに許可されるメッセージの最大数。デフォルト値は -1 で、メッセージ制限がないことを意味します。 page-size-bytes
-
ページングシステムで使用される各ページファイルのサイズ ( バイト単位 )。デフォルト値は
10485760
( つまり 10 MiB ) です。指定する値は、K、MB、GB などのバイト表記もサポートします。 address-full-policy
アドレスの最大サイズに達したときにブローカーが実行するアクション。デフォルト値は
PAGE
です。有効な値は以下のとおりです。PAGE
- ブローカーは、追加のメッセージをディスクにページングします。
DROP
- ブローカーは追加のメッセージを通知せずに破棄します。
FAIL
- ブローカーは、クライアントメッセージプロデューサーに対して追加のメッセージおよび例外をドロップします。
BLOCK
- 追加のメッセージを送信しようとすると、クライアントメッセージプロデューサーがブロックされます。
max-size-bytes
属性とmax-size-message
属性に制限を設定した場合、いずれかの制限に達すると、ブローカーはaddress-full-policy
属性に指定されたアクションを実行します。前の例の設定では、メモリー内のアドレスのメッセージの合計が 20,000 を超えるか、使用可能なメモリーを 104857600 バイト使用すると、ブローカーはmy.paged.address
アドレスのメッセージのページングを開始します。前述の例に示されて いない 追加のページング設定要素は以下のとおりです。
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
<broker_instance_dir>/bin/artemis stop
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
<broker_instance_dir>\bin\artemis-service.exe stop
Copy to Clipboard Copied!
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にglobal-max-size
要素を追加し、値を指定します。以下に例を示します。<configuration> <core> ... <global-max-size>1GB</global-max-size> <global-max-messages>900000</global-max-messages> ... </core> </configuration>
<configuration> <core> ... <global-max-size>1GB</global-max-size> <global-max-messages>900000</global-max-messages> ... </core> </configuration>
Copy to Clipboard Copied! global-max-size
ブローカーがすべてのアドレスに使用できるメモリーの合計量 ( バイト単位 )。この制限に達すると、ブローカーは各受信メッセージに関連付けられたアドレスの
address-full-policy
属性に指定されたアクションを実行します。global-max-size
のデフォルト値は、ブローカーをホストする Java 仮想マシン (JVM) で利用可能な最大メモリーの半分です。global-max-size
の値はバイト単位ですが、バイト表記にも対応します ( 例 : "K"、"Mb"、"GB")。上記の例では、ブローカーはメッセージの処理時に利用可能な最大 1 ギガバイトのメモリーを使用するように設定されています。
global-max-messages
すべてのアドレスに許可されるメッセージの合計数。この制限に達すると、ブローカーは各受信メッセージに関連付けられたアドレスの
address-full-policy
属性に指定されたアクションを実行します。デフォルト値は -1 で、メッセージ制限がないことを意味します。global-max-size
属性とglobal-max-messages
属性に制限を設定した場合、いずれかの制限に達すると、ブローカーはaddress-full-policy
属性に指定されたアクションを実行します。前の例の設定では、メモリー内のメッセージ数が 900,000 を超えるか、使用可能なメモリーが 1 GB を使用すると、ブローカはすべてのアドレスに対してメッセージのページングを開始します。注記max-size-bytes
属性またはmax-size-message
属性を使用して個々のアドレスに設定された制限が、global-max-size
属性またはglobal-max-messages
属性に設定された制限よりも先に達した場合、ブローカーはそのアドレスのaddress-full-policy
属性に指定されたアクションを実行します。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis run
<broker_instance_dir>/bin/artemis run
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
<broker_instance_dir>\bin\artemis-service.exe start
Copy to Clipboard Copied!
7.1.4. 特定のアドレスのページング中のディスク使用量を制限する
ブローカーが個々のアドレスまたはアドレスのセットに対する受信メッセージのページングを停止する前に、ブローカーが使用できるディスク領域の量を制限できます。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stop
<broker_instance_dir>/bin/artemis stop
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
<broker_instance_dir>\bin\artemis-service.exe stop
Copy to Clipboard Copied!
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内に属性を追加して、ディスク使用量またはメッセージ数、あるいはその両方に基づいてページング制限を指定し、いずれかの制限に達した場合に実行するアクションを指定します。以下に例を示します。<address-settings> <address-setting match="match="my.paged.address""> ... <page-limit-bytes>10G</page-limit-bytes> <page-limit-messages>1000000</page-limit-messages> <page-full-policy>FAIL</page-full-policy> ... </address-setting> </address-settings>
<address-settings> <address-setting match="match="my.paged.address""> ... <page-limit-bytes>10G</page-limit-bytes> <page-limit-messages>1000000</page-limit-messages> <page-full-policy>FAIL</page-full-policy> ... </address-setting> </address-settings>
Copy to Clipboard Copied! page-limit-bytes
-
ブローカーが
page-full-policy
属性に指定されたアクションを実行する前に、アドレスの受信メッセージをページングするために許可されるディスク領域の最大サイズ (バイト単位)。指定する値は、K、MB、GB などのバイト表記をサポートしています。デフォルト値は -1 で、制限がないことを意味します。 page-limit-messages
-
ブローカーが
page-full-policy
属性に指定されたアクションを実行する前に、アドレスに対してページングできる受信メッセージの最大数。デフォルト値は -1 で、メッセージ制限がないことを意味します。 page-full-policy
アドレスが
page-limit-bytes
属性またはpage-limit-messages
属性で設定された制限に達したときにブローカーが実行するアクション。有効な値は以下のとおりです。DROP ブローカーは、それ以降のメッセージをサイレントにドロップします。
FAIL ブローカーはそれ以上のメッセージを削除し、送信側クライアントに通知します。
前述の例では、ページングで 10GB のディスク領域が使用されるか、合計 100 万個のメッセージがページングされるまで、ブローカーは
my.paged.address
アドレスのメッセージをページングします。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis run
<broker_instance_dir>/bin/artemis run
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
<broker_instance_dir>\bin\artemis-service.exe start
Copy to Clipboard Copied!
7.1.5. ページングされたメッセージのメモリーへのフローの制御
AMQ Broker がメッセージをディスクにページングするように設定されている場合、ブローカーはページングされたメッセージを読み取り、クライアントがメッセージを消費する準備ができたときにメッセージをメモリーに転送します。メッセージが過剰なメモリーを消費しないように、ブローカーがディスクからメモリーに転送するメッセージの各アドレスで使用されるメモリーを制限できます。
クライアントアプリケーションが、完了通知待ちのメッセージをあまりにも多く残す場合、ブローカーは保留中のメッセージが承認されるまでページングされたメッセージを読み取らないため、ブローカー上でメッセージ枯渇が発生する可能性があります。
たとえば、ページングされたメッセージのメモリーへの転送の制限 (デフォルトでは 20MB) に達すると、ブローカーはそれ以上のメッセージを読み取る前にクライアントからの確認応答を待ちます。同時に、クライアントがブローカーに確認応答を送信する前に十分なメッセージの受信を待機している場合 (クライアントが使用するバッチサイズによって決まります)、ブローカーはメッセージが不足します。
枯渇を回避するには、メモリーへのページングメッセージの転送を制御するブローカーの制限を増やすか、配信メッセージの数を減らします。クライアントがメッセージ確認応答をより早くコミットするか、タイムアウトを使用してブローカーからメッセージを受信しなくなったときに確認応答をコミットするようにすることで、配信メッセージの数を減らすことができます。
配信メッセージの数とサイズは、AMQ 管理コンソールのキューの Delivering Count
メトリクスと Delivering Bytes
メトリクスで確認できます。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
一致するアドレスまたはアドレスのセットに対して設定した
address-settings
要素については、ページングされたメッセージのメモリーへの転送に対する制限を指定します。以下に例を示します。
address-settings> <address-setting match="my.paged.address"> ... <max-read-page-messages>104857600</max-read-page-messages> <max-read-page-bytes>20MB</max-read-page-bytes> ... </address-setting> </address-settings>
address-settings>
<address-setting match="my.paged.address">
...
<max-read-page-messages>104857600</max-read-page-messages>
<max-read-page-bytes>20MB</max-read-page-bytes>
...
</address-setting>
</address-settings>
Max-read-page-messages
ブローカーがアドレスごとにディスクからメモリーに読み取ることができるページングメッセージの最大数。デフォルト値は -1 で、制限が適用されないことを意味します。
Max-read-page-bytes
ブローカーがアドレスごとにディスクからメモリーに読み取ることができるページングメッセージの最大サイズ (バイト単位)。デフォルト値は 20MB です。
max-read-page-messages
属性と max-read-page-bytes
属性の両方に制限を指定した場合、いずれかの制限に達すると、ブローカーはメッセージの読み取りを停止します。
7.1.6. ディスク使用量のしきい値の設定
ディスク使用量のしきい値を設定できます。しきい値に達すると、ブローカーはページングを停止し、すべての受信メッセージをブロックします。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stop
<broker_instance_dir>/bin/artemis stop
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
<broker_instance_dir>\bin\artemis-service.exe stop
Copy to Clipboard Copied!
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 core
要素内にmax-disk-usage
設定要素を追加し、値を指定します。以下に例を示します。<configuration> <core> ... <max-disk-usage>80</max-disk-usage> ... </core> </configuration>
<configuration> <core> ... <max-disk-usage>80</max-disk-usage> ... </core> </configuration>
Copy to Clipboard Copied! max-disk-usage
ブローカーが使用できる利用可能なディスク領域の最大パーセンテージ。この制限に達すると、ブローカーは受信メッセージをブロックします。デフォルト値は
90
です。前述の例では、ブローカーは利用可能なディスク領域の 80 パーセントの使用に制限されています。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis run
<broker_instance_dir>/bin/artemis run
Copy to Clipboard Copied! Windows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
<broker_instance_dir>\bin\artemis-service.exe start
Copy to Clipboard Copied!