5

私はまともなトラフィック(1日あたり約100,000ページビュー)でサイトを運営していますが、SQLServerのタイムアウトエラーのために散発的にサイトがひざまずきました。

SQL Profilerを実行すると、次のように1秒間に数百回呼び出されるコマンドが表示されます。

...
exec dbo.TempGetStateItemExclusive3 @id=N'ilooyuja4bnzodienj3idpni4ed2081b',...
...

SQLServerを使用してASP.NETセッションの状態を保存します。上記は、特定のセッションのセッション状態を取得するために呼び出されるストアドプロシージャです。同じ2つまたは3つのセッションを何度も要求して、ループしているようです。

この正確な状況に対処しているように見える有望なホットフィックスを見つけましたが、それは私たちにとって問題を解決していないようです。(この修正プログラムは、直接インストールできるようには見えないため、最新の.NETサービスパックに含まれていると思います)。そのレジストリキーを手動で追加しましたが、上記のようにストアドプロシージャの呼び出しがループしているのがわかります(500ミリ秒ごとよりもはるかに頻繁に同じセッションを要求します)

これを開発マシンで再現することはできませんでした。同じセッションIDに対して2つの要求が行われると、正しくブロックされているように見え、最初のページがセッションを解放するまでSQLをヒットしようとします。

何か案は?前もって感謝します!!!

4

3 に答える 3

4

これは、別の質問に対する回答が必要だったケースの 1 つかもしれません。「なぜ SQL を使用してセッション状態情報を保存しているのですか?」という質問が必要でした。SQL ははるかに遅く、Web サーバーからの接続が大幅に切断されているため、この両方がこの問題の一因となっている可能性があります。ASPStateTempSessions テーブルのサイズを調べたところ、約 1MB しかないことがわかりました。に戻り<sessionState mode="InProc" ... />、問題は修正されました (そして、サイトの実行速度が向上しました)

次のステップは、トラフィックが指示する場合、別のサーバーを追加し、「StateServer」モードを使用して、メモリ使用量を分散できるようにすることです。

私はもともと、もはや問題ではなくなったメモリのボトルネックに対処するためにこの動きをしたと思います。(これは、メモリのボトルネックに対処するための適切な解決策ではありません。参考までに!)

重要な編集:わかりました。「TempGetStateItemExclusive」全体が問題ではなく、別の問題の症状であることが判明しました。ブロッキングの問題を引き起こしているクエリがいくつかあったため、すべての SQL リクエストが追い出されました。実際の修正は、ブロッキングの問題を特定して修正することでした。(ただし、「InProc」が適切な方法であると今でも信じています) このリンクは、私たちの問題を特定するのに大いに役立ちました。

http://www.simple-talk.com/sql/sql-tools/how-to-identify-blocking-problems-with-sql-profiler/

于 2010-02-05T19:59:39.533 に答える
0

しばらく経ちましたが、古いセッションを削除するために実行されるクリーンアップ ジョブはありませんか? 有効になっていますか。

この古いKBはそれについて言及しています。おっしゃるとおり、お久しぶりです。

于 2010-01-28T18:31:22.243 に答える
0

単なる好奇心から。そのprocを開いて、それが何をするかを確認しましたか?

選択ステートメントを作成しているだけの場合は、NOLOCK を使用しているかどうかを確認できます。そうでない場合は、NOLOCK を追加して、何が起こるかを確認してください。

于 2010-01-28T19:25:45.913 に答える