2012-04-06 15 views
2

我々は、特定のWebサービスにサイズ "1 MB"の大量HTTP要求を送信するStress Testアプリケーションを設計しています。ストレスを解消するために、アプリケーションで複数のスレッドを使用しています。構造は、HTTP EnquueThreadsがHTTPRequestデータを作成し、キューに追加するようなものです。 Y WorkerThreadsは要求をデキューし、Webサービスに提出します。 すべてのリクエストは同期式です。 ここで問題となるのは、エンキュースレッドがWorkerThreadsよりもはるかに高速に動作するため、停止/待機条件がない場合、メモリ不足例外がスローされ、インジェクタが実行されるまでリクエストを追加します) スロー。 現在、私たちはOutOfMemory例外を処理しており、しばらくの間、enqueuethreadsをスリープ状態にしています。私が考えることができる別の方法は、キューのサイズを制限することです。アプリケーションのメモリ不足を回避する最良の方法

しかし、限定されたシステムリソース(特にメモリ)を使用するには、どのようなアプローチが最適であるべきかについて知りたいと思います。 ありがとうございます。

答えて

2

質問のトピックによれば、メモリ例外を回避する最良の方法は、そのメモリを埋めるオブジェクトを作成しないことです。

例外を処理するのが最も簡単な解決策ですが、時間の経過とともにアプリケーションにさまざまな困難や不一致が生じることがあります。そして、あなたは一つのオブジェクトのメモリ容量の推定値に基づいて、あなたのキューの長さを計算することができます

Process currentProcess = Process.GetCurrentProcess(); 
long memorySize = currentProcess.PrivateMemorySize64 

:もう一つの方法は、このようなメモリリソースの利用可能サイズを取得することでしょう。

もう1つの方法は、各ワーカースレッドのメモリサイズを確認することです。メモリがないときはいつでも、スレッドはただ完了することができます。この方法では、多くのスレッドが生成されて死にますが、アプリケーションは最大限の利用可能な状態になります。

+0

@Dimitry Renzik:返信いただきありがとうございます。アプリで現在占有されているメモリに基づいてキューのサイズを制限することを検討しています。 – Tejas

+0

あなたは大歓迎です:) –

3

このようなシナリオではMemoryFailPoint classを使用できますが、おそらくこれを使用する必要があります。

OutOfMemoryExceptionが表示された場合、アプリケーションの状態が壊れている可能性があります。その状態から回復しようとしないでください。 MemoryFailPointは、メモリを使い切らないようにアプリケーションをどれだけ遅くするかを判断できるようにすることで、これを回避するように設計されています。フレームワークに、操作を実行できるかどうかを判断させ、アプリケーションがどれくらいのメモリを使用しているかに基づいて、どれくらい「考える」かを推測しないでください。

また、check for memory usage through the garbage collector実際に割り当てられる管理メモリの量を正確に読み取るプロセスではありません。プライベートメモリサイズを使用すると読み方がはるかに小さくなりますが、余裕を持っているように見えますが、メモリ不足の状態になっている可能性があります。

MSDNページのコードサンプルは、操作のメモリ使用量を見積もり、その情報を使用してメモリが使用可能になるまで待機してから、さらに多くの要求を処理しようとしています。大量のメモリが必要なコードの領域を特定できれば、これを制約してメモリが不足するのを防ぐのに適しています。