인스턴스에서 높은 메모리 소비 최적화

이 문서에서는 SQL Server용 Cloud SQL 인스턴스가 과소 프로비저닝된 인스턴스 추천자에 의해 메모리 사용량이 높은 것으로 식별된 경우, 해당 인스턴스를 검토하여 최적화하는 방법에 대해 설명합니다.

SQL Server 메모리

SQL Server 메모리는 다음과 같이 나눌 수 있습니다.

캐시

이것들은 데이터베이스 페이지 및 저장 프로시져와 같이 로드할 수 있는 디스크의 객체입니다. 따라서 SQL Server가 메모리 사용량을 기준으로 이러한 객체를 늘리거나 줄일 수 있습니다. 캐시에는 버퍼 풀과 계획 캐시가 포함됩니다.

고정 메모리

고정 메모리는 증가하거나 축소될 수 있습니다. 사용하지 않을 때만 축소됩니다. 예를 들어 연결 수가 감소하거나 실행 중인 쿼리 수가 감소하는 경우가 여기에 해당합니다. 이는 캐시와 다릅니다. 고정 메모리가 부족하면 SQL Server에서 메모리가 부족해질 수 있습니다. 고정 메모리에는 연결 메모리 및 메모리 부여가 포함됩니다.

SQL Server 오버헤드

SQL Server 오버헤드에 스레드 및 스택이 포함됩니다.

인메모리 OLTP

인메모리 OLTP에는 인메모리 테이블과 인메모리 파일 그룹이 포함됩니다.

SQL Server의 메모리 소비는 maximum server memorymemory.memory.limitmb 설정으로 제어됩니다. Cloud SQL은 memory.memory.limitmb 매개변수를 자동으로 설정합니다.

memory.memory.limitmb에 대한 자세한 내용은 Microsoft 문서를 참조하세요.

max server memory 한도를 적절한 값으로 설정해야 합니다. SQL Server에서 max server memory가 설정되지 않으면 데이터베이스 페이지가 대부분의 메모리를 최대 100%까지 소비할 수 있습니다. 이로 인해 때로는 혼동이 생기기도 합니다.

메모리 최적화 옵션

인스턴스에 메모리 조정이 필요한지 확인하려면 다음을 수행하세요.

  • max server memory 값 설정하기 일반적으로 SQL Server가 사용 가능한 모든 메모리를 사용하지 않도록 max server memory를 약 80%로 설정하는 것이 좋습니다. 메모리가 많은 인스턴스의 경우 80%는 너무 낮아서 메모리 낭비로 이어질 수 있습니다.

  • Page life expectancy 모니터링하기

    Page life expectancy는 버퍼 풀에 가장 오래된 페이지가 남아 있는 시간을 초 단위로 나타냅니다. 이 값은 Microsoft에서 권장하는 300보다 커야 합니다. 지속적으로 300 미만이면 인스턴스의 메모리 사용량이 높음을 의미할 수 있습니다. 다음 쿼리를 실행하여 Page life expectancy를 모니터링하세요.

    SELECT
      [object_name],
      [counter_name],
      [cntr_value]
    FROM
      sys.dm_os_performance_counters
    WHERE
      [object_name]
    LIKE
      '%Manager%'
    AND
      [counter_name] = 'Page life expectancy'
    
  • Memory Grants Pending 확인하기

    Memory Grants Pending은 작업공간 메모리 부여를 기다리는 총 프로세스 수를 지정합니다. 다음 쿼리를 실행하여 Memory Grants Pending을 확인합니다. 이 쿼리로 권한 부여가 계속해서 대기 중으로 표시되면 메모리 사용량이 높음을 나타냅니다. 데이터베이스 대기를 쿼리하고 메모리에서 대기 중인 문을 미세 조정하여 사용량을 줄일 수 있습니다.

    SELECT
      @@SERVERNAME AS [Server Name],
      RTRIM([object_name]) AS [Object Name],
      cntr_value AS [Memory Grants Pending]
    FROM
      sys.dm_os_performance_counters WITH(NOLOCK)
    WHERE
      [object_name]
    LIKE
      N'%Memory Manager%'  -- Handles named instances
    AND
      counter_name = N'Memory Grants Pending'