web-dev-qa-db-fra.com

Comment suivre le blocage qui se produit pour moins d'un Second - SQL Server

J'essaie de résoudre un problème de blocage qui arrive depuis moins d'une seconde. Le OLTP Application est très sensible et doit avoir une durée de réponse inférieure à 200ms pour certaines transactions conformément à la SLA convenue. Nous avons eu des problèmes d'escalade de verrouillage avec la nouvelle version du code que nous avons pu Pour résoudre avec la réduction de la taille du lot dans les mises à jour. Même avec la petite taille du lot, nous soupçonnons que le nouveau SP bloque les mêmes lignes que le OLTP Transactions est mise à jour.

J'ai besoin de trouver la session qui est bloquée et la ressource qui l'attend. Selon ma compréhension, le seuil de processus bloqué "peut définir un minimum de 1 seconde et il nera donc pas capturer le blocage.

J'essaie d'expérimenter avec wait_info et wait_comptez-les x événements.

Y a-t-il une autre façon que nous puissions suivre cela. Merci

14
jesijesi

Comme vous êtes spécifiquement intéressé par le verrouillage plutôt que le général attend le locks_lock_waits Événement prolongé semble plus approprié.

Avec un filtre sur increment >= 200

CREATE EVENT SESSION [locks_lock_waits] ON SERVER 
ADD EVENT sqlserver.locks_lock_waits(
        ACTION(sqlserver.sql_text)
            WHERE  ( [sqlserver].[is_system] = 0
                     AND [increment] >= 200
                     AND [counter] <= 1000 ) 
    )
ADD TARGET package0.ring_buffer;

GO

ALTER EVENT SESSION [locks_lock_waits]  
ON SERVER  STATE = start;  

Ce qui précède rassemble les déclarations en attente des serrures pour le seuil de temps mais ne donne pas la ressource de verrouillage spécifique.

Je n'ai jamais utilisé cet événement et n'ai pas de perspicacité de la hauteur de la hauteur de cette session sur votre serveur de production.

J'ai trouvé cette vidéo sur le sujet. Cela recommande fortement de filtrer sur counter pour réduire le nombre d'événements collectés et je l'ai fait ci-dessus.

Il mentionne également une ancienne commande non documentée héritage

dbcc lock(StallReportThreshold, 200) -- 200 is threshold in ms

Lequel (si le drapeau de trace 3605 est activé) décharge des informations limitées telles que ci-dessous sur le journal des erreurs SQL Server.

Processus 53 Attendu 6844 MS pour S LOCK sur RID: 2: 1: 120: 2 Résultat: Okwait

Je viens de mentionner cela en passant comme des événements étendus seraient clairement préférables de toute façon, car il est documenté et beaucoup plus puissant.

10
Martin Smith

Si vous êtes intéressé par le verrouillage, plusieurs événements étendus sont disponibles:

lock_acquired
lock_released
lock_escalation

Les deux premiers événements ont une colonne duration (microsecondes) que vous pourriez filtrer sur vos seuils. Ils ont aussi un resource_description action qui vous donnera des détails sur les ressources impliquées.

Le lock_escalation événement a également une action statement que vous pouvez ajouter pour collecter l'instruction T-SQL qui a déclenché l'escalade de verrouillage. Cela a aussi escalation_cause. Voici une session d'échantillon:

CREATE EVENT SESSION [locking] ON SERVER 
ADD EVENT sqlserver.lock_acquired( SET collect_resource_description = (1) ),
ADD EVENT sqlserver.lock_escalation( SET collect_statement = (1) ),
ADD EVENT sqlserver.lock_released( SET collect_resource_description = (1) )
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

Je soupçonne qu'il y a probablement une raison pour laquelle vous ne pouvez pas définir le seuil de rapport de processus bloqué à moins d'une seconde: le verrouillage est parfaitement normal dans un SGBM - le moteur de base de données doit verrouiller les ressources afin de les protéger. Bien qu'il n'y ait pas une définition officielle quant au blocage de la verrouillage, verrouillez-vous sur la sous-seconde, vous semble-t-il une sorte de normale.

5
wBob