카테고리 없음

Redis 메모리 파악과 redis cluster 메모리 계산

100win10 2023. 9. 5. 00:00

Redis는 메모리 기반 데이터 저장소로, 메모리 사용량이 중요한 요소 중 하나이다. 특히, Redis 클러스터를 구성할 때는 각 노드의 메모리 사용량을 정확히 파악하고 전체 클러스터의 메모리 필요량을 계산하는 것이 필수적이다. 이 글에서는 Redis의 메모리 사용을 파악하는 방법과 클러스터 구성 시의 메모리 계산 방법을 설명한다.

Redis 메모리 사용 파악


Redis 서버의 메모리 사용량을 파악하려면 Redis CLI를 사용하여 INFO memory 명령어를 실행한다. 이 명령어는 Redis 서버의 메모리 사용에 대한 자세한 정보를 제공한다.

redis-cli INFO memory

이 명령어를 실행하면 다음과 같은 출력이 나타난다:

# Memory
used_memory:39856620512
used_memory_human:37.12G
used_memory_rss:40638611456
used_memory_rss_human:37.85G
used_memory_peak:54798578840
used_memory_peak_human:51.04G
used_memory_peak_perc:72.73%
used_memory_overhead:4463489862
used_memory_startup:1479408
used_memory_dataset:35393130650
used_memory_dataset_perc:88.80%
allocator_allocated:39856838104
allocator_active:39875727360
allocator_resident:40650387456
total_system_memory:270188437504
total_system_memory_human:251.63G
used_memory_lua:39936
used_memory_lua_human:39.00K
used_memory_scripts:152
used_memory_scripts_human:152B
number_of_cached_scripts:1
maxmemory:128849018880
maxmemory_human:120.00G
maxmemory_policy:noeviction
allocator_frag_ratio:1.00
allocator_frag_bytes:18889256
allocator_rss_ratio:1.02
allocator_rss_bytes:774660096
rss_overhead_ratio:1.00
rss_overhead_bytes:-11776000
mem_fragmentation_ratio:1.02
mem_fragmentation_bytes:781950064
mem_not_counted_for_evict:0
mem_replication_backlog:536870912
mem_clients_slaves:33844
mem_clients_normal:3265722
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
...

 

Redis 메모리 필드 및 상세 설명
Redis의 메모리 사용량을 파악하기 위해 INFO memory 명령어를 실행하면 다양한 메모리 관련 필드를 확인할 수 있다. 이 필드들은 Redis 서버의 메모리 사용 현황을 상세히 보여준다. 각 필드의 의미를 하나하나 자세히 설명한다.

 

used_memory

  • 의미: 현재 Redis에서 사용 중인 메모리의 바이트 수.
  • 설명: Redis가 데이터 저장, 버퍼링, 기타 내부 구조를 위해 사용하는 총 메모리 양이다.

used_memory_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 현재 사용 중인 메모리.
  • 설명: used_memory 값을 사람이 읽기 쉬운 형식(Gigabytes, Megabytes 등)으로 나타낸다.

used_memory_rss

  • 의미: 운영 체제에서 보고한 실제 사용 중인 메모리의 바이트 수.
  • 설명: RSS(Resident Set Size)는 Redis 프로세스가 실제로 물리적 메모리에 차지하는 크기이다. 이는 used_memory와 다를 수 있으며, 메모리 단편화와 같은 요인들로 인해 차이가 발생할 수 있다.

used_memory_rss_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 실제 사용 중인 메모리.
  • 설명: used_memory_rss 값을 사람이 읽기 쉬운 형식으로 나타낸다.

used_memory_peak

  • 의미: Redis가 사용한 메모리의 최고치.
  • 설명: Redis가 시작된 이후로 가장 많이 사용한 메모리의 양이다. 시스템 부하나 데이터 저장량이 증가할 때 이 값이 증가할 수 있다.

used_memory_peak_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 메모리의 최고치.
  • 설명: used_memory_peak 값을 사람이 읽기 쉬운 형식으로 나타낸다.

used_memory_peak_perc

  • 의미: 현재 메모리 사용량이 피크 사용량의 몇 퍼센트인지.
  • 설명: 현재 사용 중인 메모리가 피크 사용량의 몇 퍼센트인지 나타낸다. 예를 들어, 50%라면 현재 사용량이 최고 사용량의 절반이라는 의미이다.

used_memory_overhead

  • 의미: Redis 오버헤드 메모리 사용량.
  • 설명: 키 공간 및 기타 메타데이터를 관리하기 위해 사용되는 메모리의 양이다. 이는 실제 데이터 외의 메모리 사용량을 의미한다.

used_memory_startup

  • 의미: Redis가 시작될 때 사용한 메모리.
  • 설명: Redis 서버가 시작될 때 기본적으로 필요한 메모리의 양이다. 이는 초기화 및 기본 구조를 위해 사용된다.

used_memory_dataset

  • 의미: 데이터셋이 차지하는 메모리.
  • 설명: 실제 사용자 데이터가 차지하는 메모리의 양이다. used_memory에서 오버헤드 메모리를 제외한 값이다.

used_memory_dataset_perc

  • 의미: 데이터셋이 전체 메모리 사용량에서 차지하는 비율.
  • 설명: 전체 메모리 사용량 중에서 실제 데이터가 차지하는 비율이다. 예를 들어, 80%라면 메모리의 80%가 실제 데이터 저장에 사용되고 있다는 의미이다.

allocator_allocated

  • 의미: 메모리 할당기에 의해 할당된 메모리.
  • 설명: Redis의 메모리 할당기(jemalloc 등)가 할당한 총 메모리의 양이다.

allocator_active

  • 의미: 메모리 할당기에서 활성 상태인 메모리.
  • 설명: 할당기에서 실제로 사용 중인 메모리의 양이다. allocator_allocated와 다를 수 있으며, 이는 메모리 단편화 등의 이유로 발생한다.

allocator_resident

  • 의미: 메모리 할당기에서 실제로 사용 중인 메모리.
  • 설명: 운영 체제에서 보고한 실제 메모리 사용량으로, 물리적 메모리에 존재하는 메모리 양을 의미한다.

total_system_memory

  • 의미: 시스템의 전체 메모리 바이트 수.
  • 설명: Redis가 실행 중인 시스템의 총 물리적 메모리 양이다.

total_system_memory_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 시스템의 전체 메모리.
  • 설명: total_system_memory 값을 사람이 읽기 쉬운 형식으로 나타낸다.

used_memory_lua

  • 의미: Lua 스크립트가 사용하는 메모리.
  • 설명: Redis에서 Lua 스크립트를 실행할 때 사용되는 메모리의 양이다.

used_memory_lua_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 Lua 스크립트의 메모리 사용량.
  • 설명: used_memory_lua 값을 사람이 읽기 쉬운 형식으로 나타낸다.

used_memory_scripts

  • 의미: 캐시된 스크립트가 사용하는 메모리.
  • 설명: Redis에서 캐시된 Lua 스크립트가 사용하는 메모리의 양이다.

used_memory_scripts_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 캐시된 스크립트의 메모리 사용량.
  • 설명: used_memory_scripts 값을 사람이 읽기 쉬운 형식으로 나타낸다.

number_of_cached_scripts

  • 의미: 캐시된 스크립트의 수.
  • 설명: Redis에 캐시된 Lua 스크립트의 개수이다.

maxmemory

  • 의미: Redis 설정에서 지정한 최대 메모리 사용량.
  • 설명: Redis가 사용할 수 있는 최대 메모리 양이다. 이 값에 도달하면 maxmemory-policy에 따라 행동하게 된다.

maxmemory_human

  • 의미: 사람이 읽기 쉬운 형식으로 표시한 최대 메모리 사용량.
  • 설명: maxmemory 값을 사람이 읽기 쉬운 형식으로 나타낸다.

maxmemory_policy

  • 의미: 최대 메모리 도달 시 정책.
  • 설명: Redis가 maxmemory에 도달했을 때 어떤 정책을 사용할지 지정한다. 예를 들어, noeviction, allkeys-lru 등 다양한 정책이 있다.

allocator_frag_ratio

  • 의미: 메모리 할당기의 조각화 비율.
  • 설명: 메모리 할당의 단편화 비율을 나타낸다. 값이 1.0보다 크면 단편화가 발생했음을 의미한다.

allocator_frag_bytes

  • 의미: 조각화로 인한 메모리 낭비량.
  • 설명: 메모리 단편화로 인해 낭비된 메모리의 양을 바이트 단위로 나타낸다.

allocator_rss_ratio

  • 의미: 메모리 할당기에서 실제 메모리 사용량과 보고된 사용량의 비율.
  • 설명: 값이 1.0보다 크면 메모리 할당기에서 실제 사용한 메모리가 보고된 사용량보다 크다는 것을 의미한다.

allocator_rss_bytes

  • 의미: 실제 사용량과 보고된 사용량 간의 차이.
  • 설명: 메모리 할당기에서 실제 사용한 메모리와 운영 체제에서 보고한 메모리 사용량 간의 차이를 나타낸다.

rss_overhead_ratio

  • 의미: RSS 오버헤드 비율.
  • 설명: 운영 체제에서 보고한 메모리 사용량과 실제 사용량 간의 비율이다.

rss_overhead_bytes

  • 의미: RSS 오버헤드 메모리 양.
  • 설명: 운영 체제에서 보고한 메모리 사용량과 실제 사용량 간의 차이를 나타낸다.

mem_fragmentation_ratio

  • 의미: 전체 메모리 조각화 비율.
  • 설명: Redis 전체 메모리 사용의 단편화 비율을 나타낸다. 1.0보다 크면 단편화가 발생했음을 의미한다.

mem_fragmentation_bytes

  • 의미: 전체 메모리 조각화로 인한 메모리 낭비량.
  • 설명: 전체 메모리 단편화로 인해 낭비된 메모리의 양을 바이트 단위로 나타낸다.

mem_not_counted_for_evict

  • 의미: 제거되지 않은 메모리 양.
  • 설명: Eviction 정책에 의해 제거되지 않은 메모리의 양을 나타낸다.

mem_replication_backlog

  • 의미: 복제 백로그 메모리 사용량.
  • 설명: Redis 복제를 위해 사용되는 백로그 메모리의 양이다.

mem_clients_slaves

  • 의미: 슬레이브 클라이언트가 사용하는 메모리.
  • 설명: 슬레이브 클라이언트와의 연결을 유지하기 위해 사용되는 메모리의 양이다.

mem_clients_normal

  • 의미: 일반 클라이언트가 사용하는 메모리.
  • 설명: 일반 클라이언트와의 연결을 유지하기 위해 사용되는 메모리의 양이다.

mem_aof_buffer

  • 의미: AOF 버퍼가 사용하는 메모리.
  • 설명: Append-Only File(AOF) 버퍼에 사용되는 메모리의 양이다.

mem_allocator

  • 의미: Redis에서 사용하는 메모리 할당기.
  • 설명: Redis가 메모리 관리를 위해 사용하는 할당기(jemalloc, libc 등)의 종류를 나타낸다.

active_defrag_running

  • 의미: 현재 활성화된 조각화 방지 작업 수.
  • 설명: 현재 실행 중인 메모리 조각화 방지 작업의 수이다.

lazyfree_pending_objects

  • 의미: 지연 해제 대기 중인 객체 수.
  • 설명: 비동기적으로 해제되기를 기다리는 객체의 수이다.

 

Redis 클러스터 구성 시 메모리 계산 예

 

Redis 클러스터를 구성할 때는 각 노드의 메모리 사용량을 고려하여 전체 클러스터의 메모리 필요량을 계산해야 한다. 예를 들어, 마스터 노드가 3개 있고 각 마스터 노드마다 2개의 슬레이브 노드를 갖는 구성을 가정해보자.

조건

  • 마스터 노드: 3개
  • 각 마스터 노드의 Redis 용량: 2GB
  • 각 마스터 노드당 슬레이브 노드: 2개
  • 각 슬레이브 노드의 메모리 사용량: 2GB

계산 방법

  1. 마스터 노드의 총 메모리 사용량
    • 각 마스터 노드의 메모리 사용량: 2GB
    • 마스터 노드 수: 3개
    • 총 마스터 메모리 사용량: 3 * 2GB = 6GB
  2. 슬레이브 노드의 총 메모리 사용량
    • 각 마스터 노드당 2개의 슬레이브 노드
    • 각 슬레이브 노드의 메모리 사용량: 2GB
    • 총 슬레이브 노드 수: 3 * 2 = 6개
    • 총 슬레이브 메모리 사용량: 6 * 2GB = 12GB
  3. 전체 클러스터의 총 메모리 필요량
    • 마스터 노드의 메모리: 6GB
    • 슬레이브 노드의 메모리: 12GB
    • 전체 클러스터의 총 메모리 필요량: 6GB + 12GB = 18GB