MS SQL Server-할당 된 메모리 늘리기
내 문제는 SQL Server가 TB 상당의 RAM이있는 인스턴스의 메모리 사용량을 늘리는 데 오랜 시간이 걸리는 반면, SQL Server가 최대 메모리에 도달 할 때까지 처리 속도를 늦추는 MEMORY_ALLOCATION_EXT의 간헐적 인 대기가 발생한다는 것입니다.
SQL Server 2019 Enterprise Edition의 장애 조치 클러스터 된 인스턴스 (FCI)가 있으며 노드에 테라 바이트에 해당하는 메모리가 있습니다. 일반적인 사용 사례에서는 노드 당 하나의 SQL Server 인스턴스 만 허용하므로 최대 서버 메모리를 노드 메모리의 약 85 %에 가깝게 설정하지만 SQL Server가 장애 조치되는 경우를 대비하여 최소 서버 메모리도 상대적으로 낮게 설정했습니다. 다른 노드로 이동하고 메모리 사용량을 줄이면서 온라인 상태로 전환해야합니다.
-
최소 메모리를 높게 설정하면 SQL Server가 한 번에 메모리를 모두 사용한다는 것을 잘 알고 있습니다.SQL Server가 시작시 최소 메모리를 할당하지 않는 것으로 나타났습니다. - SQL Server가 필요에 따라 OS에서 더 많은 메모리를 동적으로 소비하고 결국 최대 서버 메모리에 도달 할 것임을 알고 있습니다.
- 많은 데이터를 가져 오는 큰 쿼리 또는 DBCC checkdb를 실행하면 SQL Server가 OS에서 더 많은 메모리를 사용하게된다는 것을 알고 있습니다.
SQL Server가 메모리 사용량을 빠르게 늘리도록 강제하는 다른 방법이 있습니까?
답변
최소 메모리를 높게 설정하면 SQL Server가 한 번에 메모리를 모두 사용한다는 것을 잘 알고 있습니다.
이것은 올바르지 않습니다. 최소 서버 메모리는 설정된 경우 SQL Server가 소비하는 속도와 관련이 없습니다. 최소 서버 메모리는 사용 된 경우 최소 메모리 양을 나타내며, 그 이후에는 SQL Server가 요청을받을 경우 정상적인 조건에서이 값 이하로 메모리를 해제하지 않습니다. 최소 서버 값에 도달하면 SQL Server는 캐시를 트리밍하지 않고이 값 이하로 메모리를 해제하지 않습니다.
SQL Server가 필요에 따라 OS에서 더 많은 메모리를 동적으로 소비하고 결국 최대 서버 메모리에 도달 할 것임을 알고 있습니다.
예, 맞습니다. 특정 조건에서 SQl 서버를 추가하기 위해 최대 서버 메모리에 지정된 값보다 큰 메모리를 사용할 수도 있습니다. 메모리 관리 가이드를 읽어야합니다.
SQL Server가 메모리 사용량을 빠르게 늘리도록 강제하는 다른 방법이 있습니까?
SQL Server가 시작하는 동안 더 많은 메모리를 예약하도록하는 다른 방법이 있으며이를 " 대형 페이지 "라고합니다. 이것은 엔터프라이즈 에디션 기능이며 SQL Server가 시작하는 동안 일부 여유 메모리를 신속하게 예약 할 수 있도록합니다. SQL Server 서비스 계정 에는 Windows OS의 VirtualAlloc () 함수에 의해 큰 페이지 할당이 수행되므로 메모리 권한에 페이지가 잠겨 있어야합니다. 8GB 이상의 RAM (이러한 조건이 자동으로 충족되는 경우 큰 페이지 할당이 활성화 됨) 활성화되면 오류 로그에 아래와 같이 나타납니다.
2009-06-04 12:21:08.16 Server Large Page Extensions enabled.
2009-06-04 12:21:08.16 Server Large Page Granularity: 2097152
2009-06-04 12:21:08.21 Server Large Page Allocated: 32MB
메모리의 일반 페이지 크기는 X64 시스템에서 4KB이지만 대형 페이지를 사용하는 경우 크기는 2MB가됩니다. 또한 LargePageSupport는 추적 플래그 834를 사용하지 않는 경우에도 엔진에서 사용 및 사용됩니다. 그러나이를 위해 많은 메모리가 사용되지 않으며 추적 플래그 834가 사용 가능하지 않으면 버퍼 풀 메모리가 사용되지 않습니다. 공유 된 블로그를 참조하십시오.
SQL Server는 페이지가 참조되기 때문에 저장소에서 페이지를로드해야 할 때까지 버퍼 풀 (가장 많이 사용)에 메모리를 사용하지 않습니다. 메모리 할당을 느리게 만들기 위해 이상한 일을하지 않는 한 [†] 지연은 그렇게 될 가능성이 적지 만 유지하기 위해 할당되는 데이터를 읽는 것입니다. 해당 메모리 할당 대기와 동시에 IO 관련 대기가 일치한다고 생각합니다.
SQL 서버가 항목을 메모리에로드하도록 강제하여 사용 가능하고 필요한 경우 메모리를 할당하려면로드해야하는 항목에 액세스하십시오. SQL 인스턴스를 시작한 후 읽기 전용 워크로드를 실행하여 애플리케이션의 일반 공통 작업 세트가 버퍼 풀에로드되도록합니다.
하지 만 SELECT * FROM HugeTable이 가능성이 같은 IO해야합니다 있도록 설정 작업의 핵심은 여전히 어쨌든 다음 액세스의 디스크 / 네트워크에서로드 될 필요가 있으므로 데이터의 나쁜 균형 (안 응용 프로그램의 핵심 작업 집합)를로드하는 것입니다으로 지연. 또한 HugeTableSQL Server가 정말 큰 경우 모든 것이 적합하지 않고 메모리에 상당량을 유지하지 않아도된다는 것을 알 수 있습니다 [‡].
[†] 오버로드 된 호스트의 VM에서 실행 중이므로 실제 RAM이 실제로 온 디스크 페이지 인 것처럼 보입니까?!
[‡] 정상적인 상황에서는 큰 개체에 대한 예상치 못한 테이블 / 인덱스 스캔이 메모리에서 다른 모든 항목을 제거하는 것을 원하지 않습니다. 한 쿼리에 대해 하나의 개체에서 보관되는 양에 대한 제한은 이러한 문제가 발생하지 않도록하는 최적화입니다.