5

NserviceBusを使用する2つのWindowsサービスがあります。1つはキューにメッセージを書き込み、もう1つはキューから読み取り、何らかの処理を行います。すべてのキューはトランザクションであり、NserviceBusエンドポイントは次のように構成されています。

.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadCommitted)
.MsmqTransport()
.RunTimeoutManager()
.UseInMemoryTimeoutPersister()
.MsmqSubscriptionStorage()
.DisableRavenInstall()
.JsonSerializer()

問題は、大量のメッセージ(170,000以上)がキューに入れられ、MSMQサービス(mqsvc.exe)がかなりのメモリ(1.5〜2.0 GB)を消費し、そのメモリが少なくとも5〜6の間解放されない場合です。時間。平均メッセージサイズは約5〜10KBです。また、キューに入れるメッセージが多いほど、使用するメモリも増えるようです。NServiceBusベースのWindowsサービスのメモリ消費量は完全に許容範囲内(50〜100 MB)であり、処理するメッセージの数に関係なく増加しません。

MSMQがこれだけのメモリを使用し、リリースにかなりの時間がかかる理由についてのアイデアはありますか?ヒープに感謝します。

4

2 に答える 2

8

これは完全に正常です。MSMQは、ストレージフォルダ内のファイルにマップされる4MBのメモリブロック内のストレージを使用します。それぞれ5〜10kbで170,000メッセージは0.85〜1.7 GBであるため、非常に多くの仮想メモリが割り当てられているのを目にするのは当然です。メッセージが削除または到着したときにファイルを削除および作成するオーバーヘッドを削減するために、ストレージファイルは6時間保持されます。この期間の後、空のファイルは削除されます。私のブログ投稿で説明されているように、これを構成できます。

MSMQにストレージファイルのクリーンアップを強制する

于 2012-11-20T00:00:20.523 に答える
1

オフチャンスでは、それは誰にでも役立ちます-msmqの伝説によるグーグルグループへのこの投稿ジョンブレイクウェルは、ストレージ内のすべてのメッセージを実際に完全にクリーンアップする方法を文書化しています。

https://groups.google.com/d/msg/microsoft.public.msmq.performance/jByfXUwXFw8/i1hVP1WJpJgJ

8GBのファイルがありましたが、どのキューにもメッセージがありませんでした。msmqサービスは、開始状態に入るだけで約2時間かかります。キューを削除するには数十分かかり、大量のメモリスパイクが発生しますが、それが数日間解放されることはありませんでした。

このような状況になっている場合は、メッセージキューを再インストールするのではなく、次の手順に従うだけです。

  1. メッセージキューサービスを停止します
  2. MSMQの保存場所(通常はC:\ Windows \ System32 \ msmq \ storage)に移動します
  3. P * .MQ、J * .MQ、R * .MQ、およびL*.MQファイルのみを削除します
于 2013-05-16T15:02:17.417 に答える