9

最初の数人のユーザーが Web サイトにアクセスすると、パフォーマンスが非常に遅くなります。

Windows Azure セットアップは IIS 7.0 を使用しているため、ウォームアップ初期化モジュールはオプションではありません。

このパフォーマンス速度が問題にならないように Web サイトを「ウォームアップ」する方法はありますか?

私はこれを見てきました: Controlling Application Pool Idle Timeouts in Windows Azureですが、Azure が約 29 時間ごとにアプリケーション プールをリサイクルするときに、これでも問題が発生するかどうかはわかりません。

アップデート:

デプロイは、複数の Web サイトを含む 1 つの Web ロールです。これをプリコンパイルすることは可能ですか?または、以下の回答のいずれかで提案されているように、Web ロールを使用しますか?

編集:

@Igorek が以下に述べているように、ロールの起動時に自分自身を自動ロードする Web ロールの使用に関して、これは私が持っているセットアップで可能です。これを達成する方法の例はありますか?

4

4 に答える 4

5

私はこれを見ました:Windows Azureでアプリケーションプールのアイドルタイムアウトを制御しますが、Azureが約29時間ごとにアプリケーションプールをリサイクルするときに、これが依然として問題を引き起こすかどうかはわかりません。

Azure がアプリ プールをリサイクルするときに問題が発生することはありませんが、そのスタートアップ タスクに追加して、アプリケーション プールのリサイクル時間を防止または増加させることもできます。

これを試して:

でタスクを定義しますServiceDefinition

<Startup>
    <Task commandLine="startup\disableTimeout.cmd" executionContext="elevated" />
</Startup>

次にcmd、次のコードを含むファイルを用意します (メモ帳に入力してから、.cmdファイルとして保存します)。

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00

2 つの確認事項:

1) ANSI エンコーディングでファイルを保存してください。
2) そのスクリプトを Visual Studio に追加したら、プロパティの [出力ディレクトリにコピー] オプションとして [常にコピー] を選択してください。

于 2013-03-28T16:16:27.490 に答える
2

最初のHTTPリクエストが到着すると、実際に多くの追加作業が行われます。アプリケーションプールが開始され、必要なすべてのアセンブリが検出され、MSILとして出荷されたすべてのアセンブリがマシンコードにコンパイルされ、必要なASP.NETビューがプリコンパイルされます(デプロイしない限り)それらはプリコンパイルされていますが、Azureツールでは非常に難しいので、そうしないと思います)。これにはすべて時間がかかるため、不運な最初のユーザーは待たなければなりません。

回避策は、ロールエントリポイント内からサイトをウォームアップするOnStart()ことです。サイトをプリコンパイルしてから、ローカルホストにHTTPリクエストを送信します。

于 2013-03-19T06:49:56.617 に答える
2

アプリケーションをプリコンパイルしていますか? デフォルトでは、デプロイ後のアプリケーションは、最初にコンパイルする必要があります。アプリケーションのサイズによっては、コンパイルに数秒かかることがあります http://msdn.microsoft.com/en-us/library/399f057w(v=vs.85).aspx

于 2013-03-18T16:19:09.320 に答える
0

mattytommo の回答は問題なく機能しますが、cmd ファイルに依存するのではなく、プログラムで同じ目標を達成することを好みます。あなたは3つのステップでそれを行うことができます:

ステップ 1: NuGet パッケージ Microsoft.Web.Administration をインストールする必要があります。パッケージには、アプリケーション コードから IIS を制御するために必要なライブラリが含まれています。

ステップ 2:次に、Web ロールの RoleEntryPoint からこのメソッドへの呼び出しを追加します。存在しない場合は、RoleEntryPoint から継承するクラスを追加するだけです。

private void ConfigureAppPools()
{
    using (ServerManager serverManager = new ServerManager())
    {
        foreach (var appPool in serverManager.ApplicationPools)
        {
            appPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
            appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
        }
        serverManager.CommitChanges();
    }
}

このコードは、マシン上のすべてのアプリケーション プールをリサイクルまたはタイムアウトしないように構成するだけです。

ステップ 3:これを機能させるには、次の 1 行を ServiceDefinition.csdef に追加する必要もあります。

  <WebRole name="YourWebRoleName" vmsize="ExtraSmall">
    ...
    <Runtime executionContext="elevated" />
    ...
  </WebRole>

これにより、Web RoleEntryPoint の OnStart() メソッドが昇格された権限で実行されるようになります。コードの他の部分は影響を受けないため、セキュリティの観点からは問題ありません。

それだけです。読み込みが遅い問題は解決されました:)

于 2014-05-21T18:00:55.247 に答える