확장 이벤트 탐색
Azure SQL의 확장 이벤트 엔진은 데이터베이스 및 서버에서의 작업에 대한 세부적인 정보를 캡처할 수 있는 경량이면서도 강력한 모니터링 시스템입니다. Azure 플랫폼의 모니터링 솔루션을 사용하면 사용자 환경에 대한 강력한 모니터링을 쉽게 구성하고 오류 조건에 대한 자동화된 응답을 제공할 수 있습니다.
확장 이벤트는 쿼리를 추적하도록 하고 모니터링할 수 있는 추가 데이터(이벤트)를 제공하여 SQL Server Profiler의 기능을 기반으로 빌드합니다. 확장 이벤트를 사용하여 해결할 수 있는 문제의 예는 다음과 같습니다.
- 차단 및 교착 상태 성능 문제 해결
- 장기 실행 쿼리 식별
- DDL(데이터 정의 언어) 작업 모니터링
- 누락된 열 통계 로깅
- 데이터베이스에서 관찰된 메모리 압력
- 장기 실행 중인 실제 I/O 작업
또한 확장 이벤트 프레임워크에서는 데이터 컬렉션의 오버헤드를 줄이기 위해 필터를 사용하여 수집하는 데이터의 양을 제한하고, 특정 영역에 초점을 지정하여 성능 문제를 더욱 쉽게 식별할 수 있습니다.
다음은 Azure SQL Database에서 생성된 확장 이벤트 세션의 예입니다.
위의 이미지에서 xe_deadlocks는 AdventureWorks 데이터베이스(이미지 왼쪽)에서 실행되는 확장 이벤트 세션의 이름입니다. 이벤트 세션 노드 아래에 있는 event_counter 대상 노드는 이벤트 세션에서 각 이벤트의 발생 횟수를 계산합니다. SSMS 개체 탐색기에서 대상 데이터를 보려면 대상 노드를 마우스 오른쪽 단추로 클릭한 다음 대상 데이터 보기를 선택합니다. SSMS에 이미지의 왼쪽에 표시된 것과 같은 데이터와 각 이벤트의 개수 결과가 표시됩니다.
Azure SQL Database의 확장 이벤트에 대한 자세한 내용은 Azure SQL Database 확장 이벤트를 참조하세요.
확장 이벤트를 사용하면 무엇을 모니터링할 수 있나요?
확장 이벤트는 SQL Server의 전체 노출 영역을 다루며 이벤트의 대상을 정의하는 4개 채널로 나뉩니다.
- 관리자 - 관리자 이벤트는 최종 사용자와 관리자를 대상으로 합니다. 포함된 이벤트는 관리자가 수행할 수 있는 잘 정의된 작업 세트 내에 문제가 있음을 의미합니다. 교착 상태의 근본 원인을 파악하는 데 도움이 되는 XML 교착 상태 보고서를 생성하는 것을 예로 들 수 있습니다.
- 작업 - 작업 이벤트는 분석과 진단 문제나 일반적인 문제에 사용되며, 이벤트 발생을 기반으로 작업을 트리거하는 데 사용할 수 있습니다. 작업 이벤트의 예로는 가용성 그룹이 변경 중인 데이터베이스가 있으며, 이는 장애 조치(failover)를 나타냅니다.
- 분석 - 분석 이벤트는 일반적으로 성능 이벤트와 관련이 있으며 많은 양이 게시됩니다. 분석 이벤트의 예로 저장 프로시저 또는 쿼리 실행 추적을 들 수 있습니다.
- 디버그 - 디버그 이벤트는 완전히 문서화되지 않는 경우도 있으며, Microsoft 지원과 함께 문제를 해결하는 경우에만 사용해야 합니다.
이벤트는 여러 이벤트를 호스트할 수 있는 세션에 추가됩니다. 일반적으로 여러 이벤트는 관련 정보 세트를 캡처하기 위해 세션에서 함께 그룹화됩니다.
아래 쿼리를 실행하여 사용 가능한 이벤트, 작업 및 대상의 목록을 가져올 수 있습니다.
SELECT
obj.object_type,
pkg.name AS [package_name],
obj.name AS [object_name],
obj.description AS [description]
FROM sys.dm_xe_objects AS obj
INNER JOIN sys.dm_xe_packages AS pkg ON pkg.guid = obj.package_guid
WHERE obj.object_type in ('action', 'event', 'target')
ORDER BY obj.object_type,
pkg.name,
obj.name;
확장 이벤트 세션 만들기
이제부터 SQL Server Management Studio의 새 세션 대화 상자를 사용하여 확장 이벤트 세션을 만드는 기본 프로세스를 살펴봅니다. SSMS에서 관리 노드를 확장하고 확장 이벤트 노드를 확장한 다음 세션을 마우스 오른쪽 단추로 클릭하고 새 세션을 선택하면 이 화면에 액세스할 수 있습니다.
위의 이미지는 확장 이벤트 기능에 대한 새 세션 대화 상자를 보여줍니다. 먼저 세션의 이름을 지정해야 합니다. SQL Server는 다음과 같은 범주로 그룹화되는 다양한 템플릿을 제공합니다.
- 잠금 및 차단
- Profiler와 동일한 기능
- 쿼리 실행
- 시스템 모니터링
미리 정의된 템플릿을 사용하면 모니터링에 확장 이벤트 사용을 빠르게 시작할 수 있습니다. 이 예에서는 모든 옵션을 살펴보기 위해 세션에 수동으로 추가되는 이벤트를 살펴보지만 확장 이벤트를 사용하기 시작하면 템플릿을 사용하여 쉽게 기본 세션을 만들 수 있습니다.
이 세션을 시작하는 경우 몇 가지 확인란 옵션이 있습니다. 서버가 시작될 때마다 새 세션을 시작하도록 선택하고, 세션을 만드는 즉시 시작하도록 선택할 수도 있습니다. 관리자는 언제든지 SQL Server Management Studio의 확장 이벤트 노드를 통해 확장 이벤트 세션을 시작하고 중지할 수 있습니다. 또한 인과 관계 추적을 사용하도록 설정하는 옵션이 있어, 각 이벤트의 출력에 GUID(Globally Unique Identifier), 시퀀스 번호를 추가하면 이벤트가 발생한 순서를 쉽게 단계별로 진행할 수 있습니다.
위의 이미지는 세션에 이벤트를 추가하는 화면을 보여 줍니다. 이벤트는 데이터베이스 엔진 코드 내의 관심 지점을 나타내는데, 전적으로 내부 시스템 작업을 나타내거나 쿼리 실행과 같은 사용자 작업과 관련이 있을 수 있습니다. 위의 예에서는 이벤트 세션에 sp_statement_completed
, sql_batch_completed
, sql_statement_completed
의 세 가지 이벤트가 추가된 것을 볼 수 있습니다. 기본적으로 이 세션은 인스턴스에서 발생하는 이와 같은 이벤트의 모든 인스턴스를 캡처합니다. 구성 단추를 클릭하여 컬렉션을 제한할 수 있습니다.
이벤트 구성 화면에서는 이벤트와 관련된 경우 수집하는 데이터를 정의할 수 있습니다. 전역 필드를 사용하면 이벤트가 발생할 때 수집하는 데이터를 선택할 수 있습니다. 전역 필드는 작업이라고도 하는데 이벤트에 데이터 필드를 추가하는 작업이기 때문입니다. 전역 필드는 확장 이벤트가 발생하는 경우 수집되는 데이터를 나타내며 대부분의 확장 이벤트에서 공통적입니다. 아래 이미지는 확장 이벤트에 대한 필터 옵션을 보여 줍니다.
필터는 세분화된 제어를 사용하여 캡처하려는 이벤트의 특정 발생만 캡처할 수 있는 확장 이벤트의 강력한 기능입니다. 이 예에서는 sqlserver.is_system
필드에 필터가 적용된 것을 볼 수 있는데, 여기서 필드 값이 0인데 이는 쿼리가 내부 작업이 아님을 나타냅니다. 즉, 세션은 시스템 연결에서 제출한 문의 완료를 캡처하지 않습니다. 원하는 것은 사용자 또는 사용자 애플리케이션에서 제출한 문만 캡처하는 것입니다.
필터는 단일 이벤트의 필드 하나에만 적용됩니다. 이벤트에 대한 시스템 활동을 추적하지 않도록 하려면 sql_statement_completed
이벤트, sql_batch_completed
이벤트 및 sp_statement_completed
이벤트 각각에 대한 별도의 필터가 필요합니다.
캡처하는 각 이벤트에 대해 필터를 구성하는 것이 좋습니다. 이렇게 하면 데이터 수집의 효율성이 향상되고 검색 범위를 좁힐 수 있습니다.
아래 이미지는 수집된 이벤트 필드를 보여 줍니다. 해당 필드는 트리거 중인 이벤트에만 적용되며 수집할 선택적 필드를 포함할 수 있습니다. 위의 이벤트에서 선택적 수집 옵션은 statement
및 parameterized_plan_handle
입니다.
이벤트 세션을 정의한 후에는 아래 이미지에 나와 있는 것처럼 스토리지 대상을 정의합니다.
확장 이벤트 세션에는 엔진이 이벤트의 발생을 추적하는 위치로 생각할 수 있는 대상이 있습니다. 더 일반적인 대상 두 가지는 이벤트를 저장할 수 있는 파일 시스템의 파일인 이벤트 파일이며, Azure SQL PaaS 제품에서는 이 데이터가 BLOB 스토리지에 기록됩니다. 또 다른 일반적인 대상은 SQL Server의 메모리 내에 있는 링 버퍼입니다. 링 버퍼는 순환 버퍼이고 데이터는 세션을 벗어나면 지속되지 않으므로 이벤트 세션의 라이브 관찰에 가장 일반적으로 사용됩니다. 대부분의 대상은 데이터를 비동기식으로 처리해 이벤트 데이터가 디스크에 보관되기 전에 메모리에 기록됩니다. 예외는 동기적으로 처리되는 ETW(Windows용 이벤트 추적) 대상 및 이벤트 카운터 대상입니다.
다음 표는 각 확장 이벤트 대상 유형에 대한 정보와 사용이 나와 있습니다.
대상 | 설명 | 처리 중 |
---|---|---|
이벤트 카운터 | 확장 이벤트 세션 동안 발생한 모든 이벤트의 수를 셉니다. 이벤트 카운터는 전체 이벤트 컬렉션의 오버헤드 없이 워크로드 특징에 대한 정보를 얻는 데 사용됩니다. | 동기 |
이벤트 파일 | 메모리의 이벤트 세션 출력을 디스크의 영구적 파일에 씁니다. | 비동기 |
이벤트 쌍 | 일반적으로 쌍으로 발생하는 많은 이벤트(예: 잠금 획득, 잠금 해제)와 이 컬렉션을 사용하여 해당 이벤트가 일치하는 세트로 발생하지 않는 경우를 식별하는 데 사용할 수 있습니다. | 비동기 |
ETW(Windows용 이벤트 추적) | SQL Server 이벤트와 Windows OS 이벤트 데이터를 상호 연결하는 데 사용됩니다. | 동기 |
히스토그램 | 이벤트의 발생을 계산하는 이벤트 카운터와 비슷한데, 히스토그램이 특정 이벤트 열 또는 작업을 기준으로 계산될 수 있다는 점이 다릅니다. | 비동기 |
링 버퍼 | 메모리에 데이터를 저장하는 데 사용됩니다. 데이터는 디스크에 보관되지 않으며 버퍼에서 자주 플러시됩니다. | 비동기 |
또는, T-SQL을 사용하여 확장 이벤트 세션을 만들 수 있습니다. 다음 T SQL 명령은 확장 이벤트 세션을 만드는 방법에 대한 예제를 제공합니다.
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name='test_session')
DROP EVENT session test_session ON SERVER;
GO
CREATE EVENT SESSION test_session
ON SERVER
ADD EVENT sqlos.async_io_requested,
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.etw_classic_sync_target (SET default_etw_session_logfile_path = N'C:\demo\traces\sqletw.etl' )
WITH (MAX_MEMORY=4MB, MAX_EVENT_SIZE=4MB);
GO
이벤트 세션의 범위는 서버 또는 데이터베이스로 지정할 수 있습니다. 위에 표시된 예제에서는 이벤트 두 개를 추가하고 파일 위치와 함께 ETW(Windows용 이벤트 추적) 경로를 사용합니다. 세션을 생성된 후 시작해야 합니다. 이를 위해 T SQL에서 STATE
옵션을 사용하여 세션을 ALTER
하거나 SQL Server Management Studio를 사용할 수 있습니다.