6

ASP.NETアプリケーションの非常に長い(imho)初期起動の原因を特定しようとしています。

このアプリケーションはさまざまなサードパーティのライブラリを使用しており、統合できると確信している多くの参照がありますが、dllと、それらが拡張起動プロセスにどの程度貢献しているかを特定(および配分のせい)しようとしています。

これまでのところ、起動時間は、ボックス上の他のものの使用法に応じて2〜5分です。これは、サイトの複雑さからすると私の意見では受け入れられないので、これを最大30秒程度に減らす必要があります。

私が探しているパフォーマンスの範囲を明確にするために、最初のリクエストから最初のApplication_Startメソッドがヒットするまでの時間です。

では、どのDLLがロードされるか、およびロードにかかる時間に関する情報を取得することから始めて、取り組む/統合する必要のあるコスト/メリットをまとめることを試みることができます。

能力の観点から、私はしばらくの間JetBrains dotTraceを使用しており、アプリケーションに入った後のアプリケーションのベンチマーク方法は明らかですが、これはアプリケーションコードの外にあるため、何の外にあるようです。私は現在知っています。

私が探しているのは、コードへの最初のエントリポイントの前に何が起こっているのかを可視化する方法に関する方法論です。

注:リサイクル/アップグレード時にデフォルトのページを呼び出して初期ロードを実行できることは知っていますが、実際の問題を解決するのではなく、問題を解決したいと思います。

注2:ハードウェアは十分にスケーリングされ、機能的に分離されているため、これは問題ではないと確信しています。

4

4 に答える 4

4

スタートアップコードのプロファイリング/デバッグに関する個別の回答:

w3wpは、.Netコードを実行する単なるプロセスです。したがって、通常の.Netアプリケーションに使用するすべてのプロファイリングおよびデバッグツールを使用できます。

トリッキーな点の1つは、w3wpプロセスはアプリケーションへの最初のリクエストで自動的に開始され、ツールが開始するたびにプロセスへのアタッチをサポートしていない場合、アプリケーションの起動コードを調査するのが問題になることです。

それを解決する秘訣は、同じアプリケーションプールに別のアプリケーションを追加することです。このようにして、すでに実行中のプロセスに対してツールをアタッチ/構成するよりも、別のアプリケーションに移動してw3wpの作成をトリガーできます。最終的に元のアプリケーションツールをトリガーすると、既存のw3wpプロセスで読み込みが行われていることがわかります。

2〜5分の遅延で、プロファイラーさえ必要ない場合があります。上記の方法でVisual Studioデバッガーを接続し、サイトの読み込み中にランダムに「すべてを中断」を数回トリガーします。コードの最も遅い部分が多くのスレッドの1つのスタックにある可能性が高いです。また、デバッグ出力にも注意してください-何が起こっているのかについての手がかりが得られる場合があります。

WinDbgを使用して、同様の方法ですべてのスレッドのスタックをキャプチャすることもできます(VSよりも軽い方法である可能性があります)。

于 2012-06-06T20:20:21.587 に答える
2

DLL参照は、一度にすべてではなく、必要に応じてロードされます。

外部参照はASP.NETアプリケーションの速度を低下させますか?(VS:参照の追加ダイアログ)

起動に2〜5分かかる場合は、Application_Startで何が発生するか、およびDLLが読み込まれると何が行われるかを確認します。彼らは非常に遅いリモートサービスに接続しようとしていますか?マシンが実行するには小さすぎますか(たとえば、大量のデータを含むDBとAWSマイクロインスタンスなどのWebサーバーを実行している)?

読み込み時間はおそらくIISワーカープロセスが参照を解決するものではないため、従来のアプリケーションプロファイラー(Jetbrains、Antz、dotTraceなど)を使用して、DLLの初期化とApplication_Startメソッドで時間が費やされている場所を確認します。

于 2012-06-06T17:00:13.627 に答える
2

エンターテインメントオプションは、プロファイリングとともにチェックします。

  • すべてのプロファイルを作成し、すべてにタイムトレースを追加して、情報をログに記録します
  • 起動時にコンパイルする必要のあるASPXビューが多数ある場合(リリース構成のデフォルトだと思います)、時間がかかるよりも
  • Webサービスまたは他のXMLシリアル化関連コードへの参照は、まだ存在しない場合はシリアル化アセンブリをコンパイルする必要があります
  • リモートサービス(ローカルSQLを含む)にアクセスするには、サービスの起動も必要になる場合があります
  • アプリケーション/リモートサービスでの積極的なキャッシングでは、キャッシュの作成ごとに必要になる場合があります

製造:

  • 起動時間の目標は何ですか?最初にそれを理解してください、さもなければあなたはそれに到達することができません。
  • 起動時間を短縮するために支払う価格はいくらですか。サーバーを1〜10台追加する方が、開発/テストに数か月を費やして製品を遅らせるよりも安価な場合があります。
  • 複数のサーバー、ウォームアップ呼び出しを伴うローリングリスタート、Webガーデンを検討してください
  • DBオブジェクトのキャッシュ、または一般的に問題がある場合は、既存の分散メモリ内キャッシュを検討してください...
于 2012-06-06T17:22:03.553 に答える
0

dllの数が多いにもかかわらず、妥当なアプリケーションでは問題の原因にはなり得ないとほぼ確信しています。ほとんどの場合、静的オブジェクトの初期化が原因で起動が遅くなります。

C#では、静的変数は、型に最初にアクセスしたときに初期化されます。SQLプロファイラーを使用して、アプリケーションの開始時に実行されるクエリを確認し、そこから初期化にコストがかかるオブジェクトを確認することをお勧めします。

于 2012-06-06T16:58:00.890 に答える