SQL Server request un timeout d'attente en tant que TempGetStateItemExclusive est appelé en continu

Je cours un site avec le trafic décent (~ 100.000 pages vues par jour) et sporadiquement le site a été mis à genoux en raison des erreurs de timeout d'attente de SQL Server.

Lorsque j'exécute SQL Profiler, je vois une command appelée des centaines de fois par seconde comme ceci:

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

Nous utilisons SQL Server pour stocker l'état de session ASP.NET. Ce qui précède est la procédure stockée appelée pour saisir l'état de la session pour une session donnée. Il semble être en boucle, demandant les mêmes 2 ou 3 sessions encore et encore.

J'ai trouvé une solution prometteuse qui semble répondre à cette situation exacte, mais cela ne semble pas avoir résolu le problème pour nous. (Je suppose que ce correctif est inclus dans le service pack .NET le plus récent, car il ne semble pas que vous puissiez l'installer directement). J'ai ajouté cette key de registre manuellement, mais nous voyons toujours les appels de procédure stockée en boucle comme ci-dessus (demandant la même session beaucoup plus souvent que toutes les 500ms)

Je n'ai pas été capable de recréer cela sur une machine de développement. Lorsque deux requests sont faites pour le même ID de session, il semble bloquer correctement, et même essayer de bash SQL jusqu'à ce que la première page libère la session.

Des idées? Merci d'avance!!!

C'est peut-être l'un de ces cas où j'avais besoin d'une réponse à une question différente. La question aurait dû être "Pourquoi est-ce que j'utilise SQL pour stocker des informations sur l'état de la session?" SQL est beaucoup plus lent, et beaucoup plus déconnecté du server Web, qui ont tous deux consortingbué à ce problème. J'ai regardé la taille de notre table ASPStateTempSessions et j'ai réalisé que c'était seulement environ 1MB. Nous sums returnnés à <sessionState mode="InProc" ... /> et le problème est résolu (Et le site fonctionne plus vite)

L'étape suivante, lorsque le trafic le dicte, serait d'append un autre server et d'utiliser le mode "StateServer" pour répartir l'utilisation de la memory.

Je pense que j'ai d'abord fait ce mouvement pour faire face à un goulot de la memory qui n'est plus un problème. (Ce n'est pas une bonne solution à traiter avec un goulot de la memory, FYI!)

EDIT IMPORTANT: Ok, il s'avère que tout le problème "TempGetStateItemExclusive" n'était pas le problème, c'était juste un symptôme d'un autre problème. Nous avions quelques requêtes qui causaient des problèmes de blocage, donc chaque requête SQL serait simplement expulsée. La solution réelle était d'identifier et de résoudre les problèmes de blocage. (Je crois toujours que "InProc" est la voie à suivre, cependant) Ce lien a beaucoup aidé à identifier nos problèmes:

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

Cela fait un certain time, mais n'y a-t-il pas un travail de nettoyage qui fonctionne pour supprimer les sessions périmées? Est-il activé.

Cette ancienne KB le mentionne. Comme je l'ai dit, ça fait un moment.

Juste par curiosité. Avez-vous ouvert ce proc pour voir ce qu'il fait?

Si c'est juste une déclaration select, vous pouvez voir si elle utilise NOLOCK ou non. Sinon, ajoutez NOLOCK et voyez ce qui se passe.