모든 메모리를 사용하지 않는 SQL Server


10

최대 메모리 가 6GB로 설정된 SQL Server 2014가 있습니다 (실제 메모리는 8GB).

대상 서버 메모리는 때때로 6기가바이트하고 다시 방울 총 서버 메모리 (약 5.3GB, 6기가바이트에 도달하지 않음). 내가 사용 committed_kb을sys.dm_os_sys_info SQL Server에서 사용하는 메모리를 확인 할 수 있습니다.

sys.dm_os_buffer_descriptors를 모니터링 하면 캐시에서 페이지가 삭제되는 것을 볼 수 있지만 여전히 700MB의 메모리가 남아 있습니다. 메모리가 필요없는 경우 페이지가 캐시에서 제거된다는 사실을 어떻게 설명 하시겠습니까? SQL Server는 메모리가 필요할 때만 페이지를 제거 할 것으로 기대합니다.

할당 해제 된 임시 테이블은이 서버에서 문제가되지 않습니다. 내 PLE는 3632입니다. 프로 시저 캐시는 2182MB입니다.

남은 메모리가 없을 때만 페이지가 삭제 될 것으로 예상하지만 700MB의 여유 공간이 있거나 이것을 잘못 이해하고 있습니까?

누군가이 행동을 설명해 줄 수 있습니까?

SQL Server도 디스크에서 읽고 있으므로 필요한 모든 페이지가 메모리에 있다고 결론을 내릴 수 없습니다.

나는 더 많은 연구를했고 디스크에서 메모리로 많은 양의 페이지를 읽었으며 읽는 동안 작업 관리자에서 무언가를 발견했습니다.

  • 사용중인 메모리는 7.0GB-> 7.2GB-> 7.0GB-> 7.2GB-> ...
  • Sqlservr.exe는 5.3GB-> 5.5GB-> 5.3GB-> 5.5GB-> ...

Windows에서 sqlservr.exe 가 6GB로 증가 하지 않는 것과 같습니다 .

Shanky가 제공 한 쿼리를 실행했습니다.

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

결과는 다음과 같습니다.

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

내가 이해하지 못하는 것은 Total_Memory_in_MB 가 6144 (최대 메모리)와 다른 이유는 무엇입니까 ?

에서 sys.dm_os_ring_buffers 나는 발견 RESOURCE_MEMPHYSICAL_LOW나는 Windows가 메모리에 저를 실행 한 생각과 SQL 서버 일부를 반환해야하므로. 그러나 약 1GB의 메모리가 사용 가능합니다. => Windows에서 메모리가 부족하다는 이유는 무엇입니까?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

업데이트
왜 항상 1GB의 메모리가 사용 가능한지 조사한 결과, 무언가를 찾은 것 같습니다.
SQL Server가 사용 가능한 메모리 만 할당 할 수 있고 사용 가능한 메모리가 무시 될 수 있습니까? Process Explorer (Sysinternals)를 실행할 때 사용 가능한 메모리가 0임을 확인했습니다.

답변:


3

시작하려면 최대 서버 메모리 를 6GB로 설정하고 총 메모리 가 8GB이므로 OS의 경우 2GB를 남겨 두었습니다. 많은 경우 Windows 시스템에서 SQL Server와 별도로 설치되지 않은 경우에도 , OS에 너무 적은 메모리가 제공되었습니다. 바이러스 백신이 설치된 시스템에서 제대로 작동하려면 OS에 최소 4GB가 제공되어야합니다. OS의 경우 2GB를, AV의 경우 1.5G를 그대로 둡니다.

대상 서버 메모리는 때때로 6GB이고 전체 서버 메모리로 돌아갑니다 (약 5.3GB, 절대 6GB에 도달하지 않음).

대상 서버 메모리 는 이상적인 경우 SQL Server가 제대로 작동하는 데 필요한 메모리 양을 나타냅니다. 최대 서버 메모리 값을 6GB로 설정했기 때문에 대상 서버 메모리가 6GB가 되려고합니다 . 허용 된 모든 메모리를 사용하려고합니다.

총 서버 메모리 는 현재 SQL Server가 실제로 사용할 수있는 것입니다. 이것은 커밋 된 메모리이며 실제 RAM에 의해 지원됩니다. 귀하의 경우 최대 5.5GB입니다.

SQL Server가 메모리 소비를 늘리려 고하지만 5.3 또는 5.5GB에 도달 한 후 OS에서 SQL Server에 메모리 소비가 더 이상 증가하지 않도록 요청하고 실제로 메모리 부족 알림을 표시 할 수 있습니다. 이것은 이미 위에서 언급했듯이 OS가 메모리 부족을 겪을 수 있기 때문에 발생합니다. SQLOS는 캐시에 소비를 줄 이도록 요청하여 Windows OS가 메모리 부족에 직면하면 응답합니다. 메모리 부족 알림 신호가 있는지 확인하기 위해 링 버퍼쿼리 할 수 있습니다 . DMV를 추가해야합니다 . sys.dm_os_ring_buffer 는 문서화되지 않았지만 안전합니다.

캐시에서 페이지가 삭제되었지만 700MB의 메모리가 남아 있습니다. 메모리가 필요없는 경우 페이지가 캐시에서 제거된다는 사실을 어떻게 설명 하시겠습니까? SQL Server는 메모리가 필요할 때만 페이지를 제거 할 것으로 기대합니다.

여유 메모리를 찾고 있다면 DMV sys.dm_os_buffer_descriptors 를 참조 하지 않는 것이 좋습니다 . OS 카운터는 당신에게 컴퓨터에서 실행중인 프로세스에 사용할 수있는 바이트의 물리적 메모리의 양을, 말할 것이다. 합리적인 버퍼 풀 크기를 평가하는 결정적 방법무엇입니까? 를 참조하십시오 . 또한 SQL Server에 필요한 RAM 용량 과 SQL Server의 메모리 부족 상황을 확인하려면 SQL Server에 더 많은 RAM필요합니까?를 참조하십시오 . 앞에서 언급했듯이 버퍼 풀에서 페이지가 제거되었다고 확신하면 SQL Server는 새 페이지를 수용 할 공간이 필요하므로 페이지를 이동해야한다고 생각합니다. 700MB의 사용 가능한 공간을 어떻게 계산했는지 잘 모르겠습니다. Available Mbytes

다른 하나는 SQL Server 메모리 소비에 대한 작업 관리자를 보지 마십시오. 특히 SQL Server 서비스 계정에 잠금 페이지의 메모리 권한 이있는 경우 항상 올바른 값을 제공하지는 않습니다 . 귀하의 경우, SQL Server의 최대 서버 메모리가 6GB 인 경우에도 OS에 2GB 만 제공되므로 SQL Server에 대한 2GB가 적기 때문에 SQL Server의 소비가 증가하지 않습니다. 시스템에서 실행되는 SQL Server 외에 다른 것이 있습니까?

SQL Server 메모리 소비량을 계산하려면 다음을 사용하십시오.

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

내가 이해하지 못하는 것은 Total_Memory_in_MB 가 6144 (최대 메모리)가 아닌 이유 입니다.

Total_Memory_in_MB 열 은 SQL Server에서 사용하는 총 메모리 (RAM + 페이지 파일)를 나타냅니다. RAM은 실제로 실제 메모리 사용 또는 커밋 된 메모리입니다. SQL Server 프로세스의 일부는 디스크로 페이징되며 가상 메모리 또는 페이지 파일로 구성되므로 SQL Server에서 소비 한 총 메모리를 볼 경우 실제 메모리와 페이지 파일의 합이됩니다.

Physical_Memory_usedby_Sqlserver_MB 열 은 사용 된 실제 메모리 (실제 RAM 또는 커밋 된 메모리가 지원하는 메모리) 일뿐입니다. 이것이 두 가지가 다른 이유입니다. 실제 열이 표시되면 첫 번째 열은 실제 메모리 사용이고 다른 열은 가상 메모리 커밋입니다.

당신은 차이 것이다 페이징 메모리보고 싶다면 Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MB을 .

참고 : 사용 된 총 메모리는 사용 된 실제 메모리보다 큽니다.


5

SQL Server는 버퍼 캐시 이외의 캐시를 가장 많이 사용하지만 가장 큰 캐시를 사용합니다 (예 : 계획 캐시). 메모리 DBCC MEMORYSTATUS와 다양한 DMV 를 자세히 살펴볼 수 있습니다 . 대상 메모리 및 총 메모리는 특히 버퍼 풀 / 캐시를 나타냅니다.

Christian Bolton 의 주요 Professional SQL Server 2008 내부 및 문제 해결 에서 발췌 :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    버퍼 풀의 현재 크기를 나타냅니다.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    버퍼 풀에 이상적인 크기를 나타냅니다. Total 및 Target은 한동안 메모리 부족이없는 서버에서 거의 동일해야합니다. 경우 훨씬 적은보다 대상 , 다음은 SQL 서버 때문에 당신이 추가 조사를 할 수있는 경우에 메모리 압력에 버퍼 풀을 재배 할 수없는 가능성이 높습니다.

총 서버 메모리와 대상 서버 메모리가 동일한 경우에도 추가하기 위해 메모리 부족이 없는지 100 % 확신 할 수 없습니다 . 이 경우 더 많은 메모리 카운터를 시작하고 데이터를 가져와 결론에 도달해야합니다.
Shanky

"전체 및 대상은 한동안 실행중인 메모리 부족이없는 서버에서 거의 동일해야합니다." 이것에 대해 생각해 봅시다. 128GB의 RAM이있는 새로운 SQL Server를 세우고 단일 1GB 데이터베이스를 가져옵니다. 한 달 동안 실행하자. 나는 그 달 말에 총계와 목표가 거의 같을 것이라고 정말로 믿습니까? 그렇지 않은 경우 서버에 메모리가 부족하다고 생각합니까? 나는 그것을 믿기가 어렵다.
Mike Sherrill 'Cat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.