메모리 관리 권장사항

이 페이지에서는 Memcached 인스턴스의 예약된 메모리 구성과 필요한 경우 예약된 메모리를 늘려야 하는 시기를 설명합니다. 또한 이 페이지에서는 Memcached 인스턴스의 메모리를 효과적으로 관리하려면 알아야 하는 다른 권장사항도 설명합니다.

Memorystore는 Memcached 프로세스에서 생성된 오버헤드를 수용하도록 인스턴스에 표시되지 않는 메모리를 추가합니다. 하지만 특정 워크로드에 따라 메모리 오버헤드가 이 목적으로 프로비저닝하는 추가 메모리보다 커질 수 있습니다.

메모리 사용량이 총 Memorystore 시스템 메모리보다 커질 경우 메모리 부족(OOM) 상태로 인해 데이터 전체 캐시 플러시가 발생하여 애플리케이션과 비즈니스가 중단될 수 있습니다.

다음 섹션에서는 Memcached 인스턴스에 Memorystore를 구성할 경우에 따라야 하는 일반적인 원칙을 설명합니다. 또한 이 섹션에서는 메모리를 모니터링하는 데 사용할 수 있는 측정항목과 알림, 가능한 작업을 설명합니다.

메모리 관리 개념

인스턴스 용량

인스턴스 용량은 GiB 단위로 프로비저닝한 메모리 양이며 요금이 청구됩니다. 캐시 메모리는 고정되지 않으므로 인스턴스 용량과 다릅니다. 하지만 Memcached 인스턴스를 만들 때 인스턴스 용량은 기본적으로 캐시 메모리와 동일합니다.

예를 들어 인스턴스 용량 5GiB를 선택하면 기본적으로 인스턴스에는 항목을 저장하는 공간이 5GiB 있습니다.

캐시 메모리 한도

캐시 메모리는 Memcached 인스턴스에서 캐시로 사용할 수 있는 총 메모리 크기입니다. 기본적으로 캐시 메모리는 인스턴스 용량과 동일합니다. 하지만 예약된 메모리를 조정하면 캐시 메모리가 줄어들 수 있습니다. 자세한 내용은 예약된 메모리를 참조하세요. 캐시 메모리가 가득 차면 Memcached는 새 쓰기 공간을 확보하도록 캐시에 저장된 항목을 제거하기 시작합니다.

캐시 메모리 측정항목을 볼 때 Memcached 노드의 보고된 캐시 메모리에는 항목이 차지하는 공간만 포함됩니다. 즉, Memcached는 총 캐시 메모리 사용량을 낮게 추정할 수 있습니다. 캐시에서 추가 메모리를 슬랩 내에서 조각화로 할당할 수 있습니다.

메모리 오버헤드

메모리 오버헤드는 Memcached 프로세스에서 사용하는 메모리입니다. 캐싱에 사용되는 메모리에 저장된 항목은 포함되지 않습니다.

메모리 오버헤드는 활성 연결 수, 총 항목, 항목 크기를 기준으로 확장됩니다. 또한 이론적으로 메모리 오버헤드에는 제한이 없으므로 무한히 증가할 가능성이 있습니다.

메모리 오버헤드를 고려하기 위해 Memorystore는 인스턴스에 메모리를 추가합니다. 하지만 추가한 메모리 양은 표시되지 않습니다. 대부분의 워크로드에서 메모리 오버헤드는 문제가 되지 않습니다.

구성이 없으면 빈 Memorystore for Memcached 노드 메모리가 다음과 같이 표시됩니다.

자리표시자

애플리케이션이 캐시에 항목을 추가하면 Memcached는 연결 버퍼와 내부 해시 테이블과 같은 프로세스에 오버헤드를 누적합니다.

자리표시자

오버헤드 증가에는 제한이 없으므로 일부 워크로드의 일부 오버헤드는 다음과 같이 예약된 한도를 초과합니다.

자리표시자

오버헤드와 항목이 사용 가능한 모든 공간을 채우면 Memcached 메모리가 부족해지며 OS에서 프로세스를 종료해야 전체 캐시 플러시가 발생합니다.

자리표시자

메모리 오버헤드는 Memorystore가 기본적으로 오버헤드에 할당하는 추가 공간(시스템 메모리 사용률 높음)을 초과할 수 있습니다. 이러한 경우 예약된 메모리 매개변수를 증가시켜 워크로드의 오버헤드를 추가로 만듭니다.

예약된 메모리

예약 메모리는 메모리 오버헤드에서 사용할 수 있는 공간을 늘릴 수 있는 Memorystore 구성입니다.

메모리 오버헤드에 사용할 수 있는 메모리를 늘리려면 예약된 메모리를 늘립니다. 그러면 사용 가능한 캐시 메모리가 줄어듭니다. 인스턴스에서 높은 메모리 오버헤드로 인해 메모리가 부족해지면 이 공간을 추가해야 합니다.

2021년 10월 25일 이후에 생성되는 인스턴스에는 기본 예약 메모리 10%가 포함됩니다. 이 값은 인스턴스에서 구성을 업데이트하여 수동으로 재정의할 수 있습니다. 인스턴스에서 예약된 메모리를 줄이면 OOM 조건이 발생할 가능성이 크게 늘어날 수 있습니다.

다음 다이어그램에서는 예약된 메모리를 늘려 메모리 오버헤드에 사용되는 추가 공간을 만든 인스턴스를 보여줍니다.

자리표시자

Memcached 캐시가 감소된 한도에 도달하면 항목이 제거되기 시작합니다.

자리표시자

인스턴스를 사용하기 시작하면 시스템 메모리 사용률 측정항목에 따라 인스턴스의 예약된 메모리를 늘려 최대 워크로드를 지원해야 할 수 있습니다.

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

시스템 메모리 사용률

시스템 메모리는 프로비저닝된 인스턴스 용량과 Memorystore가 메모리 오버헤드에 추가하는 공간을 더한 것과 같습니다.

시스템 메모리 사용률은 측정항목으로, 시스템 메모리와 비교 시 사용한 모든 메모리(저장된 항목과 메모리 오버헤드)의 비율을 보여줍니다. 이 측정항목은 인스턴스에 사용할 수 있는 시스템 메모리가 완전히 채워지는 정도를 보여주므로 모니터링해야 하는 주요 측정항목입니다. 시스템 메모리 사용률 측정항목이 100%에 가까워지면 인스턴스에 OOM 조건이 발생할 가능성이 높아집니다. 인스턴스에 워크로드를 지원하는 데 충분한 메모리가 있는지 확인하려면 항상 사용 가능한 시스템 메모리가 충분해야 합니다.

캐시를 완전히 채우고 Memcached 제거를 사용하여 저장된 항목을 관리하려고 하는 워크로드에서는 시스템 메모리 사용률이 높아지므로 오버헤드에 충분한 공간을 확보하려면 사전에 예약된 메모리를 늘려야 합니다.

시스템 메모리 사용률 알림

시스템 메모리 사용률 측정항목이 90%를 초과하는 경우 이를 알려주는 알림을 설정해야 합니다. 시스템 메모리 사용률이 높으면 시스템 메모리 사용률 측정항목을 더욱 면밀하게 모니터링해야 하며 이 값이 크게 증가하면 시스템 메모리 사용량 관리를 고려해야 합니다. 시스템 메모리 사용률이 높은 수준에 도달하면 조치를 취해야 합니다. OOM 조건으로 인해 캐시 플러시를 처리하는 대신 완화되기 때문입니다.

제거 정책

Memcached는 캐시 메모리가 가득 차면 최적화된 LRU 알고리즘을 사용하여 항목을 삭제합니다. 캐시 제거를 중지하는 방법은 Memcache 인스턴스 구성을 참조하세요.

제거 모니터링에서는 크기 제한으로 인해 Memcached에서 삭제하는 키 수를 보여줍니다. TTL 만료로 인해 삭제된 항목은 이 측정항목에 포함되지 않습니다. 제거가 다수 발생하면 인스턴스가 수직 확장하여 캐시 적중률이 증가할 수 있습니다.

제거가 사용 설정되어 있지 않고 캐시가 완전히 가득 차면 Memcached 서버의 항목을 설정할 수 없습니다.

캐시 적중률

Memcached 인스턴스의 키에서 성공적으로 반환되는 키 찾기 비율을 알 수 있도록 캐시 적중률 측정항목을 정기적으로 모니터링해야 합니다. 일반적으로 높은 캐시 적중률은 낮은 캐시 적중률보다 더 좋습니다. 캐시가 캐시 요청을 더 많이 반환한다는 의미이기 때문입니다.

예약된 메모리 조정, 키 TTL 조정 또는 인스턴스 확장과 같이 구성을 대규모로 변경하기 전에 캐시 적중률을 기록해야 합니다. 그런 다음 인스턴스를 수정한 후 캐시 적중률을 다시 확인하여 변경 사항이 이 측정항목에 어떤 영향을 주었는지 확인합니다.

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

다음 측정항목은 인스턴스의 메모리 사용량에 대한 유용한 정보를 제공합니다. 측정항목을 보고 알림을 설정하는 방법은 Memcached 인스턴스 모니터링을 참조하세요.

측정항목 전체 측정항목 주소
캐시 메모리 memcache.googleapis.com/node/cache_memory
시스템 메모리 사용률 memcache.googleapis.com/node/memory/utilization
캐시 적중률 memcache.googleapis.com/node/hit_ratio
제거 memcache.googleapis.com/node/eviction_count

시스템 메모리 사용량 관리

인스턴스에 메모리가 부족하거나 OOM 오류가 발생하는 경우 다음 단계를 수행하여 문제를 해결합니다.

  1. OOM 조건을 확인합니다.
  2. 인스턴스에서 예약된 메모리를 늘립니다.
  3. 인스턴스를 수직 확장합니다.
  4. 휘발성 키에 TTL을 설정합니다.
  5. 인스턴스에서 키를 수동으로 삭제합니다.
  6. 여전히 OOM 조건이 발생하면 Google Cloud Platform 지원팀에 문의하세요.

OOM 조건 확인

인스턴스가 OOM 조건에 도달하면 첫 번째 신호는 인스턴스 다시 시작입니다. 다시 시작이 OOM 조건으로 인해 발생했는지 확인하려면 업타임시스템 메모리 사용률 측정항목을 봅니다.

업타임이 0으로 감소하기 전에 시스템 메모리 사용률이 90%를 초과하면 OOM 조건으로 인해 인스턴스 다시 시작이 발생했을 가능성이 높아집니다.

예약된 메모리 증가

예약된 메모리를 늘리면 메모리 오버헤드에 사용되는 공간이 더 많이 생성됩니다. 인스턴스의 캐시 메모리 한도를 줄이면 됩니다. 시스템 메모리 사용률 측정항목이 90%를 초과하면 예약된 메모리를 늘려야 합니다.

예약된 메모리 구성을 조정하는 방법은 Memcached 인스턴스 구성을 참조하세요.

예약된 메모리를 늘리면 항목을 저장하는 데 사용할 수 있는 메모리가 줄어 항목 제거 속도가 빨라집니다. 이로 인해 인스턴스의 캐시 적중률이 낮아질 수 있습니다. 제거가 중지되어 있으면 항목이 제거되지 않습니다.

인스턴스 수직 확장

Memcached 인스턴스 확장의 안내를 따라 노드 수를 늘립니다. 애플리케이션이 여러 노드에서 키를 샤딩하도록 구성된 경우 애플리케이션에서 사용할 수 있는 전체 항목 저장공간이 증가하고 각 개별 노드에 저장된 키 수가 줄어듭니다.

휘발성 키에 TTL 설정

Memcached에 저장된 키에 TTL을 설정하도록 애플리케이션을 구성합니다. 기본적으로 Memcached는 주기적으로 만료된 키를 확인 및 삭제하여 서버의 공간을 확보하고 더 많은 캐시 메모리 할당을 방지합니다.

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

메모리가 부족하면 키를 삭제하는 것이 좋습니다. 하지만 오픈소스 Memcached는 이전에 할당된 메모리를 사용하지 않으므로 키를 삭제하면 OOM 조건이 입력될 가능성이 줄어듭니다. 이렇게 하면 새 쓰기에서 빈 메모리를 사용하므로 문제가 줄어듭니다. 이전에 할당된 메모리는 항목 저장에만 사용되며 오버헤드에서 사용할 수 없으므로 메모리 오버헤드가 증가해도 여전히 OOM 조건이 발생할 수 있습니다.