버퍼 풀 외부의 SQL Server 2012 메모리 소비


10

최대 20GB의 메모리를 소비하는 SQL Server 2012 SP2 Enterprise Edition 인스턴스가 있습니다. 메모리 제한. 인스턴스는 65GB로 제한되어 있지만 아래 쿼리에서 사용중인 실제 메모리는 86GB입니다.

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

서버는 2 개의 NUMA 노드로 물리적입니다. 버퍼 풀 외부에서 메모리를 소비하는 것을 찾을 수있는 방법이 있습니까?

DBCC MEMORYSTATUS의 출력은 다음과 같습니다.

DBCC MEMORYSTATUS 출력

설정된 메모리 제한은 다음과 같습니다.

메모리 제한의 스크린 샷

미리 감사드립니다.

업데이트 :-Aaron이 제안한 쿼리를 실행했습니다.

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

출력은 다음과 같습니다.

MemoryClerkOutput

pages_kb의 합은 ~ 60GB입니다.

업데이트 2 :-DBCC MEMORYSTATUS의 전체 출력은 다음과 같습니다 .- http://pastebin.com/nGn6kXEc

업데이트 3 : 엑셀 파일의 Shanky 스크립트 출력 : http://jmp.sh/LKRlH4K

업데이트 4 :-스크린 샷 :-

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

PhysMemInUse 스크린 샷

따라서 이것은 SQL Server가 65GB 이상을 사용하고 있음을 나타냅니다.


이 결과는 무엇입니까? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand

안녕하세요 Aaron, 답변 주셔서 감사합니다. 이제 출력으로 질문을 업데이트하겠습니다
dbafromthecold

답변:


11

최대 서버 메모리는 버퍼 풀 및 모든 페이지 크기 할당을 제어 하지만 직접 Windows 할당 (링크 된 서버, sp_OA, XP), 스레드 / 스레드 스택에 필요한 메모리 등은 제어하지 않습니다 .

아마도 NUMA에서 더 높을 것으로 예상 할 수 있습니다 (20GB가 정상인지 확실하지는 않지만). 요점은 max server memory가 SQL Server 인스턴스에서 사용하는 메모리를 완전히 제어 할 것으로 기대할 수 없다는 것입니다. 버퍼 풀, 계획 캐시 및 CLR뿐만 아니라 전체 인스턴스가 64GB를 넘지 않게하려면 최대 서버 메모리를 더 낮게 설정해야합니다.

이것을 추적하기위한 몇 가지 잠재적 인 아이디어 (모든 것을 MB로 표준화 할 것입니다) :

  • 성능 카운터

    여기에 너무 큰 것이 있는지 확인하십시오.

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • 상위 20 명

    이미 완료했지만 완전성을 위해 다음을 수행하십시오.

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • 스레드 스택 크기

    먼저이 값이 0이 아닌 사용자 지정 숫자가 아닌지 확인하십시오 (0이 아닌 경우 이유를 찾아서 수정).

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    그러나 다음을 사용하여 스레드 스택이 차지하는 메모리 양을 확인할 수 있습니다.

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • 타사 모듈로드

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • 메모리 관련 DMV

    다음 DMV를 보면 평범하지 않은 것을 발견 할 수도 있습니다.

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

이 문서는 SQL Server 2012 이전에 작성되었으므로 일부 열 이름과 계산을 조정해야 할 수도 있지만 시도 할 다른 방법이있을 수도 있습니다.

해당 사이트의 다른 기사에서 좋은 배경 지식도 있습니다.

외부에서 메모리를 사용하는 유형에 max server memory대한 유용한 정보 (실제 사용량을 수집하는 방법에 대한 데이터는 없음) :


고마워 Aaron, 서버에 사용 가능한 메모리가 충분하기 때문에 20GB를 사용하고있는 것을 찾을 수 있는지 확인하고 싶었습니다. 다이렉트 Windows 할당 또는 스레드 스택의 메모리 소비를 식별하는 방법이 있습니까?
dbafromthecold

스크립트를 실행했으며 Stolen Server Memory (KB) 카운터는 14GB입니다. 더 자세한 정보를 얻을 수 있는지 알아보기 위해 파헤쳐 보자
dbafromthecold

도난 된 서버 메모리가 문제가되지 않는 것 같습니다. 아직도 찾고
dbafromthecold

여기서 문제는 아니지만 Columnstore Object Pool (CACHESTORE_COLUMNSTOREOBJECTPOOL 메모리 클러 크 유형)이 버퍼 풀 외부에 있다는 것도 언급 할 가치가 있습니다. 참조 니코 노이게 바우어에서이 블로그 게시물
블라 Dakskobler

@ BlažDakskobler 예, 감사합니다. 메모리 내도 마찬가지입니다. 기회가있을 때 게시물을 업데이트하겠습니다
Aaron Bertrand

3

Bob Dorr에서 SQL Server 2012의 Max 서버 메모리가 제어하는 ​​내용에 대한 정의를 얻었습니다. 온라인 설명서 를 읽을 수도 있습니다 자세한 내용은

최대 서버 메모리는 버퍼 풀, 컴파일 메모리, 모든 캐시, qe 메모리 부여, 잠금 관리자 메모리 및 CLR 메모리 (기본적으로 dm_os_memory_clerks에있는“클라크”)를 포함하여 SQL Server 메모리 할당을 제어합니다. 스레드 스택, 메모리 힙, SQL Server 이외의 연결된 서버 공급자 또는 "비 SQL Server"DLL에 의해 할당 된 메모리에 대한 메모리는 max server memory에 의해 제어되지 않습니다.

스레드 스택, 타사 DLL, Microsoft의 MySQL 이외의 링크 된 서버 공급자 (MySQL.PostgreSQL 등) 또는 SQL Server가 아닌 SQL Server 주소 공간에로드 된 DLL에 할당 된 메모리는 최대 서버 메모리 외부에 할당됩니다. SQL Server 2012의 IIRC 백업 작업에도 여전히 버퍼 풀 외부의 메모리가 할당됩니다.

링크 된 서버를 사용하여 다른 RDBMS를 쿼리하고 있습니까? 동일한 Windows 시스템에 설치된 다른 소프트웨어 일부 공유 위치에 다음 쿼리의 결과를 게시 할 수 있습니까

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

DBCC MMEMORYSTATUS일부 공유 위치에 전체 출력을 업로드 하고 여기에 링크를 게시 할 수 있습니까? 이것은 어떤 구성 요소가 메모리를 사용하는지 이해하는 데 도움이됩니다.

편집 : dbcc memorystatus 출력에 따라 2 개의 NUMA 노드를 볼 수 있으며 각 노드에서 사용하는 메모리는 약

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

memorystatus 출력에 Memory Manager가 표시되면

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

실제로 커밋 된 VM은 SQL Server에서 커밋 한 가상 메모리이며이 메모리가 커밋되므로이 메모리가 커밋됩니다 physical memory backing it. 이것은 다시 SQL Server가 최대 서버 메모리에 설정된 65G를 사용하고 있다고 생각하게합니다.

이것이 최대 서버 메모리입니다. 따라서 메모리가 두 노드 사이에 잘 ​​분산되어 있으므로 아래의 쿼리 jut 출력을 추가하여 확인할 수도 있습니다. 스크린 샷을 추가하십시오

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

@DBAFromTheCold : 예 내가주고 싶은 경우에, 그 말하지만 당신은 여전히 답을 찾고있는 또 하나의 시도 : 당신의 완전한 출력을 게시 할 수select * from sys.dm_so_process_memory
Shanky

안녕하세요 Shanky, 답변 주셔서 감사하지만 문제가 자체 해결되었습니다. 내 생각에 SQL 자체는 메모리를 해제하지 않았습니다. 서버를 모니터링하고 있는데 다시 발생하면 업데이트를 게시합니다. 정말로 이것의 바닥에 도달하고 싶습니다.
dbafromthecold
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.