この文章は、Microsoft Message Queuing 2.0 (MSMQ 2.0) でメッセージを格納するために使用されているRAMの量が割り当てられたメモリを超えた場合に発生する問題を解決するための支援を提供します。
オリジナル製品バージョン: Microsoft Message Queuing
元の KB 番号: 899613
症状
キューにメッセージを送信すると、MSMQはそのメッセージを受け付けません。 代わりに、MSMQはリソース不足エラーメッセージを生成します。 MSMQ 2.0を使用してメッセージを送信するアプリケーションで、このエラーメッセージを受け取ります。
問題が発生すると、次の情報が .NET Framework サービスまたはアプリケーションのスタックトレースに表示されることがあります。
例外の種類: System.Messaging.MessageQueueException
メッセージキューエラーコード: リソース不足
メッセージ: 操作を実行するのに十分なリソースがありません。
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
ソース: System.Messaging
さらに、上記のメッセージはアプリケーションログに記録されています。 COM+ キュー コンポーネント (QC) アプリケーションでは、上記のメッセージがアプリケーション ログに記録されることがあります。 次の条件が当てはまる場合、この問題が発生します。
あなたはMSMQでメッセージを送信しようとしています。
サービスの実行とメッセージの保存に現在使用されている割り当てメモリが2ギガバイト(GB)に達しました。 既定では、Windows 2000 はプロセスに 2 GB のアドレス可能なメモリを割り当てます。
MSMQサービスがロードされると、MSMQ 2.0がメッセージを保存するために使用できるデフォルトの割り当てメモリの量は1.6 GBから1.8 GBの間です。
注記
3GBスイッチを使用すると、割り当てられるメモリは2GBから2.5GBの間になります。
メッセージストレージファイルはメモリマップファイルです。 したがって、MSMQ ストレージフォルダのサイズを確認することで、制限が超えたかどうかを確認できます。 このフォルダーは通常、
%WinDir%\System32\MSMQ
ストレージフォルダーにあります。 ストレージフォルダーは、別の場所に設定することができます。 別の場所にストレージフォルダーが設定されているかどうかを確認するには、コントロールパネル内の MSMQ ツールの ストレージ タブにある メッセージファイルフォルダー フィールドを確認してください。
原因
この問題は、次の理由の1つ以上によって発生します。
キューに届くメッセージを読み取り処理するアプリケーションが困難を経験しています。 しかし、メッセージは、アプリケーションがメッセージを読み取って処理できる速度よりも速い速度でキューに届き続けています。
キューでジャーナリングが有効になっています。 しかし、メッセージを蓄積させる原因となるデータは削除されていません。
キュー内でデッドレタリングが有効になっています。 さらに、デッドレター化されたメッセージを保存するために利用可能な割り当てメモリの容量が到達またはその限界を超えました。
宛先キューが利用できないため、発信キューにメッセージが蓄積されています。
解決策
あなたがこの問題を解決するために使用する方法は、MSMQサービスの現在の状態によって異なります。 この問題を解決する前に、キューに書き込みを行っているサービスやアプリケーションを停止する必要があります。
MSMQが実行中の場合
どのキューにメッセージが蓄積されているかを特定してください。 これを行うには、次の方法のいずれかを使用してください。
MSMQインターフェースを使用して、手動でキューを確認します。 MSMQインターフェースは、「コンピューター管理」コンソールにあります。
パフォーマンス モニタで、MSMQ QUEUE パフォーマンス オブジェクトにあるすべてのカウンタを設定します。 次に、レポートビューを選択します。 レポートビューでは、各キューのメッセージ数を確認できます。
キューにメッセージが蓄積していることを確認した後、そのメッセージがなぜ蓄積したのかを特定する必要があります。 メッセージがキューにたまる可能性のある理由はいくつかあります。 これらの理由には以下が含まれます:
送信メッセージキューにあるメッセージは、目的地に到達できません。 メッセージが目的地に届かない場合は、目的地のコンピューターがメッセージを受信できる状態になっていることを確認してください。 これらのメッセージが古くなっているか、価値がない場合は、キューをクリアしてください。
メッセージを受信するはずのアプリケーションが停止しているか、エラー状態に入っています。 これらの条件のいずれかが真である場合、そのアプリケーションで問題を解決してください。
デッドレタキューまたはジャーナルキュー内のメッセージが保持されています。 これらのメッセージは削除または処理されていません。 これらのメッセージが保持されている場合、なぜそれらが保持されているのかを確認してください。 メッセージをジャーナリングするオプションは、テストによく使用されます。
テストが完了した後、このオプションが意図せず有効のままになることがあります。 メッセージがデッドレターにされた場合、それらのメッセージは指定された時間内に処理または配信されていないことを意味します。 デッドレタリングまたはジャーナリングがオンになっている場合、プロセスはキューからこれらのメッセージを読み取る必要があります。 メッセージがたまっているキューを特定したら、そのたまったメッセージを削除できます。
MSMQが実行されておらず、手動で開始することができない場合は
注記
MSMQストレージフォルダー内のファイルに変更を加える前に、MQbkup.exeを使用して現在のMSMQ環境をバックアップすることをお勧めします。 この手順は、プロダクトサポートサービスの助けが必要な場合に非常に重要です。
MSMQが不安定な状態に入っているため、すべてのメッセージを回復できないことがあります。 データが非常に重要で、以下の手順を使用してメッセージを復元する際に困難を感じた場合は、製品サポートサービスに連絡して支援を求めてください。
MSMQの構成をMQbkup.exeを使ってバックアップするには、次のステップに従ってください。
注記
MQbkup.exe を実行する前に、MSMQ ファイルをバックアップするフォルダを選択してください。 フォルダーは、空き容量が少なくとも2.5GBあるディスク上に配置する必要があります。
コマンドプロンプトウィンドウを開く。
ディレクトリを
%WinDir%\System32
に変更してください。コマンドを実行してください
MQbkup.exe -b Drive :\ Folder to Put Backup Files
MSMQファイルをバックアップしたフォルダーの場所を確認してください。
サーバーを3GBスイッチを使用して起動します。
注記
3GBスイッチは、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 の間に増加します。
警告
この設定は、サーバー上の他のリソースに影響を与える可能性があります。 問題のトラブルシューティングが完了したら、3GBスイッチを削除することをお勧めします。 この設定は、問題を永久に解決することを意図したものではありません。 ただし、この構成を使用してMSMQにアクセスすることで、MSMQが実行中の場合のセクションの手順を実行できます。
詳細については、3-GBスイッチを使用してWindowsを構成する方法について、Windows 2000ヘルプファイルの「アプリケーションのメモリチューニングサポートの有効化」トピックをご参照ください。
メッセージを手動で復元するには
注記
- MSMQ が実行されていない場合にのみ、以下の手順に従ってください。
- MSMQが不安定な状態にあり、起動しないため、すべてのメッセージを回復できないかもしれません。
警告
このプロセスによって、アプリケーションがトランザクションメッセージを元の到着順とは異なる順序で受信する可能性があります。
メッセージ保存ファイルを格納するための一時フォルダーを作成してください。 このフォルダを MSMQ フォルダに入れないでください。
.mq ファイル拡張子が付いているファイルのみを選択してください。
警告
MSMQストレージフォルダーにあるいくつかのファイルは、MSMQが正しく動作するために重要です。 ファイル名拡張子が.mqのファイルのみを選択するようにしてください。
ステップ1で作成したフォルダーに選択したファイルを移動します。
MSMQデータアクセスドライバが起動していないことを確認してください。 この作業を行うには、コマンドプロンプトで次のコマンドを実行します。
Net Stop MQAC /y
MSMQサービスを開始してください。 これを行うには、コマンドプロンプトで次のコマンドを実行してください。
Net Start MSMQ
注記
メッセージのデータが重要でない場合、MSMQを再びオンラインにするだけで良いのであれば、ここで作業を止めることができます。
サービスが開始されることを確認したら、サービスを停止します。 これを行うには、コマンドプロンプトで次のコマンドを実行してください。
Net Stop MQAC /y
このコマンドは MSMQ サービスとデータアクセスドライバーの両方を停止します。
手順5でメッセージ保存ファイルを移動したフォルダー内で、一部のファイル名がp数字.mq形式であり、他のファイル名がl数字.mq形式であることに注目してください。 これらのファイルはペアとして保存されています。 各pファイルには対応するlファイルがあります。
ファイルが変更された日付を確認してください。 最も古いpファイルとそれに対応するlファイルを選択します。 元の MSMQ ストレージフォルダにこれらのファイルを移動してください。
ステップ5のコマンドを実行して、MSMQサービスを開始します。 サービスが開始した場合、MSMQ が実行中の場合 セクションの手順に従い、どのキューでメッセージが蓄積しているかを確認し、メッセージの対処方法を決定してください。
次に、キューから蓄積されたメッセージを削除した後、すべてのメッセージファイルを MSMQ ストレージフォルダに戻し、キューから蓄積されたメッセージをすべて削除するまで、手順6から8を繰り返してください。
注記
同時に 1.6 GB を超えるデータを MSMQ ストレージ フォルダーに戻さないでください。 次の操作を行うと、サービスが開始されない可能性があります。
問題を再現する手順
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 に減少します。
しかし、追加で割り当てられたメモリは、カーネルから約1GBの割り当てられたメモリも利用します。 この動作はシステムのパフォーマンスに影響を与える可能性があり、ファイルの入出力を行うアプリケーションにも影響を与える可能性があります。
MSMQ 2.0で利用可能な割り当てメモリの量を増やすためだけに3GBスイッチを使用することはお勧めしません。 代わりに、症状セクションで述べられている問題を防ぐために、コンピュータのクォータを設定することをお勧めします。
詳細については、Microsoft メッセージ キューでコンピュータのクォータとキューのクォータを設定する方法をご覧ください。