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ロールを無効にすることを検討してください。詳細については、こちらをご覧ください。