2

サイズが「1 MB」の大量の HTTP リクエストを特定の Web サービスに送信するストレス テスト アプリケーションを設計しています。ストレスを解消するために、アプリケーションで複数のスレッドを使用しています。構造は、HTTPRequest データを作成し、それをキューに追加する X EnqueueThreads があるようなものです。Y WorkerThreads はリクエストをデキューし、Web サービスに送信します。すべてのリクエストは非同期です。ここでの問題は、エンキュー スレッドが WorkerThreads よりもはるかに高速に動作するため、停止/待機条件がない場合、メモリ不足の例外がスローされるまでリクエストを追加し、インジェクター (このユーティリティが実行される場所) を作成することです。スロー。現在、OutOfMemory 例外を処理し、enqueuethreads をしばらくスリープ状態にしています。

ただし、限られたシステム リソース (特にメモリ) を使用するための最善の方法についての見解を知りたいです。前もって感謝します。

4

2 に答える 2

4

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

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

また、実際に割り当てられているマネージ メモリの量を正確に読み取るために、プロセスではなくガベージ コレクタを通じてメモリ使用量を確認する必要があります。プライベートメモリサイズを使用すると、読み取り値がはるかに低くなり、余裕があるように見えても、メモリ不足の状況に陥る可能性があります。

MSDN ページのコード サンプルは、操作のメモリ使用量を見積もる方法と、その情報を使用してメモリが使用可能になるまで待ってから、さらに要求を処理する方法を示しています。大量のメモリを必要とするコード領域を特定できる場合、これはそれを制約してメモリ不足を回避するための適切なオプションです。

于 2013-06-02T07:26:17.053 に答える
3

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

例外の処理は最も簡単な解決策ですが、時間の経過とともにアプリケーションにさまざまな問題や矛盾が生じる可能性があります。別の方法は、次のように使用可能なメモリ リソースのサイズを取得することです。

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

次に、1 つのオブジェクトのメモリ容量の見積もりに基づいて、キューの長さを計算できます。

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

于 2012-04-06T05:42:53.367 に答える