SQL Server/SQL Server Tip

SQL Server에 할당된 메모리 개체 확인

SungWookKang 2015. 7. 20. 11:50
반응형

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

 

반응형