KB3074434 - FIX: SQL Server 프로세스의 가상 주소 공간이 사용 가능한 메모리에서 매우 부족한 경우 메모리 부족 오류 발생

적용 대상
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

이 업데이트를 적용한 후 이 변경을 사용하려면 추적 플래그 -T8075를 시작 매개 변수로 추가해야 합니다.

증상

64비트 버전의 Microsoft SQL Server 2012에서 쿼리를 실행하면 SQL Server 오류 로그에 다음과 비슷한 메모리 부족 오류 메시지가 표시됩니다.

참고

할당 페이지 실패: FAIL_PAGE_ALLOCATION 513

쿼리는 실행을 완료하는 데 시간이 오래 걸리고 SOS_MEMORY_TOPLEVELBLOCKALLOCATOR 대기가 발생합니다.

다음 정보 포인트를 검사할 때 사용 가능한 가상 주소 공간이 매우 부족하다는 것을 알 수 있습니다.

  • DBCC MEMORYSTATUS - 프로세스/시스템 개수 섹션 - 사용 가능한 가상 메모리
  • DMV: sys.dm_os_process_memory - 열 virtual_address_space_available_kb

이러한 값은 x64 프로세스에서 약 8TB에서 시작하여 계속 내려와 몇 GB에 이릅니다. 

사용 가능한 가상 주소 공간이 매우 낮은 단계에 있는 경우 메모리 할당을 수행하려는 쿼리에서 CMEMTHREAD 대기 유형이 발생할 수도 있습니다.

다음 데이터 요소는 시간이 지남에 따라 계속 증가합니다.

  • DMV: sys.dm_os_process_memory 및 sys.dm_os_memory_nodes - 열 virtual_address_space_reserved_kb
  • DBCC MEMORYSTATUS - 메모리 관리자 섹션 - VM 예약됨

이러한 값은 일반적으로 "최대 서버 메모리" 값의 배수로 증가하여 최대 8TB까지 증가합니다.

원인

SQL Server 프로세스가 총 서버 메모리 = 대상 서버 메모리 = 최대 서버 메모리인 상태에 도달하면 SQL Server 메모리 관리자에는 새 할당이 일시적으로 성공하기 위해 여러 8KB 페이지를 요청할 수 있도록 하는 정책이 있습니다. 이러한 조건에서 할당 패턴이 반복되면 메모리 블록의 조각화와 가상 주소 공간의 소비가 발생할 수 있습니다. 이 프로세스가 여러 번 반복되면 SQL Server 가상 주소 공간이 고갈되고 앞에서 설명한 증상이 나타납니다.

해결 방법

누적 업데이트 정보

이 문제는 다음 SQL Server 누적 업데이트에서 처음 해결되었습니다.

권장 사항: SQL Server용 최신 누적 업데이트 설치

SQL Server에 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스와 모든 보안 수정 사항이 포함되어 있습니다. SQL Server용 최신 누적 업데이트를 다운로드하여 설치하는 것이 좋습니다.

이 핫픽스는 발생할 수 있는 메모리 부족과 사용 가능한 가상 주소 공간의 지속적인 감소를 방지합니다.

상태

Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.

추가 정보

  • Windows 2012 R2에서는 가상 주소 공간을 128TB까지 늘릴 수 있습니다. 따라서 Windows 2012 R2 환경에서는 이 문제를 알지 못할 수 있습니다. 자세한 내용은 Windows 개발자 센터의 다음 항목을 참조하세요.

    Windows 및 Windows Server 릴리스의 메모리 제한

  • 수정 사항을 적용한 후에도 가상 주소 공간이 지속적으로 증가하는 경우 Page_allocated 확장 이벤트를 사용하여 큰 메모리 청크를 요청하는 쿼리 또는 작업을 확인할 수 있습니다. 샘플 스크립트는 다음과 같습니다.

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD EVENT sqlos.page_allocated(
        ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text)
        WHERE ([number_pages]>(1)))
    ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
    GO
    
    
    

    일반적으로 자주 발생하는 로그 백업 및 인덱스 유지 관리 작업입니다.