2013-06-20 10 views
5

我々は、HAProxyの背後にある3台のサーバーでAsp.Net WebApiを実行しています。 HAProxyはこれらの3つのインスタンス間でリクエストをランダムに分配します。Asp.NET Web Apiで高いCPUと長い応答時間の問題を検出する方法

これらのインスタンスは、mongodb、redis、およびいくつかのWindowsサービスに接続します。

通常、w3wp.exeは各apiサーバーで約%30のCPUを使用します。

時々(1時間に数回)、apiサーバーの1つが大量のCPUを使用することに決めました。この動作に関連して、応答時間の増加が見られます。この数字は、HAProxyが10000msの応答時間を見て、別の2台のサーバーに要求をルーティングすることを決定するまで続けられます。これらはすべて10〜20秒で発生します。しばらくすると、このサーバーは通常の状態に戻り、再度要求を開始します。数分後、別のサーバーがまったく同じことを行います。これは続けています。

私たちはNew Relicを使用していますが、アプリケーションはWebApiアプリケーションであるため、有用な情報は得られません。私たちは、CPU使用率、メモリ使用量、ネットワークトラフィック、およびI/Oについて、私たちのすべてのサーバー(redis、mongo、windowsサービス)を監視していますが、上記の停止中に重大な負荷は見られません。

このアプリケーションの動作の原因をどのように検出できますか?

+0

この問題は解決しましたか?私はウェブAPIと同様の問題を抱えています。特定の呼び出しに対して、ユーザーは応答を得ず、w3wp.exeは高いメモリ使用量を取得します。問題をどのように調べたかを分かち合うことができますか? –

答えて

0

良いオプションは、プロセスエクスプローラのようなものを使ってミニダンプを取ってから、スレッドが何をしているのかなどを調べるためにWinDBGなどで調べます。私はここでそれを行う方法についての良いブログ記事を持っている:

http://www.haneycodes.net/but-it-didnt-happen-in-dev-or-qa/

0

DavidHは、メモリダンプが本当に重要なステップであるなって、言ったように。必要ならば、私はダンプを読むのに役立つことができます。無料です

別の有用なすぎるCPUアナライザは:http://samsaffron.com/archive/2009/11/11/Diagnosing+runaway+CPU+in+a+Net+production+application

別のオプションはPerfViewを使用することです。

さらに別の方法として、JetBrainsのdotTraceを使用してw3wp.exeプロセスにアタッチする方法があります。

0

.NETとJava EEの間で共有されるものは、ガベージコレクタです。したがって、アプリケーションで大量のメモリが使用されている場合は、CPU使用率が高くなるとガベージコレクタになる可能性があります。.NET 3.5 IIS 7では、1プロセスあたり1ギガバイトを超えて使用するアプリケーションが実行されています。ガベージコレクタは基本的にアプリケーションのメモリを回復している間はすべてを停止します。ガベージコレクタを微調整し、それが意味をなされたらコードから呼び出すこともできます。あなたが使うことができる小さな戦略がたくさんあります。たくさんの文字列を処理している場合は、GCに別の問題が発生します。たとえば、Restful Webサービスを経由してくる文字列を解析しているとします。これにより、多くのメモリの断片化が発生し、GCが多くの時間とCPUのメモリを回復させる可能性があります。

これが実際に何が起こっているのかがわかりやすいのです。 Taskmanagerを使用して、プロセスのメモリ使用量とCPUを監視することができます。 CPUが上がったときと後になったときに使用されたメモリを見てください。

+0

アプリケーションはセッションを保存しないため、メモリスペースを占有するのはローカルに作成されたインスタンスだけなので、メモリはほとんど使用されません。 –

+0

ウェイメモリは.Netで動作します。GCアルゴリズムが「今」が楽しい時間であると判断するまで、しばらくの間はメモリが回復しないということです。 GCの頻度は、使用する設定とアプリケーションで使用されるメモリの割合によって決まります。セッション変数に物を格納することは、実際問題ではありません。たとえば、たくさんの文字列を解析することは重要です。なぜなら、再利用して再組み立てしなければならないメモリがほとんどないからです。文字列を解析すると、GCCの実行時間が長くなり、CPU使用率が高くなり、システムが応答しなくなります。 –

関連する問題