ElastiCache for Redis에서 자체 설계한 클러스터의 메모리 사용량을 확인하고 높은 메모리 사용량을 제어하기 위한 모범 사례를 구현하려면 어떻게 해야 하나요?

5분 분량
0

Amazon ElastiCache for Redis 자체 설계한 클러스터의 메모리 사용량을 확인하고 높은 메모리 사용량을 제어하는 모범 사례를 구현하려고 합니다.

간략한 설명

다음은 자체 설계된 Redis용 ElastiCache 클러스터에서 높은 메모리 사용량의 원인입니다:

  • 최근에 추가된 키: 추가 key-value 쌍으로 인해 메모리 사용량이 증가합니다. 또한 이미 존재하는 키에 추가 요소가 있으면 메모리 사용량이 증가합니다. 노드에서 최근 데이터 변경 사항을 확인하려면 SetTypeCmds 지표를 확인하세요. 자세한 내용은 Redis 웹사이트의 INFO 페이지에 있는 commandstats 명령을 참조하세요.
  • 버퍼 사용량 증가: 클라이언트가 네트워크를 통해 Redis에 연결됩니다. Pub/Sub 클라이언트를 포함하는 클라이언트가 캐시에서 충분히 빠르게 읽지 못하면 Redis는 응답 데이터를 클라이언트 출력 버퍼에 보관합니다.자세한 내용은 Redis Pub/Sub출력 버퍼 제한과 Redis 웹사이트를 참조하세요. 네트워크 대역폭에 병목 현상이 있거나 클러스터에 지속적으로 과부하가 걸리면 버퍼 사용량이 누적될 수 있습니다. 이로 인해 메모리가 고갈되고 성능이 저하됩니다. 기본적으로 Redis용 ElastiCache는 출력 버퍼의 증가를 제한하지 않으며, 각 클라이언트에는 자체 버퍼가 있습니다. 버퍼 사용량을 확인하려면 client list 명령을 사용하세요. 자세한 내용은 Redis 웹사이트에서 CLIENT LIST를 참조하세요.
  • 많은 수의 새 연결: 새 연결 수가 많으면 메모리 사용량이 증가할 수 있습니다. 모든 새 연결은 메모리를 소비하는 파일 설명자를 생성하며, 이러한 총 메모리 소비는 데이터 제거 또는 OOM 오류로 이어질 수 있습니다. 새 연결 수를 확인하려면 NewConnections 지표를 확인하세요.
  • 스왑 사용량이 높음: 여유 메모리가 있을 때 캐시 노드에서 스왑 사용량이 어느 정도 있는 것은 정상적인 동작입니다. 그러나 스왑 사용량이 너무 많으면 성능이 저하될 수 있습니다. 높은 스왑 사용량은 메모리 압박이 심한 노드에서 발생합니다. 이로 인해 사용 가능한 메모리가 부족해집니다. 호스트의 스왑을 모니터링하려면 SwapUsage 지표를 사용하세요.
  • 높은 메모리 조각화: 메모리 조각화가 높으면 운영 체제 메모리 관리의 비효율성을 나타냅니다. 키가 제거될 때 Redis가 메모리를 확보하지 못할 수 있습니다. 조각화 비율을 모니터링하려면 MemoryFragmentationRatio 지표를 사용하세요. 조각화 문제가 있는 경우 활성 메모리 조각화를 위해 activedefrag 매개 변수를 설정하세요.
  • 큰 키: 큰 키에는 데이터 크기가 크거나 요소 수가 많습니다. 큰 키는 높은 메모리 사용량을 유발할 수 있습니다. 데이터 집합에서 큰 키를 감지하려면 redis-cli --bigkeys 명령 또는 redis-cli --memkeys 명령을 사용합니다. 자세한 내용은 Redis 웹사이트에서 큰 키 검색큰 키 검색을 참조하세요.

해결 방법

메모리 사용량 확인

자체 설계된 ElastiCache for Redis 클러스터의 메모리 사용량을 확인하려면 다음 Redis 지표를 검토하세요.
참고: 이러한 지표는 클러스터의 각 노드에 대해 Amazon CloudWatch에 게시됩니다.

  • BytesUsedForCache: 모든 용도로 Redis가 할당하는 총 바이트 수입니다. 이 값은 클러스터의 메모리 사용률을 결정하는 데 사용됩니다. 이 지표를 검색하려면 Redis 노드에서 INFO 명령을 실행합니다. 자세한 내용은 Redis 웹사이트에서 INFO를 참조하세요.
  • FreeableMemory: 호스트에서 사용 가능한 메모리 양을 보여주는 호스트 수준 지표입니다. 캐시 데이터 또는 오버헤드로 인해 메모리 사용량이 증가하면 FreeableMemory가 감소합니다. FreeableMemory가 감소하면 호스트의 메모리가 부족함을 나타냅니다. FreeableMemory가 너무 낮으면 스왑이 발생할 수 있습니다.
  • DataBaseMemoryUsagePercentage: 클러스터 노드에서 사용하는 메모리의 백분율입니다. 이 지표가 임계값의 100%에 도달하면 Redis는 Redis 최대 메모리 제거 정책을 시작합니다. 자세한 내용은 Redis 웹사이트에서 키 제거를 참조하세요. 이 지표를 검색하려면 Redis 노드에서 INFO 명령을 실행합니다. 자세한 내용은 Redis 웹사이트에서 INFO를 참조하세요.

참고: 기본적으로 ElastiCache는 장애 조치 및 백업과 같은 비데이터 사용을 위해 maxmemory의 25%를 예약합니다. 비데이터 사용을 위해 예약된 메모리를 충분히 지정하지 않으면 스왑이 증가할 수 있습니다. 자세한 내용은 예약 메모리 관리하기를 참조하세요.

높은 메모리 사용량 제어 모범 사례

  • 키에 TTL 사용: 불필요한 키의 저장을 방지하고 만료되는 키를 제거하려면 만료할 키에 TTL를 지정하세요. 자세한 내용은 Redis 웹사이트에서 TTL를 참조하세요. 키 제거 횟수가 많으면 노드가 메모리 압박을 받습니다. 같은 시간 내에 만료되는 키를 방지하려면 TTL를 사용할 때 무작위성을 추가하세요.
  • 제거 정책 사용: 캐시 메모리가 가득 차면 Redis는 maxmemory-policy에 따라 공간을 확보하기 위해 키를 제거합니다. 기본 maxmemory-policy 정책은 volatile_lru로 설정되어 있습니다. 워크로드에 적합한 제거 정책을 선택하는 것이 가장 좋습니다.
  • 예약 메모리 할당: 장애 조치 또는 백업 중 문제를 방지하려면 데이터 이외의 사용량에 대해 reserved_memory_percentage 매개변수를 최소 25%로 설정하는 것이 좋습니다. 장애 조치 또는 백업을 수행하기에 예약된 메모리가 충분하지 않으면 스왑 및 성능 문제가 발생합니다.
  • 연결 풀링 사용: 연결 풀링을 사용하면 Redis 클라이언트에서 시도되는 많은 수의 새 연결을 제어할 수 있습니다. 자세한 내용은 Redis 클라이언트를 위한 모범 사례 및 Redis용 ElastiCache 자체 설계 클러스터를 구현하려면 어떻게 하나요?를 참조하세요.
  • 서버측 유휴 시간 제한 구성: 열린 연결은 메모리를 소비하며, 클라이언트가 Redis용 ElastiCache에 요청을 보내는지 여부에 관계없이 시간이 지남에 따라 사용량이 증가합니다. 유휴 연결로 인한 불필요한 메모리 사용을 최소화하려면 매개변수 그룹을 통해 서버 측 시간 제한을 구성하여 지정된 시간 후에 유휴 연결을 닫도록 설정하세요. 연결이 조기에 종료되지 않도록 하려면 클라이언트 라이브러리 내에서 서버 측 유휴 시간 제한 값을 클라이언트 측 시간 제한보다 높게 설정하세요.
  • 출력 버퍼 크기 제한 조정: 출력 버퍼 제한을 조정하여 버퍼 공간 사용량을 제어합니다. Redis용 ElastiCache parameter 그룹에는 높은 클라이언트 출력 버퍼 사용량을 방지하기 위해 client-output-buffer-limit로 시작하는 매개변수가 포함되어 있습니다. 이러한 매개변수에는 권장 제한이 없습니다. 워크로드를 벤치마킹하고 출력 버퍼 제한에 적합한 값을 선택해야 합니다.
  • 해시 매핑 사용: 해시 매핑은 키 수가 많은 데이터 구조에 유용합니다. 또한 해시 테이블에 비해 메모리 사용량을 줄이려면 ziplist 인코딩을 사용합니다. 자세한 내용은 Redis 웹사이트에서 메모리 최적화를 참조하세요. 참고: 해시 매핑은 복잡한 명령이므로 Redis 엔진 사용량이 급증할 수 있습니다.
  • 클러스터 규모 조정: 예상 워크로드에서 메모리 압력이 증가한 경우 클러스터를 규모 조정하여 메모리 압력을 줄이세요.
  • 메모리 사용량에 대한 알람 설정: 미리 설정된 임계값에 도달하는 메모리 사용량에 대한 알람을 시작하려면 CloudWatch 알람을 사용합니다. CloudWatch 알람을 생성할 때 BytesUsedForCache 또는 DatabaseMemoryUsagePercentage을 사용합니다
AWS 공식
AWS 공식업데이트됨 7달 전