Bonjour aux valeureux qui ont vaillamment résisté à l'appel des plages !
J'avais précédemment ouvert un fil sur la façon de pouvoir tracer des erreurs à partir du profiler : http://www.developpez.net/forums/d95...icate-key-row/
En fait, le problème applicatif à l'origine de cette demande s'est reproduit et après un examen qui a dû être fait un peu dans l'urgence, j'ai pu affiner son origine.
En fait à l'origine je pensais qu'il s'agissait d'un pb de violation de clé chrono mais il semble que ce soit davantage un processus qui bloque d'autres processus. Lorsque le problème s'est produit, j'ai jeté rapidement un coup
d'oeil dans les volets "Information sur le processus" et "Verrous / ID de processus". Ceux-ci indiquaient clairement qu'un processus était dans
l'état bloqué (et les autres étaient bloqués cf. la copie d'écran suivante).
En regardant la requête à l'origine du blocage, il me semble (j'ai regardé trop vite et n'ai pas fait fait de capture d'écran) que la requête traitée par ce SPID était de type SELECT sur une table que j'appellerai T1. Par contre ce qui est sûr, c'est que les autres SPID bloqués par celui-ci essayaient de faire un update sur cette table T1, sur un même "secteur de données". Alors que d'autres SPID pouvaient continuer à faire des updates sur la même table mais sur un autre "secteur de données".
Lorsque le blocage s'est levé au bout de 10 bonnes minutes (jusqu'à 30minutes les fois précédentes), les autres requêtes en attente ont pu être traitée.
Je suis désormais conscient que pour bien surveiller sa base et pouvoir anticiper voire résoudre plus rapidement ce type de problème, il convient de mettre en oeuvre :
> optimisation du code (j'ai pas la main dessus)
> optimisation des connexions et notamment du timeout de session (j'ai pas la main dessus)
> Montiteur de performance (en cours)
> Trace (en cours)
> monitoring des verrous et blocage (cf. ci-dessous)
Concernant ce dernier point, ayant peu de connaissance en la matière et donc étant mal préparé à l'analyse de ce type de problème, je me suis replongé ce week-end dans "Optimiser SQL Server" de R. Bruchez + tous les papiers de SQL Server. Une chose dont je m'aperçois, c'est que SQL Server 2005/2008 offre plus de faciliter pour traquer ces problèmes que SQL Server 2000 (version dont nous disposons).Ex: pas de vues sys.dm_..... sous 2000.
Enfin, bref, comme il est difficile de faire une trace des requêtes et de tous les verrous (pb de perf et d'analyse aussi), je suis plus simplement en train de faire une PS qui enregistre toutes les x minutes l'état des processus tout en conservant leur dernière requête.
Je me suis inspiré de la PS sp_MSset_current_activity qui utilise les tables master.dbo.sysprocesses et master.dbo.syslockinfo + de DBCC inputbuffer (pour obtenir la dernière requête lancée par le process).
Pensez-vous que ce monitoring est suffisant afin d'identifier les causes du problème ? Je crains qu'il y ait également une question de "contexte" que ma PS ne monitore pas !
Quelques autres interrogations :
> Question 1 : A piori, la requête bloquante serait donc du type SELECT ... J'ai pu identifier l'utilisateur à l'origine du problème et retester
ce qu'il faisait dans les secondes précédant le blocage mais sans parvenir à reproduire les symptômes du problème !
Et comme la session a par défaut comme niveau d'isolation READ COMMITTED, je vois pas ce que je peux faire de plus restrictif !
Pour rappel, la requête est générée par un progiciel : je n'ai donc pas de regard sur le code.
Comment est-il possible d'occasionner un blocage avec un simple SELECT ?
> Question 2 : j'ai essayé ensuite de faire une blocage à partir d'un UPDATE massif (plusieurs minutes) sur la même table et d'essayer de
faire des SELECT sur le même périmètre avec d'autres SPID.
Ce qui m'étonne, c'est qu'au niveau du volet de "Verrous / ID de processus", je n'arrive pas à obtenir la même icône de blocage que celle obtenue lors du problème (celle avec une point d'exclamation).
Pour les deux process, l'icône utilisée est celle du bas. Donc les deux process se voient bloqués mais le 99 ne se voit pas comme bloquant !
Pourquoi ?
Merci d'avance de votre aide.
Partager