SQLサーバーがsitecore_suggested_test_indexを更新する際に高負荷が発生する


説明

特定の状況では、コンテンツ テスト機能が原因で、SQLサーバーのCPU使用率が高くなる場合があります。これにより、Sitecore XPが利用可能なSQLの接続を失い、次の例外が発生する可能性があります:

Exception: System.InvalidOperationException
Message: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.
Source: System.Data
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   ...

この事象は、通常Sitecore XPがsitecore_suggested_test_indexを再構築しようとする際、毎日発生します。この検索インデックスは、コンテンツ テストを提案する際に使用されます。

8.0 Update-3(rev. 150427)以前のSitecore XPバージョンでは、コンテンツ アイテムを変更した後に発生する、インデックスの推奨テストの更新により、同じ問題が発生する可能性があります。

推奨テストに関する詳細情報については、以下の記事を参照してください:
https://doc.sitecore.com/xp/ja/users/101/sitecore-experience-platform/test-lists.html

解決策

この事象を解決するには、次のいずれかのオプションをお試しください。

1. アイテムの変更のインデックス更新を無効化する(XP 8.0 update 3以前のバージョン)

sitecore_suggested_test_indexは、レポーティングの用途にしか使用されないため、アイテムの変更ごとに更新する必要はありませんが、これがSitecore 8.0 update 3およびそれ以前のバージョンのデフォルトの動作となっていました。アイテムの変更ごとに更新する代わりに、インデックスの再構築を定期的に実施するように(例:再構築タスクのデフォルト設定のように、1日に1回など)変更することができます。

不要なインデックス更新を無効化するには、該当する設定ファイル(\App_Config\Include\ContentTesting\Sitecore.ContentTesting.Lucene.IndexConfiguration.configまたは\App_Config\Include\ContentTesting\Sitecore.ContentTesting.Solr.IndexConfiguration.config)の以下の行をコメントアウトします。

<strategies>
 <strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/syncMaster" />
</strategies>

2. 定期的なインデックスの再構築を無効化する

sitecore_suggested_test_indexの日次メンテナンスを無効化すると、エクスペリエンス オプティマイザーおよびエクスペリエンス エディターに表示されている推奨テストのリストに、関連データが含まれなくなります。その一方で、インデックスのメンテナンスにより生じるSQLサーバーの負荷がなくなります。

この解決策を適用する場合、masterデータベースから/sitecore/system/Tasks/Schedules/Content Testing/Rebuild Suggested Tests Indexアイテムを削除することをお薦めします。このアイテムは、定期的なインデックスの再構築に使用されます。

3. インデックスの再構築の頻度の削減

推奨テスト リストの機能が必要な場合は、定期的なインデックスの再構築は有効化したままとしてください。代わりに、インデックスの再構築の頻度を減らすことができます。

これを実施するには、インデックスの再構築を担当するスケジュールされたタスクおよび、masterデータベースの/sitecore/system/Tasks/Schedules/Content Testing/Rebuild Suggested Tests Indexアイテムを変更します。

正確なスケジュールは、サイトのアクセス数およびレポートの使用頻度によって異なります。

4. インデックスの範囲を縮小する

他のコンテンツ検索のインデックスと同様に、推奨テストのインデックスにはデータベースからアイテムを取得するアイテム クローラーが含まれています。

このクローラーには、インデックス作成を開始するコンテンツ アイテムを定義するrootプロパティがありますが、デフォルト値(/sitecore/content)の場合、すべてのコンテンツ アイテムが対象となります。

そこで、推奨テストを、コンテンツ ツリー内のより小さなサブセクションに限定することができます。これを実施するには、クローラーのroot要素を適切に調整する必要があります。

これによって、インデックスの再構築処理の際のSQLサーバーの負荷が軽減されるはずです。

また、インデックスの定義には、テンプレートのフィルタが含まれています。許可および除外されたテンプレートを調整することで、推奨テストのインデックスに含まれるアイテム数をさらに制限することができます。

これは、テストされたことがないテンプレートがある場合に役立つ方法です。

5. 追加のデータベース インデックスを実装する

SQLサーバーのインデックスを最適化することで、推奨テストのインデックス更新中に実行されたSQLクエリのパフォーマンスを向上させることができます。これを実施するには、以下のSQLスクリプトを使用し、reportingデータベースのFact_PageViewsテーブルに追加の非クラスター化インデックスを作成します:

CREATE NONCLUSTERED INDEX [<name>] ON [dbo].[Fact_PageViews] ([Date]) INCLUDE ([Views],[Value])

このSQLインデックスを追加した後、CMSパフォーマンス チューニングガイドに掲載されている提案に従って、このインデックスの定期的なメンテナンスの間隔を指定してください。