Dynamics CRM 設置型のパフォーマンス: 静的コンテンツがキャッシュされない

 

みなさん、こんにちは。

今回はパフォーマンスに影響する設定について、US チームのブログより以下の記事を紹介します。

Static Content not cached properly in Dynamics CRM due to Vary:* header
https://blogs.msdn.com/b/crminthefield/archive/2014/12/19/static-content-not-cached-properly-in-dynamics-crm-due-to-vary-header.aspx

背景と概要
Windows Server 2012 で Dynamics CRM 2013 を使用している場合、Web ブラウザーで静的コンテンツがキャッシュされない場合があります。
Internet Explorer などの Web ブラウザーは、Web サーバーからのコンテンツをキャッシュする機能がありますが、IIS の設定やネットワーク機器で Vary ヘッダーが “*” に設定されていると、コンテンツがキャッシュされないため、ページ表示が遅かったり、ネットワーク使用率が高くなります。

詳細
以下はブログ記事の内容です。
---------------------------------------------------------------------------------------------------------------------

最近、幾つかのパフォーマンス問題のケースを担当しました。ページ表示が遅いまたはネットワーク帯域の使用率が高いという内容のケースです。
状況を把握するために、Fiddler でトレースを取得して通信を確認しました。トレース取得時は、必ずフォームを 2 回ロードして静的コンテンツがキャッシュされるようにしました。同じフォームを何回も表示した場合、aspx, asmx, ashx, and svc のような動的なページのみ、サーバーからロードされる状況を確認できるはずです。しかし、このケースでは、フォームを開くたびに、大きな JavaScript ページが毎回ロードされていました。

以下のスクリーンショットは、今回のパフォーマンス問題のケースで共通に見られた、問題を発生させていたファイルです。これらの静的ファイルは、毎回のフォームロードで発生している 約 1MB に近い、追加で発生していたダウンロードデータを占めています。遅いネットワーク接続では、ページロードに数秒を追加する事になります。
5270_clip_image0025_4AA1F6E8

 

これらの静的ファイルはキャッシュが Public に設定されているのでキャッシュされるはずですが、レスポンス上の Vary ヘッダーが “*” に設定されています。
(この記事の最後に Fiddler で Vary ヘッダーを表示する方法があります)
6648_image_47FBCBE8

Vary ヘッダーが “*” に設定されていると、どんな場合でもクライアントでキャッシュされないようになります。この場合は Vary ヘッダーの値は “Accept-Encoding” に設定されるべきです。

この現象の原因をいくつか特定しました。

IIS で Vary header を “*” に設定している場合

ある状況では IIS は Vary ヘッダーを “Accept-Encoding” の代わりに “*” を指定できます。最初に Windows Server 2012 でこの動作を確認しました。この動作は IIS の omitVaryStar 設定を True に設定する事で防止出来ます。omitVaryStar についてはこの記事の他に、詳細を説明している記事がたくさんありますが、この記事は今回の現象に遭遇している場合の記事です。

以下はこの設定の変更方法です。

1. CRM サイトを選択し、Configuration Editor を開きます。
日本語版では「構成エディター」です。

8726_clip_image002_104BA269

2. セクションで system.web/caching/outputCache を選択し、[omitVaryStar] プロパティを [Tue] に設定し、[適用] で変更を保存します。
5557_clip_image004_18CF01B3

この設定により、Vary ヘッダーが “Accept-Encoding” に変更され、クライアントは静的コンテンツをキャッシュできるようになります。

ネットワーク機器のキャッシュ機能により、Vary ヘッダーに “*” が追加されるケース

幾つかのシナリオでネットワーク機器により Vary ヘッダーが影響をうけているケースがありました。それらのケースでは、ネットワーク機器が独自で使用するキャッシュまたは圧縮機能により、Vary ヘッダー “*” が追加されていました。ネットワークロードバランサー、ファイヤーウォール、プロキシーサーバーでこの現象を確認しています。これらの環境では原因の切り分けが難しくなりますが、IP アドレスやサーバー名で直接 CRM サーバーにアクセスして、この現象が発生するかどうかで確認する事が出来ます。IIS が提供している以上の利点が無い場合は、原因の特定後、ネットワーク機器の設定を変更したり、ネットワーク機器のキャッシュ設定を無効にできます。

この他にもこの現象の原因が存在すると思いますが、この二つが主なこの現象の原因でした。

<参考: Vary ヘッダー列の表示方法>
Fiddler で Vary ヘッダーは以下の操作で表示する事が出来ます。
1. 列名の上で右クリック – [Customize Columns…] を選択
fiddler_customize_columns
2. Customize Columns ダイアログボックスの [Collection] で [Response Headers] を選択
3. [Header Name:] に Vary と入力
4. [Add] ボタンで列を追加します。
fiddler_vary_column

---------------------------------------------------------------------------------------------------------------------

まとめ

もし、環境が同じでこの現象に遭遇している場合は、この設定を確認してみてはいかがでしょうか。

- Kensuke Kitazawa