TIL

Redis 메모리 정책 삽질기 — noeviction → allkeys-lru 전환

하얀잔디 2025. 10. 22. 22:38

 

상황 요약

운영 중이던 Redis 클러스터(3서버 × 2포트 = 6노드 구조)에서
16379 인스턴스가 갑자기 종료되는 현상 있었음.

원인 추적 결과
AOF rewrite 시점에 메모리 사용량이 급등하면서
커널 OOM(Out of Memory)에 의해 프로세스가 kill된 것으로 보임.

 

 


 당시 설정

 
maxmemory = 1000000000 # 약 1GB maxmemory-policy = noeviction
  • noeviction  메모리 꽉 차면 더 이상 쓰기를 허용하지 않음
  • Redis가 오래된 키를 삭제하지 않고 그대로 두는 정책
  • AOF rewrite 나 RDB save 시 fork() 발생 → 순간적으로 메모리 2배 필요
  • 여유가 거의 없던 상황이라 커널이 Redis 프로세스 kill

⚙️ 조치 내용

정책과 상한선을 아래처럼 변경함👇

 
redis-cli -p 16379 -a '비밀번호' CONFIG SET maxmemory-policy allkeys-lru
 
redis-cli -p 16379 -a '비밀번호' CONFIG SET maxmemory 1610612736 # 1.5GB
 
redis-cli -p 16379 -a '비밀번호' CONFIG REWRITE
 

변경 후 상태

항목값
used_memory 약 940MB
maxmemory 1.5GB
mem_fragmentation_ratio 1.05
aof_last_write_status ok

모두 정상.

이제 메모리 한계 도달 시에도
오래된 키부터 자동으로 삭제되어 서비스 멈춤 현상 방지됨.
AOF rewrite 시 fork가 일어나도 버퍼 여유가 있어서 안정적임.

 

 


 정리 및 교훈

  • Redis의 maxmemory는 “상한선”일 뿐, 항상 꽉 채워놓는 개념 아님
  • noeviction 정책은 지워지면 안 되는 데이터용
    (예: 영구 설정, 사용자 프로필 등)
  • 캐시/세션 중심 환경에서는 allkeys-lru 혹은 volatile-lru 사용이 더 안전
  • AOF rewrite 중 OOM으로 터졌다면 커널 로그 확인할 것
  •  
    dmesg | grep "Killed process"
  • 정책 변경 후 CONFIG REWRITE로 설정 영구 반영 필수