상황 요약
운영 중이던 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로 설정 영구 반영 필수
'TIL' 카테고리의 다른 글
| HTTPS 안전하지 않음 으로 바뀐다면 http 통신인가? (0) | 2025.10.23 |
|---|---|
| Node.js의 !! 키워드 정리 (0) | 2025.10.22 |
| 갑자기 redis 안되는 현상 (0) | 2025.10.18 |
| 다중 소켓서버 삽질 후기 (feat. 미친 20%) (0) | 2025.10.13 |
| node JS 스프레드 연산자에 대해 (1) | 2025.10.13 |