이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 2617|회답: 2

[팁] SQL Server는 확장 이벤트를 사용하여 교착 상태를 추적합니다

[링크 복사]
게시됨 2024. 3. 2. 오후 7:13:04 | | | |
요구사항: SQL Server 데이터베이스가 교착 상태를 일으키는 이유는 다양하며, 운영 환경에서는 모두가 교착 상태를 겪을 수 있고, 애플리케이션 교착 상태의 비정상 정보만으로는 구체적인 원인을 찾기 어려울 수 있으므로, SQL Server의 확장 이벤트를 사용하여 교착 상태를 추적하고 교착 발생 시점을 구체적으로 기록하는 것이 필요합니다.

확장 행사 개요

확장 이벤트는 사용자가 모니터링하고 문제 해결에 필요한 데이터를 수집할 수 있게 해주는 경량 성능 모니터링 기능입니다. 이 기능은 성능 모니터링 및 문제 해결 관련 목적을 위해 데이터 엔진의 내부 운영에 대한 세부 정보를 확인할 수 있게 해줍니다.

확장 이벤트(XEvents) 아키텍처를 통해 사용자는 SQL Server, Azure SQL 데이터베이스, Azure SQL 관리 인스턴스의 성능을 모니터링, 식별 또는 문제 해결하는 데 필요한 만큼 많은 데이터를 또는 적게 사용할 수 있습니다. 확장 이벤트는 매우 구성 가능하고, 가볍고, 확장성이 뛰어납니다.

참조:
하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.


교착 상태의 원인

교착 상태는 데이터베이스 내에서 경쟁하는 동시성 잠금, 주로 다단계 거래에서 발생합니다. 각 사용자 세션은 하나 이상의 작업을 대신해 실행 중일 수 있으며, 각 작업은 다양한 자원을 가져오기 또는 대기할 수 있습니다. 다음 유형의 자원들은 차단을 일으키고 결국 교착 상태를 초래할 수 있습니다.

  • 잠금장치: 객체, 페이지, 행, 메타데이터, 애플리케이션 등 자원을 가져오기 위해 잠금이 기다리면 교착 상태를 일으킬 수 있습니다. 예를 들어, 트랜잭션 T1은 r1 행에 공유 잠금(S 잠금)을 가지고 있으며, 행 r2에 대한 독점 잠금(X 잠금)을 받기 위해 기다립니다. 트랜잭션 T2는 r2 행에 공유 잠금(S 잠금)을 가지고 있으며, r1 행에 대한 독점 잠금(X 잠금)을 기다립니다. 이로 인해 T1과 T2가 서로가 잠긴 자원을 해제하기를 기다리는 락 루프가 발생합니다.
  • 워커 스레드: 작업 대기열에 작업 스레드가 있으면 교착 상태가 발생할 수 있습니다. 대기열에 있는 작업의 자원이 모든 워커 스레드를 차단하면 교착 상태가 발생합니다. 예를 들어, 세션 S1이 트랜잭션을 시작하고 r1 라인에 대한 공유 잠금(S-락)을 획득한 후 절전 모드로 전환됩니다. 모든 사용 가능한 워커 스레드에서 실행 중인 활성 세션이 r1 라인에 대한 독점 잠금(X-lock)을 얻으려 시도하고 있습니다. 세션 S1이 워커 스레드를 받을 수 없기 때문에 트랜잭션을 커밋하고 r1 라인의 잠금을 해제할 수 없습니다. 이로 인해 교착 상태가 발생할 수 있습니다.
  • 메모리: 동시 요청이 메모리를 얻기 위해 기다렸을 때 현재 사용 가능한 메모리가 필요를 충족하지 못할 때 교착 상태가 발생할 수 있습니다. 예를 들어, 두 개의 동시 쿼리(Q1과 Q2)는 사용자 정의 함수로 실행되며, 각각 10MB와 20MB의 메모리를 획득합니다. 각 쿼리가 30MB를 요구하고 사용 가능한 총 메모리가 20MB라면, Q1과 Q2는 서로의 메모리가 비워질 때까지 기다려야 하며, 이로 인해 교착 상태가 발생합니다.
  • 병렬 쿼리 및 실행 관련 자원: 일반적으로 스위치 포트와 연관된 처리 조정자, 생성기 또는 소비자 스레드는 병렬 쿼리에 포함되지 않은 프로세스가 적어도 하나 이상 있을 때 서로 차단하여 교착 상태가 발생할 수 있습니다. 또한, 병렬 쿼리가 실행을 시작하면 SQL Server는 현재 워크로드에 따라 병렬성 정도나 워커 스레드 수를 결정합니다. 교착 상태는 예: 서버에서 새로운 쿼리가 실행되기 시작하거나 워커 스레드가 소진되는 등 시스템 워크로드에 예상치 못한 변화가 발생할 수 있습니다.
  • 다중 활동 결과 집합(MARS) 자원: 이 자원들은 MARS에서 다중 활동 요청의 교차 실행을 제어하는 데 사용됩니다.


참조:
하이퍼링크 로그인이 보입니다.

교착 상태 확장 이벤트 기록

다음 명령어로 교착 상태를 기록하는 확장 이벤트를 생성하세요:


교착 상태 이벤트 세션 시작

이벤트 세션 중단

이벤트 세션을 삭제합니다

이벤트 세션 데이터 조회


테스트 교착 상태

테스트용 새로운 Tab1 테이블을 만들고, 두 개의 새로운 실행 창을 만들고, 각각 다음 명령어를 실행하세요:

교착 상태는 다음과 같이 발생합니다:

다른 프로세스와의 트랜잭션(프로세스 ID 68)이 잠긴 자원에서 교착 상태에 빠져 교착 상태로 선택되었습니다. 거래를 다시 실행해 주세요.
트랜잭션(프로세스 ID 68)은 다른 프로세스와 함께 잠금 자원에 교착 상태가 되어 교착 상태가 되었습니다. 거래를 다시 실행하세요.


다음 그림에 표시된 이벤트 세션 데이터를 확인하세요:



상세한 XML 데이터는 다음과 같습니다:


(끝)





이전의:PLINQ 병렬 쿼리를 이용한 .NET/C# 성능 최적화
다음:C# 인터랙티브 창을 이용한 Visual Studio에서의 코드 실행
 집주인| 게시됨 2024. 3. 2. 오후 7:14:35 |
이벤트 파일의 기본 경로를 확장하세요:

C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\deadlock_monitor_0_133538477770860000.xel
 집주인| 게시됨 2024. 3. 2. 오후 7:16:54 |
SQL 스크립트를 테스트할 새로운 tab1 테이블을 생성하세요

면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com