SQL Server에 할당된 메모리 개체 확인
- Version : SQL Server 2008, 2008R2, 2012
최근 들어 내가 관리하는 서버에 다음과 같인 Memory pressure라는 에러 로그를 확인 하였다.
이 에러는 무엇 일까? 왜 일어 났을까?
Memory prossure는 SQL Server에서 시스템 메모리의 압박을 받을 때 메모리의 내용을 드릴다운 하여 발생 한다. 나의 경우에는 CLR을 사용하는 부분이 있는데 이 부분에서 개체 할당에 대한 압력 있을 때 발생 한다. (대부분 닷넷 코드를 잘못 만들었을 때 발생 하는 듯 하다.)
그렇다면 현재 할당되어 있는 메모리 개체 정보를 확인 하는 방법은 없을까? 다음 DMV를 통하여 확인 할 수 있다.
SELECT SUM (omo.pages_allocated_count * omo.page_size_in_bytes)/1024 as 'KB_Used', omo.type as 'Memory Object Type', omc.type as 'Memory Clerk Type' FROM sys.dm_os_memory_objects omo join sys.dm_os_memory_clerks omc on omo.page_allocator_address=omc.page_allocator_address GROUP BY omo.type, omc.type, omc.type ORDER BY 1 DESC; |
[Sys.dm_os_memory_objects]
SQL Server에 의해 현재 할당된 메모리 개체를 반환. 메모리 사용을 분석하고 발생 가능한 메모리 손실을 확인하는 데 사용.
- 메모리 개체는 힙으로 메모리 클럭보다 세분화딘 할당 기능을 제공
- 메모리 개체는 메모리 클럭의 페이지 할당자 인터페이스를 사용하여 페이지를 할당
- 가상 또는 공유메모리 인터페이스 사용하지 않음
- 구성 용소는 할당 패턴에 따라 여러 다른 유형의 메모리 개체를 만들의 임의의 크리를 가진 영역을 할당 할 수 있음.
- 메모리 개체의 일반적인 크기는 8KB, 증분 메모리 개체는 512B와 8KB사이의 크기를 가짐
[sys.dm_os_memory_clerks]
- SQL Server 인스턴스에서 현재 활성 상태인 모든 메모리 클럭을 반환.
- SQL Server 메모리 관리자의 계층 구조는 3계층으로 이루어져 있음
메모리 개체 |
메모리 클럭, 메모리 캐시, 메모리 풀 |
메모리 노드 |
- 메모리 노드는 하위 수준 할당자에 대한 인터페이스와 구현을 제공
- SQL Server내에서는 메모리 클럭만 메모리 노드에 액세스 가능. 메모리 노드 인터페이스에 접근하여 메모리 할당
다음 스크립트는 sys.dm_os_virtual_address_dump DMV를 통하여 블록 사이즈를 확인 하는 스크립트 이다.
WITH VAS_Summary AS( SELECT Size = VAS_Dump.Size, Reserved = SUM(CASE(CONVERT(INT, VAS_Dump.Base) ^ 0) WHEN 0 THEN 0 ELSE 1 END), Free = SUM(CASE(CONVERT(INT, VAS_Dump.Base) ^ 0) WHEN 0 THEN 1 ELSE 0 END) FROM (SELECT CONVERT(VARBINARY, SUM(region_size_in_bytes)) [Size], region_allocation_base_address [Base] FROM sys.dm_os_virtual_address_dump WHERE region_allocation_base_address <> 0 GROUP BY region_allocation_base_address
UNION
SELECT CONVERT(VARBINARY, region_size_in_bytes) [Size], region_allocation_base_address [Base] FROM sys.dm_os_virtual_address_dump WHERE region_allocation_base_address = 0x0 ) AS VAS_Dump GROUP BY Size ) SELECT SUM(CONVERT(BIGINT, Size) * Free) / 1024 AS [Total avail mem, KB], CAST(MAX(Size) AS BIGINT) / 1024 AS [Max free size, KB]FROM VAS_Summary WHERE FREE <> 0 |
CLR, 확장 저장 프로시저 사용 등 외부 메모리를 사용하는 경우 메모리에 대한 이슈를 잘 고려하여 사용 할 수 있도록 한다.
[참고자료]
http://www.sqlserver-dba.com/2013/03/memory-objects-allocated-by-sql-server.html
http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/
2013-03-29 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server 네트워크 백업 트러블슈팅(UNC 설정) (0) | 2015.07.20 |
---|---|
SQL Server 인증 실패시 반환되는 클라이언트 메시지 정보 (0) | 2015.07.20 |
SQL Server 비동기 업데이트 활성 / 비활성에 따른 특성 (0) | 2015.07.20 |
DBCC CHECKDB와 Compute Column 인덱스의 성능 관계 (0) | 2015.07.20 |
Collation에 따른 DMV 실행 오류 (0) | 2015.07.20 |