SQL Server 확장 이벤트 소개

SQL Server 확장 이벤트는 서버 시스템을 위한 일반적인 이벤트 처리 시스템입니다. 확장 이벤트 인프라는 SQL Server 데이터와의 연계가 가능하고 특정 조건에서는 운영 체제 및 데이터베이스 응용 프로그램 데이터와 연계해서 사용할 수 있는 기능도 지원합니다. 후자의 경우 운영 체제 또는 응용 프로그램 이벤트 데이터와 이벤트 데이터의 상관 관계를 분석하기 위해 확장 이벤트 출력을 ETW(Windows용 이벤트 추적)로 전송해야 합니다.

모든 응용 프로그램에는 응용 프로그램 내부 및 외부 모두에서 유용한 실행 지점이 있습니다. 응용 프로그램 내부에서는 비동기 처리 시 태스크의 초기 실행 중에 수집된 정보를 사용하여 태스크를 큐에 추가할 수 있습니다. 응용 프로그램 외부의 경우 실행 지점은 모니터링되는 응용 프로그램의 동작 및 성능 특성에 대한 정보를 모니터링 유틸리티에 제공합니다.

확장 이벤트는 프로세스 외부에서의 이벤트 데이터 사용을 지원하며 이러한 데이터는 일반적으로 다음에서 사용됩니다.

  • SQL 추적 및 시스템 모니터와 같은 추적 도구

  • Windows 이벤트 로그 또는 SQL Server 오류 로그 등의 로깅 도구

  • 제품을 관리하거나 제품의 응용 프로그램을 개발하는 사용자

확장 이벤트의 디자인 및 기능

확장 이벤트는 다음과 같은 주요 요소를 고려하여 디자인되었습니다.

  • 확장 이벤트 엔진은 이벤트 내용에 제한을 받지 않으므로 모든 이벤트를 모든 대상에 바인딩할 수 있습니다. 확장 이벤트 엔진에 대한 자세한 내용은 SQL Server 확장 이벤트 엔진을 참조하십시오.

  • 이벤트는 확장 이벤트의 대상이라고 하는 이벤트 소비자와 분리됩니다. 따라서 모든 대상이 모든 이벤트를 수신할 수 있습니다. 또한 발생한 모든 이벤트는 대상에서 자동으로 소비하여 로깅하거나 추가 이벤트 컨텍스트를 제공할 수 있습니다. 자세한 내용은 SQL Server 확장 이벤트 대상을 참조하십시오.

  • 이벤트는 이벤트가 발생할 때 실행되는 동작과 분리됩니다. 따라서 모든 이벤트에 모든 동작을 연결할 수 있습니다.

  • 조건자는 이벤트 발생을 동적으로 필터링하여 확장 이벤트 인프라의 유연성을 높일 수 있습니다. 자세한 내용은 SQL Server 확장 이벤트 패키지를 참조하십시오.

확장 이벤트는 이벤트 데이터를 동기적으로 생성하고 데이터를 비동기적으로 처리하여 유연한 이벤트 처리 솔루션을 제공합니다. 또한 확장 이벤트는 다음 기능도 지원합니다.

  • 사용자가 문제 해결을 위해 특정 이벤트를 격리할 수 있도록 허용하면서 서버 시스템 전체에 걸친 이벤트 처리에 적용할 수 있는 통합된 접근 방식

  • 기존 ETW 도구와의 통합 및 지원

  • Transact-SQL을 기반으로 완전한 구성이 가능한 이벤트 처리 메커니즘

  • 활성 프로세스에 거의 영향을 주지 않고 동적으로 이를 모니터링할 수 있는 기능

ETW와 함께 확장 이벤트 사용

운영 체제와 데이터베이스 응용 프로그램의 데이터에 대한 상관 관계를 분석하는 데 확장 이벤트를 사용하려는 경우 먼저 ETW에 대한 실무 지식을 갖추는 것이 좋습니다. ETW는 확장 이벤트와 함께 사용되거나 확장 이벤트의 이벤트 소비자로 사용될 수 있습니다. 다음 항목을 출발점으로 삼아 ETW에 대한 배경 지식을 얻을 수 있습니다.

확장 이벤트 사용 시나리오

여러 가지 모니터링 및 문제 해결 시나리오에 확장 이벤트를 사용할 수 있습니다. 다음 시나리오에서는 확장 이벤트가 문제를 해결하는 데 중요한 데이터를 제공할 수 있는 몇 가지 상황에 대해 설명합니다.

  • 작업 집합 잘림 현상의 원인 파악

  • 과도한 CPU 사용 현상의 원인 파악

  • 교착 상태 원인 파악

  • Windows ETW 로그를 사용하여 요청 작업의 상관 관계 파악

작업 집합 잘림 현상의 원인 파악

프로덕션 서버에 심각한 성능 문제가 발생하여 클라이언트 응용 프로그램의 시간이 초과되는 문제를 겪고 있다고 가정해 보겠습니다. 이러한 문제는 일시적인 것으로 보이며 성능은 10에서 15분 후에 정상으로 되돌아옵니다.

SQL Server 오류 로그를 검사한 결과 다음과 같은 오류 메시지를 발견했습니다.

"서버 프로세스의 주요 부분이 페이지 아웃되었습니다. 이로 인해 성능이 저하될 수 있습니다. 기간: 300초. 현재 메모리 사용률 34%."

"IOCP 수신기가 잠겨 있습니다."

[!참고]

IOCP는 "IO 완료 포트"입니다. 이 포트는 네트워크를 통한 사용자 요청을 처리합니다. 메시지는 완료 포트가 마지막 1분간 차단되었음을 나타냅니다.

SQL Server가 서버의 메모리 부족에 충분히 빠르게 응답하고 있지 않다고 의심되어 작업 관리자로 메모리를 검사해 보니 서버의 메모리는 사용하기에 충분해 보입니다. SQL Server Management Studio에서 데이터베이스에 연결을 시도해 보았지만 연결 시도 시간이 초과되며 Windows 명령 프롬프트에서 SQLCMD - A 명령을 실행하면 서버에 연결할 수 있습니다. 이렇게 하면 관리자 전용 연결 세션이 열립니다.

확장 이벤트를 사용하여 추가 정보를 보려고 합니다. 다음과 같은 확장 이벤트 세션을 만듭니다.

  • 시스템 메모리 신호 및 총 서버 메모리 변경에 대한 이벤트를 추가합니다.

  • 출력을 ETW로 보냅니다. 이러한 출력은 페이지 파일 또는 SQL Server 데이터베이스 파일이 사용하지 않는 드라이브의 파일에 기록됩니다.

Windows 명령 프롬프트에서 모든 메모리 이벤트에 대한 Windows 커널 ETW 추적을 활성화하는 명령을 실행합니다. 추적이 몇 분 동안 실행되도록 한 다음 확장 이벤트 세션 및 Windows 커널 추적을 닫습니다.

tracerpt.exe를 사용하여 Windows 추적과 SQL Server ETW 추적의 공통된 부분을 찾습니다. 시스템 메모리가 부족하면 알리도록 설정된 이벤트를 찾아보지만 찾을 수 없습니다. 대신 서버의 모든 프로세스에 수많은 페이지 폴트가 있음을 발견합니다. 페이징 바로 전에 발생한 이벤트를 검사한 결과 드라이버의 메모리 할당 요청에 대한 응답으로 모든 프로세스의 작업 집합이 잘린 사실을 발견합니다.

과도한 CPU 사용 현상의 원인 파악

프로덕션 시스템에서 과도하게 CPU를 사용하는 현상의 원인을 조사하고 있다고 가정해 보겠습니다. 과도한 CPU 사용이 시스템에서 실행된 쿼리 때문인지 알아내기 위해 다양한 DMV(동적 관리 뷰)를 사용해 본 결과 대부분의 쿼리가 임시 사용자 쿼리임을 알게 되었습니다. DMV를 통해 얻은 정보는 문제를 진단하기에 충분하지 않습니다.

다음과 같은 확장 이벤트 세션을 만듭니다.

  • CPU 임계값을 지정하는 조건자를 사용하여 문 종료에 대한 이벤트를 활성화합니다.

  • 이벤트가 발생할 때만 쿼리 계획을 수집하는 동작을 사용합니다.

  • 수집된 모든 데이터를 파일에 기록합니다. 이 파일은 로그 또는 데이터베이스 파일이 없는 드라이브에 저장됩니다.

확장 이벤트 세션을 시작하고 출력을 검사해 보면 CPU 문제의 원인이 자주 조인되는 두 테이블 사이의 데이터 형식 변환 때문임을 확인할 수 있습니다.

교착 상태 원인 파악

사용자에게서 특정 응용 프로그램이 교착 상태 오류를 발생시키고 있음을 나타내는 보고서를 받았다고 가정해 보겠습니다. 이러한 문제를 최대한 효과적으로 해결하려면 가장 자주 발생하는 교착 상태에 초점을 맞추어야 합니다. 다음과 같은 확장 이벤트 세션을 만듭니다.

  • 세션에 대한 교착 상태 이벤트 추적을 구성합니다.

  • 교착 상태의 식별자를 기준으로 집계를 수행하는 대상을 지정합니다.

확장 이벤트 세션을 실행하고 추가 교착 상태가 보고되면 각 발생지에 대한 완벽한 XML 교착 상태 그래프와 함께 집계된 교착 상태 정보를 얻을 수 있습니다. 이 정보를 사용하여 가장 일반적으로 발생하는 교착 상태를 찾아 해결 작업을 시작할 수 있습니다.

Windows ETW 로그를 사용하여 요청 작업의 상관 관계 파악

프로덕션 서버의 응용 프로그램 속도 저하 문제를 분석하던 중 문제의 원인이 긴 디스크 읽기 시간 때문임을 파악한 경우 다음과 같은 확장 이벤트 세션을 만듭니다.

  • 디스크 읽기를 세션 이벤트로 추가합니다.

  • ETW에 수집된 데이터를 전송합니다.

확장 이벤트를 시작한 후 Windows ETW 커널 추적을 실행합니다. 10분 후 두 세션을 모두 중지합니다.

tracerpt.exe를 사용하여 Windows 추적과 SQL ETW 추적을 병합합니다. 병합된 추적을 통해 두 추적 간의 상관 관계를 파악하고 SQL Server에서 Windows 커널로의 읽기 요청을 추적할 수 있습니다. 이러한 분석 결과 I/O 요청이 SQL Server로 다시 반환되기 전에 긴 대기 시간이 있음을 알게 되었다면 이러한 정보를 사용하여 I/O 문제가 물리적 I/O 경로 때문이라는 결론을 내릴 수 있습니다.