.NET(へたれな)コネタ IISにおけるセッション管理 -セッション情報が突然消える-
セッション情報が突然空になってしまうという現象が発生していました。
この現象が発生するのは、サーバに対して、非常に高負荷な処理が行なわれたときに発生するようです。まづは、ASP.NETのセッション状態に関して調べました。
セッション状態管理には次の3つのモードがあります。
・インプロセス(InProc)モード 標準
セッションはワーカープロセスのメモリー内に保存
・State Serverモード
ワーカープロセスとは別のプロセスあるいはサーバへ保存
・SQL Serverモード
SQLサーバ内に保存
現象としては、突然、ワーカープロセスが終了してしまうような現象でしたのでワーカープロセスがリサイクルされると、セッション情報が失われてしまうインプロセスモードをやめて、State Serverモードならば安定するのではないかと考えて、設定を変更してみました。
結果はNG。セッションへオブジェクトをそのまま保存しているのですが、そのオブジェクトがシリアライズ可能なオブジェクトでなかったため、エラーとなってしまいました。
そこで、次に、ワーカープロセスのリサイクルを抑止する方向の検討を行ないました。まず、ワーカープロセスのリサイクルされる時間を延ばしたり無効にしりしましたが、結果は、NGでした。結局、既定の設定でもかなり長い時間が経過しないとリサイクルされないのに、さらに設定を延ばしても現象は変わりませんでした。
最後に、ワーカープロセスの監視設定を変更してみました。
Pingとラピッドフェール保護を無効にしてみましたところ、現象は発生しなくなったようですまだ、厳密には検証が必要そうですが、どうも、ワーカープロセスからのデータベースアクセスが遅いときに、ワーカープロセスが無応答状態になって異常と判定されてリサイクルされていたのではないかと想像します。現在、設定を無効にしていますが閾値を適切に調整して様子をみたいと思います。
[ASP.NET]IIS 6.0でワーカー・プロセスの挙動をカスタマイズするには?
プロセス モデルの使用
ITmedia エンタープライズ:特集:クライアントステート管理、3つの手法 (2-9)