ASP.NETセッション状態ストアへの過負荷が発生する


説明

実装の詳細

Sitecoreは、セッション状態管理のために「ASP.NET SessionStateModule」のデフォルトの実装を使用しています。

セッション ストアでのデータの衝突や予期しないセッション状態の動作を回避するために、「SessionStateModule」クラス及び「SessionStateStoreProviderBase」クラスには、ASP.NETページの実行中に特定のセッションのセッション ストア アイテムを排他的にロックする機能が含まれています。

「SessionStateModule」インスタンスは、「GetItemExclusive」メソッドまたは「GetItem」メソッドのいずれかの呼び出し中にロックされたセッション データを検出すると、ロックが解除されるか、「ExecutionTimeout」プロパティで指定された時間が経過するまで、0.5秒間隔でセッション データを再リクエストします。

この挙動については、MSDNの「Locking Session-Store Data」の記事で詳しく記述されています。また参照番号「117091416336585」をMicrosoftサポートに送信することにより、特定の「ASP.NET SessionStateModule」の挙動に関する詳細情報を取得できます。

過負荷の原因

同じASP.NETセッション識別子を持つ複数のリクエストが着信した場合、一度に1つしか成功しない場合でも、各リクエストはセッション アイテムの排他ロックを取得しようとします。この挙動により、複数のスレッドが同じユニットを同時にロックしようとして、セッション状態ストアに過度の負荷がかかります。

症状

セッション状態ストアに大きな負荷がかかると、次の症状が発生する可能性があります:

解決策

この事象を解決するには、以下のオプションの実施を検討してください:

註:Sitecore XP 10.0以降では、Shared Session State Storeロールがデフォルトで無効になっています。Sitecore XP 9.3またはそれ以前のバージョンにおいても、Shared Session State Storeロールを無効にすることを検討してください。詳細については、こちらをご覧ください。