메모리 관리 권장사항

Memorystore for Redis 인스턴스는 올바르게 관리 및 구성되지 않으면 메모리 부족으로 애플리케이션 성능에 영향을 줄 수 있습니다. 이 페이지에서는 인스턴스의 메모리 사용량을 효율적으로 관리하는 데 사용할 수 있는 권장사항을 설명합니다.

이 주제의 경우 다음과 같습니다.

메모리 관리 개념

이 섹션에서는 인스턴스의 메모리 사용량을 관리하기 위해 이해해야 하는 개념을 소개합니다.

인스턴스 용량

  • 인스턴스 용량은 기가바이트(GB) 단위로 프로비저닝한 메모리 양이며 요금이 부과됩니다. 적절한 인스턴스 용량을 선택하는 방법에 대한 자세한 내용은 Memorystore 인스턴스 크기 적절하게 조정을 참조하세요.

Maxmemory 구성

  • Maxmemory는 제거 정책이 적용되는 메모리 한도를 설정할 수 있는 Redis 구성입니다. Redis용 Memorystore는 이 구성을 maxmemory-gb로 지정합니다. 인스턴스를 만들면 maxmemory-gb가 인스턴스 용량으로 설정됩니다. 시스템 메모리 사용량 비율 측정항목에 따라 워크로드 급증을 위한 메모리 오버헤드를 제공하려면 maxmemory-gb 한도를 낮춰야 할 수 있습니다.

    자세한 내용은 시스템 메모리 사용량 비율 관리를 참조하세요.

    maxmemory-gb를 조정하는 방법은 Redis 인스턴스 구성을 참조하세요.

시스템 메모리 사용량 비율

  • 시스템 메모리 사용량 비율 측정항목을 사용하면 시스템 메모리를 기준으로 인스턴스의 메모리 사용량을 측정할 수 있습니다. 시스템 메모리는 Memorystore에서 자동으로 관리되어 오픈소스 Redis에서 일반적으로 사용되는 메모리 집약적인 작업 및 메모리 조각화로 인한 메모리 사용량 급증을 처리합니다.

    시스템 메모리 사용량 비율 측정항목이 80%를 초과하면 인스턴스가 메모리 부족 상태임을 나타내며 시스템 메모리 사용량 비율 관리의 안내를 따라야 합니다. 조치를 취하지 않고 메모리 사용량이 계속 증가하면 메모리 부족으로 인해 인스턴스가 비정상적으로 종료될 수 있습니다. 메모리 조각화로 인해 시스템 메모리 사용량 비율 측정항목이 80%를 초과할 수 있습니다. 또는 측정항목이 80% 이상으로 급증하면 메모리 집약적인 작업 중 하나를 사용했을 수 있습니다.

사용된 메모리

  • 사용된 메모리 측정항목은 Memorystore 인스턴스의 데이터 양을 보여줍니다. 인스턴스의 사용된 메모리는 maxmemory-gb 구성 한도까지 커질 수 있습니다. 사용된 메모리가 maxmemory-gb 한도를 초과하면 제거 정책이 적용됩니다.

제거 정책

  • 인스턴스의 제거 정책(maxmemory 정책이라고도 함)은 인스턴스 데이터가 maxmemory-gb 한도에 도달하면 Redis가 키를 삭제하는 방식을 결정합니다. Redis는 정상적인 캐시 사용 사례의 일부로 키를 제거합니다. 키 제거는 백그라운드 프로세스로 발생하므로 maxmemory-gb 한도에 도달하면 키가 바로 삭제되지 않습니다. 쓰기 속도가 높으면 키 제거로 인해 메모리 부족 상태가 발생할 수 있습니다.

    Memorystore 인스턴스의 기본 제거 정책은 volatile-lru입니다. volatile-* 제거 정책을 사용하는 경우 만료하려는 키에 TTL을 설정해야 합니다. 그렇지 않으면 Redis에 제거할 키가 없습니다.

    제거 정책 목록은 Maxmemory 정책을 참조하세요.

    제거 정책을 변경하는 방법은 Redis 인스턴스 구성을 참조하세요.

메모리 조각화

  • maxmemory-gb에 대한 사용된 메모리 비율이 낮더라도 메모리 조각화로 인해 Memorystore 인스턴스의 메모리가 부족해질 수 있습니다. 메모리 조각화는 운영체제가 반복적인 쓰기 및 삭제 작업 후 Redis가 완전히 활용할 수 없는 메모리 페이지를 할당할 때 발생합니다. 이러한 페이지가 누적되면 시스템 메모리가 부족해져 Redis 서버가 다운될 수 있습니다. activedefrag Redis 구성은 조각화를 줄이는 데 도움이 될 수 있습니다.

활성 단편화 제거

  • Redis 버전 4.0 이상은 activedefrag 구성을 제공합니다. 가능하다면 Redis 4.0을 사용하여 Memorystore 인스턴스를 만들어야 합니다. Memorystore는 기본적으로 activedefrag를 'no'로 설정합니다. activedefrag를 'yes'로 설정하면 CPU 트레이드 오프가 발생하지만 메모리 부족 문제를 일으키는 메모리 조각화를 완화하는 데 도움이 될 수 있습니다.

    시스템 메모리 사용량 비율 측정항목이 메모리 조각화를 나타내는 경우 activedefrag를 사용 설정해야 합니다. 그렇지 않으면 activedefrag는 선택적 설정으로 유지됩니다.

메모리 집약적인 작업

다음 작업은 특히 높은 쓰기 속도로 실행될 때 상당한 메모리를 사용합니다.

내보내기 작업

Memorystore 내보내기 기능은 copy-on-write를 사용하는 Redis BGSAVE 작업을 사용합니다. 데이터 크기, 쓰기 볼륨, 터치한 키에 따라 내보내기에 필요한 메모리가 데이터가 차지하는 공간의 두 배가 될 수 있습니다. 따라서 내보내기가 성공하려면 내보내기 중에 인스턴스 용량의 50%까지 maxmemory-gb 한도를 줄여야 할 수 있습니다.

표준 등급 인스턴스의 확장 및 버전 업그레이드 작업

쓰기 부하가 높은 기간 동안 확장 또는 업그레이드하면 복제로 인한 메모리 오버헤드로 인해 인스턴스에 메모리 부족이 발생할 수 있습니다. 메모리 부족으로 인해 확장 또는 업그레이드 작업이 실패하면 다음을 수행해야 합니다.

  • 확장/업그레이드 작업 전에 maxmemory-gb를 인스턴스 용량의 50%까지 줄입니다. 가능하다면 인스턴스 트래픽이 적은 기간 동안 maxmemory도 줄여야 합니다. 이렇게 하면 maxmemory를 줄여서 캐시 적중률에 미치는 부정적인 영향을 줄일 수 있습니다.
  • 낮은 쓰기 기간 동안 확장/업그레이드

인스턴스의 메모리 사용량 모니터링

측정항목을 모니터링하고 이 섹션에 설명된 알림을 설정합니다. 이러한 측정항목과 알림을 통해 인스턴스의 메모리 사용량을 파악할 수 있습니다. 측정항목을 보고 알림을 설정하는 방법은 Redis 인스턴스 모니터링을 참조하세요.

항목 전체 측정항목 주소
Maxmemory redis.googleapis.com/stats/memory/maxmemory
메모리 사용량 redis.googleapis.com/stats/memory/usage
메모리 사용량 비율 redis.googleapis.com/stats/memory/usage_ratio
시스템 메모리 오버로드 기간 redis.googleapis.com/stats/memory/system_memory_overload_duration
시스템 메모리 사용량 비율 redis.googleapis.com/stats/memory/system_memory_usage_ratio
캐시 적중률 redis.googleapis.com/stats/memory/cache_hit_ratio
만료 가능한 키 redis.googleapis.com/keyspace/keys_with_expiration
만료된 키 redis.googleapis.com/stats/expired_keys
제거된 키 redis.googleapis.com/stats/evicted_keys

메모리 사용량 비율

메모리 사용량 비율 측정항목은 작업 세트 크기가 maxmemory-gb 한도에 얼마나 근접했는지를 나타냅니다. 제거 정책을 제거 안함으로 설정하지 않는 한 maxmemory에 도달하는 인스턴스 데이터가 항상 문제를 나타내지는 않습니다. 그러나 키 삭제는 시간이 걸리는 백그라운드 프로세스입니다. 쓰기 속도가 높은 경우 Redis가 여유 공간을 확보하기 위해 키를 삭제할 시간을 확보할 수 있습니다.

시스템 메모리 사용량 비율

시스템 메모리 사용량 비율은 모니터링해야 하는 중요한 측정항목입니다. 인스턴스에 워크로드 및 기타 메모리 집약적인 작업을 지원하기에 충분한 메모리가 있는지 확인하려면 항상 사용 가능한 시스템 메모리가 충분해야 합니다.

시스템 메모리 사용량 비율 측정항목이 80%에 도달하면 알리도록 알림을 설정합니다. 80%에 도달하면 시스템 메모리 사용량 비율 측정항목을 더 면밀히 모니터링해야 합니다. 시스템 메모리 사용량 비율이 급격히 증가하는 경우에는 activedefrag를 사용 설정하고 maxmemory를 줄인 후 인스턴스 확장을 고려해야 합니다.

시스템 메모리 사용량 비율이 100%에 도달하면 인스턴스의 메모리 사용 공간을 추가로 늘리는 모든 작업이 차단되고 Redis는 다음 오류를 반환합니다.

-OOM command not allowed under OOM prevention.

자세한 내용은 시스템 메모리 사용량 비율 관리를 참조하세요.

시스템 메모리 오버로드 기간

메모리 사용량이 너무 높으면 Memorystore는 인스턴스에 쓰기 작업을 차단하여 인스턴스를 정상 상태로 유지합니다. 시스템 메모리 오버로드 기간은 인스턴스가 차단된 쓰기 상태인 기간을 추적합니다.

인스턴스에서 쓰기가 차단되는 시점을 알 수 있도록 이 측정항목의 알림을 설정해야 합니다. 또한 이 측정항목을 다시 참조하여 -OOM command not allowed under OOM prevention. 오류가 발생하는 문제를 해결할 수 있습니다.

캐시 적중률

Redis 인스턴스의 키에서 성공적으로 반환되는 키 찾기 비율을 알 수 있도록 캐시 적중률을 정기적으로 모니터링해야 합니다. 일반적으로 높은 캐시 적중률이 낮은 캐시 적중률이 더 낫습니다. maxmemory-gb 한도 조정, 제거 정책 변경, 인스턴스 확장과 같이 대규모 구성을 변경하기 전에 캐시 적중률을 기록해야 합니다. 그런 다음 인스턴스를 수정한 후 캐시 적중률을 다시 확인하여 변경 사항이 이 측정항목에 어떤 영향을 주었는지 확인합니다.

만료 가능한 키 및 만료된 키

Stackdriver 측정항목 만료 가능한 키는 만료를 위해 설정된 키의 수를 모니터링합니다. 만료 가능한 키가 없는 경우 키에 TTL을 설정하지 않은 것을 의미할 수 있습니다. 이러한 경우 인스턴스 데이터가 maxmemory-gb 한도에 도달하면 메모리 부족 상태가 될 수 있는 키를 제거할 수 없습니다.

모니터링할 수 있는 또 다른 측정항목은 만료된 키입니다. 측정항목에 만료된 키가 많이 표시되지만 인스턴스에 메모리 부족이 표시되면 maxmemory-gb를 낮춰야 합니다.

메모리 부족 조건 상태 해결

다음은 인스턴스에 메모리가 부족하거나 메모리 부족 오류가 발생하는 경우 따라야 할 권장사항입니다.

  1. volatile-* 제거 정책을 사용하는 경우 만료하려는 키에 TTL을 설정해야 합니다. 자세한 내용은 제거 정책을 참조하세요.

  2. Redis 4.0 이상을 실행하는 인스턴스:

    1. 인스턴스에 activedefrag를 사용 설정합니다. 자세한 내용은 활성 단편화 제거를 참조하세요.
  3. 측정항목을 사용하여 메모리 부족 문제를 해결하고 인스턴스의 메모리 사용량을 파악하는 방법을 알아보세요. 인스턴스의 메모리 사용량 모니터링, 시스템 메모리 사용량 비율 관리

  4. 메모리 집약적인 작업을 실행할 때 maxmemory를 조정하는 방법을 알아봅니다.

  5. 시스템 메모리 사용량 비율 측정항목이 80%를 초과하면 인스턴스의 maxmemory-gb 한도가 낮아집니다. 자세한 내용은 시스템 메모리 사용량 비율 관리를 참조하세요.

  6. 인스턴스 확장을 고려하세요.

  7. 여전히 OOM 조건이 발생하면 Google Cloud Platform 지원에 문의하세요.

Memorystore 인스턴스 크기 적절하게 조절

이 섹션에서는 워크로드에 따라 인스턴스 크기를 적절하게 조절하는 데 도움이 되는 세 가지 방법을 다룹니다.

Memorystore 인스턴스의 초기 크기 결정

먼저 표준 등급 인스턴스를 사용할지 아니면 기본 등급 인스턴스를 사용할지 선택해야 합니다. Redis용 Memorystore 등급에 대한 자세한 내용은 Redis 등급별 기능을 참조하세요. 애플리케이션에 적합한 등급을 선택한 후 다음 단계에 따라 필요한 인스턴스 크기를 결정합니다.

  1. 데이터의 크기를 결정합니다.

    • 애플리케이션이 Redis 인스턴스에 쓰는 키의 수와 평균 키 크기를 추정합니다. 이 값을 곱하면 필요한 인스턴스 크기를 대략적으로 추정할 수 있습니다.
  2. 제거 정책을 선택합니다.

    • noeviction maxmemory 정책을 사용하는 경우 인스턴스 크기가 최대 워크로드 및 작업 세트를 보유할 만큼 커야 합니다. 이 maxmemory 정책으로 메모리가 부족하면 인스턴스가 메모리 부족 상태가 될 수 있습니다.
    • 다른 제거 정책은 프로비저닝해야 하는 인스턴스 크기에 영향을 주지 않습니다.
  3. 표준 등급 인스턴스를 위한 추가 메모리를 프로비저닝합니다.

    • 기본 등급 인스턴스와 달리 표준 등급 인스턴스는 인스턴스 용량의 10%를 복제 버퍼로 예약합니다. 표준 등급 인스턴스를 선택하는 경우 1단계에서 데이터 추정을 수행하고 복제 버퍼에 10%를 추가로 프로비저닝합니다.
  4. 평균 및 최대 쓰기 속도를 예측합니다.

    • 가능하다면 애플리케이션에서 사용할 키의 쓰기 속도와 크기를 예측합니다. 쓰기 속도는 키 삭제 속도에 따라 시간이 지나면서 인스턴스의 확장 속도가 결정됩니다.
  5. 원하는 캐시 적중률에 도달하도록 확장합니다.

    • 캐시 적중률을 모니터링하고 캐시 적중 횟수가 원하는 만큼 증가하지 않으면 인스턴스 크기를 늘리거나 요청이 처리 중이고 충족되지 않은 Memorystore 인스턴스에 애플리케이션이 키를 기록해야 한다는 것을 의미합니다.

메모리 부족 상태로 인해 인스턴스가 쓰기를 차단하는지 확인

다음 오류가 발생하는 경우:

-OOM command not allowed under OOM prevention.

다음을 확인하세요.

  1. 인스턴스에 문제가 발생하기 직전에 시스템 메모리 사용량 비율 측정항목이 80%를 초과했습니다.
  2. 시스템 메모리 사용량 비율이 인스턴스에 문제가 발생하기 직전에 매우 빠르게 증가했습니다.
  3. 시스템 메모리 오버로드 기간 측정항목은 차단된 쓰기가 발생한 것과 동일한 기간 동안 0보다 큰 값을 표시했습니다.

그렇다면 메모리 부족 상태로 인해 인스턴스가 쓰기를 차단하고 있을 가능성이 높습니다.

시스템 메모리 사용량 비율 관리

시스템 메모리 사용량 비율 측정항목이 80%를 초과하면 알리도록 알림을 설정합니다. 시스템 메모리 사용량 비율이 80%를 초과하는 경우 인스턴스의 메모리가 부족하지 않도록 적절한 조치를 취해야 합니다. 쓰기 볼륨과 키 액세스 패턴에 따라 시스템 메모리 사용량이 100%로 빠르게 증가할 수 있습니다. Memorystore는 시스템 메모리 사용량 비율을 관리하는 다음 방법을 제공합니다.

  • Redis 버전 4.0 이상을 실행하는 인스턴스에 activedefrag를 사용 설정합니다.
  • 인스턴스의 maxmemory-gb 한도를 낮춥니다.
  • 인스턴스를 확장합니다.
  • 적절한 제거 정책을 선택합니다.
  • 휘발성 키에 TTL을 설정합니다.
  • 인스턴스에서 수동으로 키 삭제

activedefrag 사용 설정

시스템 메모리 사용량 비율이 80%를 초과하면 activedefrag를 사용 설정합니다(Redis 버전 4.0 이상을 실행하는 인스턴스). 조각화 제거를 통해 조각화된 메모리를 해제하는 데 몇 시간이 걸릴 수 있습니다. 쓰기 트래픽이 높은 경우 조각화 제거만으로는 인스턴스의 메모리 부족 실행을 중지할 수 없습니다. 따라서 다음 권장사항을 구현해야 할 수도 있습니다.

인스턴스의 maxmemory 한도 낮추기

시스템 메모리 사용량 비율이 80% 를 초과하는 경우 maxmemory-gb를 낮춰야 합니다.하지만 먼저 시스템 메모리 사용량 비율이 시간이 지남에 따라 어떻게 변했는지 확인하여 설정할 maxmemory-gb 한도를 결정합니다.

시나리오 1: 시스템 메모리 사용량 비율이 단계적으로 천천히 증가하고 있습니다. 조각화는 문제일 가능성이 높으며 시스템 메모리 사용량 비율이 80% 미만이 안정화될 때까지 maxmemory-gb를 조금씩 낮춰야 합니다.

시나리오 2: 시스템 메모리 사용량 비율이 빠르게 급증하고 인스턴스에서 중요한 쓰기 부하가 발생합니다. 메모리 집약적인 작업으로 인해 급증이 발생했을 수 있습니다. 이 경우 인스턴스가 메모리 부족 상태가 되는 것을 방지하거나 메모리 부족 상태에서 복구하도록 maxmemory-gb 제한을 더 크게 낮춰야 합니다. Maxmemory를 낮추면 인스턴스의 캐시 적중률이 줄어들 수 있다는 점에 유의하세요. 캐시 적중률이 훨씬 낮은 경우 애플리케이션이 Redis를 사용할 때의 이점을 활용할 수 있도록 인스턴스를 확장해야 한다는 의미입니다. maxmemory-gb 구성을 조정하는 방법은 Redis 인스턴스 구성을 참조하세요.

인스턴스 확장

Redis 인스턴스 확장 안내에 따라 인스턴스 용량을 늘립니다.

maxmemory 확장 예시:

maxmemory-gb가 8GB로 설정된 10GB 인스턴스가 있는 경우 키 저장용으로 8GB, 메모리 오버헤드용으로 2GB가 포함됩니다. 인스턴스를 20GB로 확장하면 maxmemory-gb는 16GB로 확장됩니다. 따라서 인스턴스에는 키 저장용 16GB 메모리와 4GB의 오버헤드가 있습니다. 인스턴스 크기를 늘리거나 줄이는 방법은 Redis 인스턴스 확장을 참조하세요.

적절한 제거 정책 선택

휘발성 데이터를 저장하는 경우 volatile-* 제거 정책 중 하나를 선택합니다. 휘발성이 아닌 데이터를 저장하는 경우 allkeys-* 정책 중 하나를 선택합니다.

인스턴스에서 수동으로 키 삭제

인스턴스에서 키를 수동으로 삭제하여 메모리 부족 조건을 개선할 수 있습니다. 이는 인스턴스 상태를 개선하는 데 도움이 되는 임시 솔루션입니다.