web-dev-qa-db-ja.com

IIS 7.5のセッションモジュールでハングしているリクエスト

時々、私のWebサイト上の一部のリクエストが、SessionモジュールのRequestAcquireState状態でハングし始めます。そのスパイラルが開始すると、すべてのリクエストがタイムアウトし、影響を受けるサーバーでIISを再起動する必要があります。

私はそれをたくさん調査しました、そして私が得た唯一の結論は、アプリケーションがセッションに保存されたユーザーデータにアクセスしようとしている間に何らかの理由でデッドロックが起こっているということです。

この問題を修正するために考えられる唯一のオプションは、アプリケーションでのセッションの使用を減らすか停止することです。これは明らかに計画の一部ですが、完了するまでにはしばらく時間がかかります。

ロードバランスでは、IIS 7.5、proc StateServerおよびサーバーアフィニティがオフの状態で6台のマシンを実行しています。

セッションを完全に削除せずにこの問題を回避または修正する方法に関するヒントはありますか?

IIS Hanging Processes

21
tucaz

ロックメカニズムは、プロバイダーとセッションモジュール(IISセッションモジュール)の両方に存在します。カスタムセッションモジュールを開発できますが、ロックなしのプロバイダーが必要ですまたはロックなしのカスタムプロバイダーを開発できますが、IISセッションモジュールが必要であり、そのレベルでの実装はそれほど簡単ではありません。

ソリューションは nlockedStateProvider [aka Unlocked]です。

白うさぎに従ってください:P(デモプロジェクトを確認してください、それはすべてを説明しています)

6
efaruk

長い間実行中のリクエスト(または私の場合は無限ループ)があると、セッションのデフォルトのASP.NETロックが原因で、以降のすべてのリクエストがロックされることが今日わかりました。

したがって、RequestAcquireStateにリクエストを持つユーザーがいる場合は、ExecuteRequestHandlerにセッションをロックしているリクエストがあるかどうかを確認し、他のリクエストが開始されないようにします。

セッションのロックを防ぐ方法については ここでの説明 があります。 (基本的に、ほとんどのページをセッション読み取り専用として作成し、セッションを変更することはほとんどありません。)

5
jaraics

答えは.NET Framework 4.5のHotfix Rollup 2828841で、すべての説明は次のとおりです。

http://forums.asp.net/t/1888889.aspx/2/10?Question+regarding+a+possible+bug+within+NET+4+5

そしてここに ダウンロードリンク

IIS 7.5 Windows Server 2008 rs x64、asp.net Webフォームアプリケーション、多くのajaxリクエストで動作します。

5
RolandoCC

それらのユーザーが別の実行時間の長いリクエストを持っている可能性はありますか?デフォルトでは、ASP.NETはリクエストが完了するまでセッションをロックします。最初の要求が完了する前に2番目の要求が届いた場合、それは待機する必要があります。 MVCを使用している場合は、コントローラーに属性を追加することでこの動作を変更できます。

[SessionState(SessionStateBehavior.ReadOnly)]

これにより、Sessionが読み取り専用になり、ロック動作が削除され、後続のリクエストを処理できるようになります。

0
ctsears