第7章 アドレスのメモリー制限の設定
AMQ Broker は、ブローカーをホストするマシンが制限されたメモリーで実行されている場合でも、数百万のメッセージが含まれる膨大なキューを透過的にサポートします。
このような状況では、すべてのキューを 1 度にメモリーに保存できない可能性があります。過剰なメモリー消費を防ぐために、ブローカー上の個々のアドレスまたはすべてのアドレスに使用するメモリーを制限できます。さらに、アドレスに対して設定した制限に達したときに、ブローカーが次のいずれかのアクションを実行するように設定できます。
- メッセージをページングする
- メッセージを通知なしで破棄する
- メッセージを破棄し、送信クライアントに通知する
- クライアントからのメッセージ送信をブロックする
アドレスのメモリー制限に達したときにメッセージをページングするようにブローカーを設定する場合は、特定のアドレスに対して次のページング制限を設定できます。
- 受信メッセージのページングに使用されるディスク容量を制限する
- クライアントがメッセージを消費する準備ができたときに、ブローカーがディスクからメモリーに転送するページングされたメッセージに使用されるメモリーを制限します。
また、ディスク使用量のしきい値を設定して、設定されているすべてのページング制限をオーバーライドすることもできます。ディスク使用量のしきい値に達すると、ブローカーはページングを停止し、すべての受信メッセージをブロックします。
トランザクションを使用すると、ブローカーはトランザクションの一貫性を確保するために追加のメモリーを割り当てる可能性があります。この場合、ブローカーによって報告されるメモリー使用量は、メモリーで使用される合計バイト数を反映しない可能性があります。そのため、指定した最大メモリー使用量に基づいてメッセージをページング、破棄、またはブロックするようにブローカーを設定する場合は、トランザクションも使用しないでください。
7.1. メッセージのページングの設定 リンクのコピーリンクがクリップボードにコピーされました!
メモリー制限が設定されているアドレスには、その制限に達したときにブローカーが実行するアクションを指定することもできます。設定可能なオプションの 1 つが ページング です。
ページングオプションを設定すると、制限に達したときに、ブローカーがそのアドレスのメッセージをディスク上の ページファイル に保存し始めます。各ページファイルには設定可能な最大サイズがあります。この方法で設定した各アドレス用に、ページングされたメッセージを格納する専用フォルダーがファイルシステム内に作成されます。
キューのメッセージを検査する際に、キューブラウザーとコンシューマーの両方がページファイルに移動できます。ただし、非常に特殊なフィルターを使用しているコンシューマーは、キュー内の既存のメッセージが最初に消費されるまで、ページファイルに格納されているメッセージを消費できない可能性があります。たとえば、コンシューマーフィルターに "color='red'" などの文字列式が含まれているとします。この条件を満たすメッセージが、プロパティー "color='blue'" を持つ 100 万件のメッセージの後に続いた場合、コンシューマーは "color='blue'" を持つメッセージが最初に消費されるまで、そのメッセージを消費できません。
ブローカーは、クライアントがメッセージを消費する準備ができたときに、メッセージをディスクからメモリーに転送します (ページング解除)。ファイルのすべてのメッセージが確認されると、ブローカーはディスクからページファイルを削除します。
AMQ Broker は、キュー内の保留中のメッセージを JMS メッセージの優先度に従って順序付けます。ただし、ページングされたメッセージには、優先順位はつけられません。順序を保持する場合は、ページングを設定せず、ブローカーのサイズを十分に設定して、すべてのメッセージをメモリー内に保持できるようにします。
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. ページング用のアドレスの設定 リンクのコピーリンクがクリップボードにコピーされました!
アドレスには、さまざまなページングパラメーターを設定できます。次の手順で説明するように、ブローカーがメッセージのページングを開始する前にアドレスが消費できるメモリーの量を制限するように max-size-bytes パラメーターを設定することが重要です。
前提条件
- アドレスおよびアドレス設定の設定方法を理解している。詳細は、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>max-size-bytes-
ブローカーが
address-full-policy属性に指定されたアクションを実行する前に、アドレスに許可されるメモリーの最大サイズ (バイト単位)。デフォルト値は-1で、制限がないことを意味します。指定する値は、"K"、"MB"、および "GB" などのバイト表記もサポートします。
重要max-size-bytesの値は100 MB以下に設定することを強く推奨します。この制限は、ブローカーがメッセージのページングを開始する前に、メモリー内のオブジェクトの数がブローカーの通常の操作に影響を与えないようにするためのものです。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. ページングのグローバルメモリー制限の設定 リンクのコピーリンクがクリップボードにコピーされました!
グローバルメモリー制限を指定できます。これは、ブローカーがメッセージのページングを開始する前に、すべてのアドレスに対して使用できるメモリーの 合計 量です。グローバル制限は、メモリー内のメッセージの合計数に基づいて設定することもできます。
グローバル制限を設定することは推奨しません。グローバル制限を設定すると、ブローカーがメッセージのページングを開始する前に、メモリー内のオブジェクトの数がブローカーの通常の操作に影響を与えるレベルにまで増える可能性があります。グローバルのページング制限を設定せずに、個々のアドレスに制限を設定してください。詳細は、「ページング用のアドレスの設定」 を参照してください。
前提条件
- ページングのアドレスの設定方法を理解している必要があります。詳細は、「ページング用のアドレスの設定」 を参照してください。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stopWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
-
<broker_instance_dir>/etc/broker.xml設定ファイルを開きます。 メモリー使用量に基づいてグローバルページング制限を指定する場合は、ブローカー JVM で使用可能な最大メモリーのパーセンテージまたは絶対値を指定できます。パーセンテージの値を指定すると、JVM メモリーの量が変わっても値を変更せずに済みます。
JVM で使用可能な最大メモリーのパーセンテージでグローバルページング制限を指定するには、
core要素内にglobal-max-size-percent-of-jvm-max-memory要素を追加し、値を指定します。次の例では、メモリー使用量が JVM で使用可能な最大メモリーの 60% に達すると、ブローカーがすべてのアドレスに対するメッセージのページングを開始します。<configuration> <core> ... <global-max-size-percent-of-jvm-max-memory>60</global-max-size-percent-of-jvm-max-memory> ... </core> </configuration>グローバルページング制限を絶対値で指定するには、
core要素内にglobal-max-size要素を追加し、値を指定します。次の例では、メモリー使用量が 1 GB に達すると、ブローカーがすべてのアドレスに対するメッセージのページングを開始します。<configuration> <core> ... <global-max-size>1GB</global-max-size> ... </core> </configuration>global-max-sizeの値はバイト単位ですが、バイト表記にも対応します ( 例 : "K"、"Mb"、"GB")。
メッセージの合計数に基づいてグローバル制限を指定する場合は、
core要素内にglobal-max-messages要素を追加し、値を指定します。次の例では、メモリー内のメッセージ数が 900,000 に達すると、ブローカーがすべてのアドレスに対するメッセージのページングを開始します。<configuration> <core> ... <global-max-messages>900000</global-max-messages> ... </core> </configuration>デフォルト値は -1 です。これはメッセージの上限がないことを意味します。
global-max-size 属性と global-max-messages 属性に制限を設定した場合、いずれかの制限に達すると、ブローカーは address-full-policy 属性に指定されたアクションを実行します。前の例の設定では、メモリー内のメッセージ数が 900,000 を超えるか、使用可能なメモリーが 1 GB 使用されると、ブローカーがすべてのアドレスに対するメッセージのページングを開始します。
+ 注意: 設定したグローバル制限よりも先に、max-size-bytes または max-size-message 属性を使用して個々のアドレスに設定した制限に達した場合、ブローカーはそのアドレスの address-full-policy 属性に指定されたアクションを実行します。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis runWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
7.1.4. 特定のアドレスのページング中のディスク使用量を制限する リンクのコピーリンクがクリップボードにコピーされました!
ブローカーが個々のアドレスまたはアドレスのセットに対する受信メッセージのページングを停止する前に、ブローカーが使用できるディスク領域の量を制限できます。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stopWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
-
<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>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 runWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe start
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>Max-read-page-messagesブローカーがアドレスごとにディスクからメモリーに読み取ることができるページングメッセージの最大数。デフォルト値は -1 で、制限が適用されないことを意味します。Max-read-page-bytesブローカーがアドレスごとにディスクからメモリーに読み取ることができるページングメッセージの最大サイズ (バイト単位)。デフォルト値は 20 MB です。これらの制限を適用すると、ブローカーは、コンシューマーに配信する準備ができているメモリー内のメッセージと、現在配信中のメッセージの両方をカウントします。コンシューマーがメッセージを確認するのが遅い場合、メッセージを配信すると、メモリーまたはメッセージの制限に達し、ブローカーが新しいメッセージをメモリーに読み込めなくなる可能性があります。その結果、ブローカーでメッセージが不足する可能性があります。
コンシューマーがメッセージを確認するのが遅く、現在配信中のメッセージが設定済みの
max-read-page-messagesまたはmax-read-page-bytes制限に達する場合は、現在配信中のメッセージのページングされたメッセージをメモリーに転送する際に適用される別の制限を指定します。以下に例を示します。address-settings> <address-setting match="my.paged.address"> ... <prefetch-page-bytes>20MB</prefetch-page-bytes> <prefetch-page-messages>104857600</prefetch-page-messages> ... </address-setting> </address-settings>prefetch-page-bytesページングされたメッセージをキューごとにメモリーに読み込むために使用できるメモリー (バイト単位)。デフォルト値は 20 MB です。prefetch-page-messagesブローカーがキューごとにディスクからメモリーに読み込むことができるページングされたメッセージの数。デフォルト値は -1 で、制限が適用されないことを意味します。prefetch-page-bytesまたはprefetch-page-messagesパラメーターの制限を指定して、現在配信中のメッセージで使用されるメモリーの量またはメッセージ数を制限する場合は、max-read-page-bytesまたはmax-read-page-messageパラメーターの制限を高く設定して、新しいメッセージをメモリーに読み込むための容量を確保してください。注記prefetch-page-bytes パラメーターの値よりも前に max-read-page-bytes パラメーターの値に達すると、ブローカーはページングされたメッセージをそれ以上メモリーに読み込まなくなります。
7.1.6. ディスク使用量のしきい値の設定 リンクのコピーリンクがクリップボードにコピーされました!
ディスク使用量のしきい値を設定できます。しきい値に達すると、ブローカーはページングを停止し、すべての受信メッセージをブロックします。
手順
ブローカーを停止します。
Linux の場合:
<broker_instance_dir>/bin/artemis stopWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe stop
-
<broker_instance_dir>/etc/broker.xml設定ファイルを開きます。 core要素内にmax-disk-usage設定要素を追加し、値を指定します。以下に例を示します。<configuration> <core> ... <max-disk-usage>80</max-disk-usage> ... </core> </configuration>max-disk-usageブローカーが使用できる利用可能なディスク領域の最大パーセンテージ。この制限に達すると、ブローカーは受信メッセージをブロックします。デフォルト値は
90です。前述の例では、ブローカーは利用可能なディスク領域の 80 パーセントの使用に制限されています。
ブローカーを起動します。
Linux の場合:
<broker_instance_dir>/bin/artemis runWindows の場合:
<broker_instance_dir>\bin\artemis-service.exe start