-
Notifications
You must be signed in to change notification settings - Fork 0
MS_SlowFirstRequest
初回が遅くなるケースの
- 事例と
- トラブルシュートの方法
についてまとめています。
- .NET Framework 自体のロード
ファイルシステム・キャッシュ上に乗せるため、
スタートアップ・スクリプトで.NETプログラムをキックする。
(コールド スタート → ウォーム スタート化)- ウォーム スタート
ウォーム スタートは、主要なCLRコンポーネント用のページの殆どが、
既にメモリに読み込まれているときに発生し、貴重なディスク アクセス時間が節約されます。
このため、マネージ アプリケーションを再度実行すると、初回よりも短い時間で起動します。
- ウォーム スタート
- マネージ・プロセスのロード
DLLのロード、GCスレッドの起動などがあるため。
また、WPFの初期化はWindows Formsより遅い。
- IIS(ASP.NET)上のJITコンパイル運用、プリ・コンパイルで高速化可能。
-
JITコンパイル運用、NGenによるプリ・コンパイルで高速化可能。
-
ngen化したモジュールのインストーラーによる配布について
NGENされたファイルを含んでいるのではなく、
WiXのカスタムアクションを使って実行時にNGENしてます。NGENはそのマシンのリソースに合わせてJIT相当の処理を事前に行う
仕組みなので実行環境以外でNGENすることに意味をもっていません。
※ .NET Core(MS_DotNetCore.md)からNGENは、ReadyToRun + Tiered Compilation(MS_ReadyToRunAndTieredCompilation.md)になるらしい。
補足(最新化): 現行の .NET(.NET 5 以降)では NGen は使えず、 ReadyToRun(AOT プリコンパイル)+ Tiered Compilation が標準。 起動時間をさらに詰めたい場合は Native AOT も選択肢になる。
ミドルウェア類のプロセス起動に時間がかかっている可能性があります。
ワーカ・プロセス起動からJITコンパイルまで、
以下の対応で解決する可能性があります。
- IIS7 以降
- アプリケーション プールの自動スタートアップを構成する (IIS 7)
- IIS 8 以降は Application Initialization モジュールで、初回リクエストを待たずにウォームアップできる。
- IIS6 以前
定期的にダミーのリクエストを送信するなどの作りこみが必要。元 Wiki の添付pingWebApp.vbsは以下の内容。
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate("http://www.google.com/")
WScript.Sleep(5000)
objIE.Quit()補足: このスクリプトは Internet Explorer の COM オートメーションを前提としており、 IE のサポート終了(2022年6月)により現行環境では動作しない。 同等のことは PowerShell の
Invoke-WebRequestやcurlで行う。
DBMS関連を参照。
画面上に表示されるUIコントロールが多い場合のUIコントロールの初期化
(この問題はWPFなどでも解決していないが、描画回数は少なく抑えられる)
- 参考:WPF(元 Wiki のリンク先「新アーキテクチャ設計ガイド補足(アプリケーション・アーキテクチャ)」は 3 サイトのいずれにも存在しないリンク切れだったため、リンクを外した)
- Windows Formsでは以下の方法で描画回数を抑えることができる。
- 画面表示時のデータ取得ラウンド・トリップ
ファサードパターンなどを取り入れておらず、
クライアント・サーバ間のラウンド・トリップが問題になることがある。
DBアプリケーションでは、DBMSの持つデータがキャッシュに上がるまで
I/O処理時間がかかるため、初回起動時の性能が遅く感じられるケース。
-
分析方法としては、ディスクIOを確認する。
- パフォーマンス カウンタ
- SQLプロファイラ(SQLトレース)(
MS_SQLProfiler.md)
-
この場合、
- SQLのDMLを流すか、
- UI操作をシミュレーションする類のツールのスクリプト、若しくはリクエストを流すか、
することで、迅速にキャッシュにデータが上がるようにします。
統計情報の自動作成によって、初回実行が遅くなることがあるようです。
基本的に「つながらない!」に記載された方法で確認する。
基本的に「つながらない!」に記載された方法で確認する。
プロキシを自動検出している場合に遅い事例がありました。
IEの「インターネットオプション」→「接続」タブ→「自動構成」→「設定を自動的に検出する」
※ 現行の Windows では「設定 > ネットワークとインターネット > プロキシ > 設定を自動的に検出する」に相当。 WPAD による自動検出が失敗するとタイムアウト待ちが発生するのは同じ。
SSLハンドシェークが問題になるケースがあります。
HTTP 遅すぎる原因はHTTPSのSSLハンドシェーク - マイナビニュース
この問題の解決方法にHTTP Keep Alive設定があります。
サーバ・クライアントの双方に、HTTP Keep Alive設定が可能です。
- HTTP キープアライブを有効にする
- Internet Explorer のデフォルトの Keep-Alive タイムアウト値を変更する方法
- HttpWebRequest.KeepAlive プロパティ (System.Net)
証明書失効リスト (CRL)にアクセスできないときに遅い場合があります。
こちらは、SSL(HTTPS)接続に限らず、
デジタル署名されたプログラムの検証等のタイミングでも動作します。
- FIX: A .NET Framework 2.0 managed application that has an Authenticode signature takes longer than usual to start(KB936707)
- Exchange Server 2007 managed code services do not start after you install an update rollup for Exchange Server 2007(KB944752)
- 基調講演のデモで発生した遅延の問題
- .NET Framework はインターネット接続が必要?
補足: .NET Framework 4.x 以降では、
generatePublisherEvidenceを無効化する、 あるいはネットワーク分離環境では CRL / OCSP のタイムアウトを短縮する運用で回避する。
LDAPアクセスに使用しているAPI(ADSI)は、
ADのスキーマ更新やDC再起動後に
ADのスキーマキャッシュ情報が
クライアントにダウンロードされる仕様であり、
このトラフィックにより時間がかかることがある。
「初回が」と言う訳では無いですが、
-
SubversionクライアントのsvnコマンドをASP.NET(IIS)の
Network Serviceアカウントから実行すると遅くなるという現象があった。 -
パケット・キャプチャを行うと、
- svnのクライアントがコマンド入力を受けてから
- svnのサーバに対してリクエストを投げる間
のsvnクライアント側で遅くなっていることを確認できた。
-
このため、svn.exe内部で問題が起きていると考え、
ProcessMonitor(障害対応に使用するツールの一覧)を使用してプロセス内を確認すると、C:\Documents and Settings\Default User\Application Data\Subversion以下にアクセスし、アクセス拒否+リトライを繰り返している事が確認できた。
-
解決のため、上記のフォルダに、IIS_WPGグループの
アクセス許可を付与した所、速く動作するようになった。 -
参考:サービス・タスク系のアカウント問題(
MS_ServiceAndTaskAccountIssues.md)
Tags: あるある, 障害対応, 性能, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。