1 초 미만 동안 발생하는 차단을 추적하는 방법-SQL Server


14

1 초 이내에 발생하는 차단 문제를 해결하려고합니다. OLTP 애플리케이션은 매우 민감하며 합의 된 SLA에 따라 일부 트랜잭션에 대해 200ms 미만의 응답 시간을 가져야합니다. 업데이트에서 배치 크기를 줄이면 해결할 수있는 새로운 코드 릴리스에서 잠금 에스컬레이션 문제가 발생했습니다. 배치 크기가 작더라도 새 sp가 OLTP 트랜잭션이 업데이트하는 동일한 행을 차단하고 있다고 의심합니다.

차단 된 세션과 대기중인 리소스를 찾아야합니다. 내 이해에 따라 "차단 프로세스 임계 값"은 최소 1 초 동안 설정할 수 있으므로 차단을 캡처하지 않습니다.

wait_info 및 wait_completed x 이벤트를 실험 중입니다.

우리가 이것을 추적 할 수있는 다른 방법이 있습니까? 감사


같은 사용자에 의해 같은 질문에 같은 stackoverflow.com/questions/38407021/…
— TheGameiswar

답변:


10

일반적이 아닌 잠금에 특히 관심이 있으므로 locks_lock_waits확장 된 이벤트 사운드가 더 적합 할 때 까지 기다립니다 .

필터를 켠 상태 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;  

위의 문은 임계 시간 동안 잠금을 기다리는 명령문을 수집하지만 특정 잠금 리소스를 제공하지는 않습니다.

이 이벤트를 사용한 적이 없으며이 세션이 프로덕션 서버에서 얼마나 많은 오버 헤드를 유발하는지에 대한 통찰력이 없습니다.

주제 에서이 비디오 를 찾았습니다 . counter수집되는 이벤트 수를 줄이려면 필터링을 사용하는 것이 좋습니다 .

또한 문서화되지 않은 오래된 레거시 명령에 대해서도 언급합니다.

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

(추적 플래그 3605가 활성화 된 경우) 다음과 같은 제한된 정보를 SQL Server 오류 로그에 덤프합니다.

프로세스 53은 RID에서 S 잠금을 위해 6844ms를 기다렸습니다 : 2 : 1 : 120 : 2 결과 : OKWAIT

어쨌든 확장 이벤트가 문서화되고 훨씬 강력하기 때문에 분명히 확장 이벤트가 바람직하기 때문에 이것을 언급합니다.


locks_lock_waits를 테스트했으며 리소스 정보가 없다고 말했듯이. 그러나 나는 증가가 시간이라는 것을 몰랐다. 좋은 정보 dbcc 잠금, 멋지게 보입니다. 정보가 오류 로그에 덤프되기 전에 사용 가능한 정보의 길이를 알고 있습니다.
— jesijesi

미안, 나는 내 자신을 명확하게하지 않았다. dbcc lock 명령을 실행할 때까지 얼마나 걸리는지 묻습니다. 예를 들어 잠금이 발생하고 한 시간 후에 dbcc 잠금을 실행해도 여전히 정보를 얻습니까?
— jesijesi

@ jesijesi-오늘 전에는 들어 본 적이 없습니다. 더 이상 정보가 없습니다. 나는 그것을 비활성화하기 위해 전달할 매개 변수조차 모른다. 그러나 dbcc lock(StallReportThreshold, 200) 추적 플래그 3605가 활성화되어 있으면 임계 값이 초과되면 먼저 실행 하고 정보를 출력합니다. 나중에 실행할 수 있도록 SQL Server는이 정보를 수집하지 않습니다.
— Martin Smith

2
감사. xevents에서 resource_0,1,2 값을 변환하는 유용한 기능이있는 링크를 추가하기 만하면됩니다. sqlnotes.info/2011/10/24/…
— jesijesi

5

잠금에 관심이있는 경우 사용 가능한 몇 가지 확장 이벤트가 있습니다.

lock_acquired
lock_released
lock_escalation

처음 두 이벤트에는 duration임계 값으로 필터링 할 수 있는 열 (마이크로 초)이 있습니다. 또한 resource_description관련 리소스에 대한 세부 정보를 제공 하는 작업이 있습니다.

lock_escalation이벤트도 가지고 statement당신이 잠금 에스컬레이션을 트리거 한 T-SQL 문을 수집하기 위해 추가 할 수있는 조치를. 또한 있습니다 escalation_cause. 샘플 세션은 다음과 같습니다.

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

차단 된 프로세스 보고서 임계 값을 1 초 미만으로 설정할 수없는 이유가있을 수 있습니다. RDBMS에서는 잠금이 완벽하게 정상입니다. 데이터베이스 엔진은이를 보호하기 위해 리소스를 잠 가야합니다. 잠금이 차단되는 순간에 대한 공식적인 정의는 없지만 1 초 미만의 잠금 틱은 정상적인 것 같습니다.


1
다른 사람이 리소스에 대한 액세스를 거부하고 잠금으로 인해 대기해야하는 즉시 잠금이 차단됩니다.
— Martin Smith

감사합니다. 기간 필드와 함께 lock_acquired를 사용할 계획입니다.
— jesijesi

행운을 빕니다. SQL Server 2014에서 기본적으로 컴파일 된 저장 프로 시저와 함께 메모리 내 OLTP 테이블을 사용하면 고성능 래치없는 옵션을 제공 할 수 있습니다. 스냅 샷 격리를 볼 수도 있습니다.
— wBob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.