2012-04-20 22 views
2

要件は、Webサービスのストレステスト用のアプリケーションを作成することでした。 アイデアは、サイズが4 KBの1000K HTTPWebRequestsをウェブサービス に投げ込むことを目的としていました。これを実現するために、キューやスレッドプールに送信するデータを追加するスレッドがほとんどないような構造のアプリを作成しましたこれらの要求を非同期で送信しています。 Task responseTask = Task.Factory.FromAsync(testRequest.BeginGetResponse, testRequest.EndGetResponse, null);"しかし、何が起きているのかは、要求の数/秒が大幅に減少している(サービスの応答時間が長くなったためかもしれませんが、要求を非同期で送信している場合もあります)問題?)それに加えて、しばらくすると、ツールは "アプリケーションが動作を停止しました"というメッセージでクラッシュし、例外はアウトメモリの例外として表示されます。大きなHTTPWebRequestを送信するためのアプリケーションがメモリ不足の例外でクラッシュする

私が観察したことの1つは、アプリケーションがクラッシュする直前であり、Webサービスの応答時間が大幅に増加しています。それはクラッシュの間接的な理由ですか?

どのような救済策ですか?

+0

私は、減速がGCが追いついていることが原因で起こっていると仮定します。 –

答えて

0

調整しないでタスクをキューに入れると、保留中の要求が無限に増加することがあります。非同期動作を使用する場合でも、スロットルをする必要があります。

+0

返事をありがとう。私は以前これも理由だと思った。しかし私はプロセスのプライベートバイトを500 MBに制限することによってキューを制限しています。私はこれがはるかに高い限界だと知っています。 また、制限した後、アプリケーションによるプロセッサの使用率が大幅に増加したことがわかりました。それには何らかの理由がありますか? – Tejas

+0

あなたがプロセスのメモリを制限しているとき(どのようにそれをやっていますか?)、OOMエラーを引き起こしています。結局のところ、あなたは自分の記憶を否定します。展開する余地がないため、GCが狂ってバイトを解放しようとしているため、アプリケーションが遅くなります。多くのG2コレクションでプロセスが遅くなっています。 – usr

+0

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); long privateSetSizeInBytes = currentProcess.PrivateMemorySize64; long privateSetSizeInMBytes = privateSetSizeInBytes/1024/1024; 場合(privateSetSizeInMBytes <500) {//リクエスト 追加} ..これは、メモリ内のサイズを制限するためのコードである を – Tejas

関連する問題