web-dev-qa-db-ja.com

ASP.NET 2.0-4.0Webアプリケーションの初期起動が非常に遅くなっています。

(これが本当に長い質問である場合は申し訳ありませんが、具体的であると言われています)

私が働いている会社にはたくさんのサイトがあり、しばらくの間問題なく運営されています。アプリケーションはASP.NET2.0、3.5、および4.0を組み合わせたものであり、すべてADO.NETを使用して、IIS7でホストされている(同じWebサーバー上の)SQL ServerStandardインスタンスに接続します。

問題は、アップグレードされたWebサーバーに移動したときに始まりました。サーバー、データベースインスタンス、およびIISをまったく同じ設定でセットアップするためにあらゆる努力をしました(異なるマシン名と、SQLExpressからStandardにアップグレードしたという事実を除く)。私たちが知る限り、私たちはそうしました。両方のサーバーがWindows Server 2008 R2を実行しており(現在のすべての更新プログラムが適用されています)、デフォルトのインストールを受け取りました。

これらのアプリケーションの1つを起動すると、問題は非常に明白になります。アプリケーションのログインページに到達すると、ページ自体が非常に高速に読み込まれます。これは、IISキャッシュを無効にして、ページをキャッシュできない可能性のある新しいマシンからページをロードする場合でも当てはまります。ログイン情報を入力して[ログインボタン。データベースの(優れた)設計のため、ログインプロセスは、理論的には最大150の個別のDBである多数のデータベースにアクセスする必要がありますが、実際には通常2です。問題は2つのデータベース(最小)のみでも発生します。素晴らしいデザインではありませんが、今のところそれと一緒に暮らす必要があります。

データベースへの接続を最初に開こうとすると、2 dbまたは40に接続しているかどうかに関係なく、プロセス全体が毎回約20秒間停止します。プロセスに対して.NETプロファイラー(jetbrains dottrace)を実行しました。それから私が得ることができた唯一の情報は、sqlconnection.open()への呼び出しの1つまたはすべてが時間の90%を占めていたということでした。これはアプリケーションの最初の使用時にのみ発生しますが、IISは設定したリサイクル設定を無視しているようで、数分後にアプリケーションをリサイクルするという事実によって問題が悪化しますアイドル状態になり、問題が再び発生します。

また、SQL Serverプロファイラーを使用して、速度低下の原因となったデータベース操作を確認しようとしましたが、他のすべてのDBアクティビティが原因でした(そして、問題が発生しないため、本番サーバーでこれを実行する必要がありました)。私たちのテスト環境では)停止の原因となった正確な操作を特定できませんでした。深夜に来て、本番サイトをシャットダウンしてSQLプロファイラーを実行しようとしますが、すぐに実行できない可能性があります。

問題を調査する過程で、私はいくつかの解決策を試しました

  • 名前解決の問題かもしれないと思って、ウェブサーバー上の両方のhostsファイルを変更し、接続文字列にサーバー名の代わりにIPアドレスを与えて解決しようとしましたが、違いはありませんでした。 LLMNRプロトコルがこのような問題を引き起こすと聞いたことがありますが、IPで接続しようとしたり、hostsファイルで解決したりすることで、その可能性を排除できたはずです。実際にLLMNRをオフにしようとしたことはありません。

  • IISでアイドルタイムアウト、リサイクル間隔などを増やしましたが、これは尊重されていないようで、問題の解決ははるかに少ないです。これにより、マシンのIISアプリケーション設定を上書きする設定があると思います。

  • 他の複数のコード修正。いずれも違いはありませんでした。 SqlServerの設定が問題の原因ですか?

  • 私が今までに忘れていた他のもの。

私がこの問題を解決するのを手伝ってくれるアイデア、経験、その他何でも大歓迎です!

19
Caleb

ローカルマシンでSQLインスタンスを実行している場合は、非tcp接続を使用することをお勧めします。 SQL Serverはいくつかのプロトコルをサポートしており、tcp、名前付きパイプ、および共有メモリがより一般的です。

名前付きパイプ

Data Source=np:computer\instance

共有メモリ

Data Source=lpc:computer\instance

個人的には共有メモリが好きです。これらのプロトコルを有効にする必要があることを忘れないでください。構成の間違いを避けるために、使用していないものはすべて無効にすることをお勧めします。

http://msdn.Microsoft.com/en-us/library/ms187892.aspx を参照してください

IISリセット

IIS7では、アイドルタイムアウトを構成する方法が2つあります。どちらも、[アプリケーションプール]セクションをクリックし、適切なアプリドメインを右クリックすることから始めます。 「リサイクル...」オプションをクリックすると、1つの設定があります。もう1つは、[プロセスモデル]セクションの[詳細設定...]にあり、ゼロに設定するとプロセスタイムアウトが無効になる[アイドルタイムアウト(分)]があります。この後者のオプションは、私たちのために機能するものです。

私があなただったら、最初にこの問題を解決します。20秒のラグがなくても、appdomainやworkerプロセスを再起動するのは常に苦痛だからです。

18
csharptest.net

いくつかのアイデア:

  • webサーバーからdbサーバーにpingを実行して「通常の」応答を取得できますか、それとも同様の遅延が発生しますか?
  • 遅延が発生している場合は、tracertを実行して、速度低下が発生している場所を特定できるかどうかを確認します。
  • 実行にインストールを必要としないQueryExpress(http://www.albahari.com/queryexpress.aspx)のようなツールを使用してみてください。このEXEをダウンロードして、Webサーバーから実行できます。これを使用してデータベースに接続し、通常の方法でクエリを実行できるかどうかを確認してください。
  • SysInternalsのTcpView(http://technet.Microsoft.com/en-us/sysinternals/bb897437)のようなものを試して、開いている接続を調べ、サーバーで発生しているアクティビティと送信されているデータの量を確認してください。そしてあなたのdbサーバーから受け取りました。

あなたの問題の説明に基づいて、私がどこから始めたいかについての最初の考えです。これがお役に立てば幸いです。頑張ってね!

1
David Hoerster

IISリサイクル設定を尊重しない:IISを再起動/再起動すると動作が変わりましたか?

0
Leon