メッセージ キュー 2.0 にメッセージを格納するために使用される RAM が割り当てられたメモリを超えたときにエラーが発生する

この記事では、Microsoft Message Queuing 2.0 (MSMQ 2.0) にメッセージを格納するために使用されている RAM の量が割り当てられたメモリを超えたときに発生する問題を解決するためのヘルプを提供します。

元の製品バージョン: Microsoft メッセージ キュー
元の KB 番号: 899613

現象

メッセージをキューに送信すると、MSMQ は送信するメッセージを受け入れません。 代わりに、MSMQ によって リソース 不足のエラー メッセージが生成されます。 MSMQ 2.0 を使用してメッセージを送信しているアプリケーションで、このエラー メッセージが表示されます。

この問題が発生すると、.NET Framework サービスまたはアプリケーションのスタック トレースに次の情報が表示されることがあります。

例外の種類: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
メッセージ: 操作を実行するためのリソースが不足しています。
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
ソース: System.Messaging

さらに、上記のメッセージはアプリケーション ログに記録されます。 COM+ Queued Component (QC) アプリケーションでは、上記のメッセージがアプリケーション ログに記録される可能性があります。 この問題は、次の条件に該当する場合に発生します。

  • MSMQ でメッセージを送信しようとするとします。

  • サービスの実行とメッセージの格納に現在使用されている割り当てられたメモリは、2 ギガバイト (GB) に達しました。 既定では、Windows 2000 は 2 GB のアドレス指定可能メモリをプロセスに割り当てます。

    MSMQ サービスが読み込まれた後、メッセージを格納するために MSMQ 2.0 で使用できる割り当て済みメモリの既定の量は、1.6 GB から 1.8 GB です。

    注:

    3 GB スイッチを使用する場合、割り当てられたメモリは 2 GB から 2.5 GB の間になります。

    メッセージ ストレージ ファイルは、メモリ マップファイルです。 そのため、MSMQ Storage フォルダーのサイズを確認することで、制限を超えているかどうかを確認できます。 通常、このフォルダーは Storage フォルダーにあります %WinDir%\System32\MSMQ 。 ただし、ストレージ フォルダーは別の場所用に構成できます。 ストレージ フォルダーが別の場所用に構成されているかどうかを確認するには、コントロール パネルの MSMQ ツールの [ストレージ] タブの [メッセージ ファイル フォルダー] フィールドを確認します。

原因

この問題は、次の 1 つ以上の理由で発生します。

  • キューに到着したメッセージを読み取って処理するアプリケーションで、問題が発生しています。 ただし、メッセージは、アプリケーションがメッセージを読み取って処理できる速度よりも速い速度でキューに到着し続けます。

  • ジャーナリングはキューで有効になっています。 ただし、メッセージの累積を引き起こすデータは削除されていません。

  • 配信不能はキューで有効になっています。 さらに、配信不能メッセージを格納するために使用できる割り当て済みメモリの量に達したか、超過しました。

  • 宛先キューが使用できないため、メッセージが送信キューに蓄積されました。

解決方法

この問題を解決するために使用する方法は、MSMQ サービスの現在の状態によって異なります。 この問題を解決するには、キューに書き込むサービスまたはアプリケーションを停止する必要があります。

MSMQ が実行されている場合

メッセージが蓄積されているキューを決定します。 これを行うには、次のいずれかの方法を使用します。

  • MSMQ インターフェイスを使用してキューを手動で調べます。 MSMQ インターフェイスは、コンピューター管理コンソールにあります。

  • パフォーマンス モニターで、MSMQ QUEUE パフォーマンス オブジェクトのすべてのカウンターを設定します。 次に、[ レポート ビュー] を選択します。 レポート ビューでは、各キュー内のメッセージの数を確認できます。

メッセージが累積されたキューを判別したら、メッセージが累積された理由を判別する必要があります。 メッセージがキューに蓄積される理由はいくつかあります。 これらの理由には、次のものが含まれます。

  • 送信メッセージ キュー内のメッセージは、宛先に到達できません。 メッセージが宛先に到達できない場合は、宛先コンピューターがメッセージの受信に使用できることを確認します。 これらのメッセージが古い場合、または値がない場合は、キューをクリアします。

  • メッセージを受信する必要があるアプリケーションが停止しているか、エラー条件に入っています。 これらの条件のいずれかが true の場合は、そのアプリケーションの問題を解決します。

  • 配信不能キューまたはジャーナル キュー内のメッセージは保持されています。 これらのメッセージは削除または処理されていません。 これらのメッセージが保持されている場合は、これらのメッセージを保持する目的を決定します。 メッセージをジャーナル処理するオプションは、テストに頻繁に使用されます。

テストが完了すると、このオプションが意図せずに有効になっている可能性があります。 メッセージが配信不能の場合、メッセージは指定した時間内に処理または配信されていません。 デッドレタリングまたはジャーナリングがオンになっている場合、プロセスはキューからこれらのメッセージを読み取る必要があります。 メッセージが蓄積されたキューを特定したら、累積されたメッセージを削除できます。

MSMQ が実行されておらず、手動で起動できない場合

注:

  • MSMQ Storage フォルダー内のファイルに変更を加える前に、MQbkup.exe を使用して現在の MSMQ 環境をバックアップすることをお勧めします。 この手順は、製品サポート サービスのヘルプが必要な場合に非常に重要です。

  • MSMQ が不安定な状態になったため、すべてのメッセージを回復できない場合があります。 次の手順を使用してメッセージを復元する際に問題が発生し、データが非常に重要な場合は、製品サポート サービスにお問い合わせください。

MQbkup.exe を使用して MSMQ 構成をバックアップするには、次の手順に従います。

注:

MQbkup.exe を実行する前に、MSMQ ファイルをバックアップするフォルダーを選択します。 このフォルダーは、2.5 GB 以上の空き領域を持つディスク上に配置する必要があります。

  1. コマンド プロンプト ウィンドウを開きます。

  2. ディレクトリを に %WinDir%\System32変更します。

  3. 次のコマンドを実行します。

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. MSMQ ファイルをバックアップしたフォルダーの場所をメモします。

3 GB スイッチを使用してサーバーを起動する

注:

3 GB スイッチは、Windows 2000 Advanced Server のオプションにすぎません。 Windows 2000 Server および Windows 2000 Professional の場合は、[ メッセージを手動で回復するには ] セクションに移動します。

既定では、Windows 2000 は各プロセスに 2 GB のアドレス指定可能メモリを割り当てます。 この問題は、MSMQ で全体の割り当てが使用されるために発生します。 この動作により、サービスが正しく再起動できなくなります。 3 GB スイッチを使用する場合、Windows 2000 Advanced Server は各プロセスに 3 GB のアドレス指定可能メモリを割り当てます。 この構成により、サーバーを再起動した後にサービスとメッセージ ストレージ ファイルを読み込むための十分なアドレス指定可能なメモリが MSMQ に提供されます。 このスイッチにより、MSMQ ストレージが 2 GB から 2.5 GB に増加します。

警告

この構成は、サーバー上の他のリソースに影響する可能性があります。 トラブルシューティングが完了したら、3 GB スイッチを削除することをお勧めします。 この構成は、問題を完全に解決するためのものではありません。 ただし、この構成を使用して MSMQ にアクセスして、「 MSMQ が実行されている場合 」セクションの手順を実行できます。

3 GB スイッチを使用して実行するように Windows を構成する方法の詳細については、Windows 2000 ヘルプ ファイル の「アプリケーションでのアプリケーション メモリ チューニング サポートの有効化 」トピックを参照してください。

メッセージを手動で回復するには

注:

  • MSMQ が実行されていない状態の場合にのみ、次の手順に従います。
  • MSMQ は不安定な状態にあり、起動しないため、すべてのメッセージを回復できない場合があります。

警告

このプロセスにより、アプリケーションは、メッセージが最初に到着した順序とは異なる順序でトランザクション メッセージを受信する可能性があります。

  1. メッセージ ストレージ ファイルを保持する一時フォルダーを作成します。 このフォルダーを MSMQ フォルダーに配置しないでください。

  2. .mq ファイル名拡張子を持つファイルのみを選択します。

    警告

    MSMQ Storage フォルダーにある一部のファイルは、MSMQ を正しく実行するために重要です。 .mq ファイル名拡張子を持つファイルのみを選択してください。

  3. 手順 1 で作成したフォルダーに、選択したファイルを移動します。

  4. MSMQ データ アクセス ドライバーが開始されていないことを確認します。 これを行うには、コマンド プロンプトで次のコマンドを実行します。

    Net Stop MQAC /y
    
  5. MSMQ サービスを開始します。 これを行うには、コマンド プロンプトで次のコマンドを実行します。

    Net Start MSMQ
    

    注:

    メッセージ内のデータが重要ではなく、MSMQ をオンラインに戻すだけの場合は、ここで停止できます。

  6. サービスが開始されることを確認したら、サービスを停止します。 これを行うには、コマンド プロンプトで次のコマンドを実行します。

    Net Stop MQAC /y
    

    このコマンドは、MSMQ サービスとデータ アクセス ドライバーの両方を停止します。

  7. 手順 5 でメッセージ ストレージ ファイルを移動したフォルダーで、一部のファイル名に pNumber.mq 形式があり、一部のファイル名に lNumber.mq 形式があることに注意してください。 これらのファイルはペアとして格納されます。 各 p ファイルには、対応する l ファイルがあります。

    ファイルが変更された日付に注目してください。 最も古い p ファイルと対応する l ファイルを選択します。 これらのファイルを元の MSMQ Storage フォルダーに移動します。

  8. 手順 5. のコマンドを実行して、MSMQ サービスを開始します。 サービスが開始される場合 は、「MSMQ が実行されている場合 」セクションの手順に従って、メッセージが蓄積されているキューとメッセージの処理方法を確認します。

  9. キューから累積メッセージを削除した後、すべてのメッセージ ファイルを MSMQ Storage フォルダーに返し、キューからすべての累積メッセージを削除するまで、手順 6 から 8 を繰り返します。

    注:

    1.6 GB を超えるデータを同時に MSMQ Storage フォルダーに戻さないでください。 これを行うと、サービスが開始されない可能性があります。

問題の再現手順

Windows 2000 Server を実行しているコンピューターで、メッセージの送信に使用しているアプリケーションが 0x00e0027 例外エラーを受け取るまで、ローカル キューにメッセージを送信します。

MSMQ 2.0 では、メモリ マップファイルにメッセージが格納されます。 Windows 2000 Server を実行しているコンピューターでは、MSMQ 2.0 で使用できる割り当て済みメモリの既定の量は 2 GB です。 MSMQ 2.0 のコンポーネントがコンピューターに読み込まれた後、MSMQ 2.0 で使用できる割り当てられたメモリの量は、約 1.6 GB から 1.8 GB の間に削減されます。

Boot.ini ファイルで 3 GB スイッチを有効にすると、MSMQ 2.0 で使用できる割り当て済みメモリの量が 3 GB に増加します。 MSMQ 2.0 のコンポーネントがコンピューターに読み込まれた後、MSMQ 2.0 で使用できる割り当てられたメモリの量は 2.7 GB に減ります。

ただし、追加の割り当てメモリも、カーネルから約 1 GB の割り当てメモリを受け取ります。 この動作は、システム のパフォーマンスに影響を与える可能性があり、ファイル I/O を実行するアプリケーションに影響を与える可能性があります。

MSMQ 2.0 で使用できる割り当て済みメモリの量を増やすためだけに、3 GB スイッチを使用することはお勧めしません。 代わりに、「 現象 」セクションに記載されている問題を回避するために、コンピューター クォータを設定することをお勧めします。

詳細については、「 Microsoft Message Queueing でコンピューター クォータとキュー クォータを設定する方法」を参照してください。