Redis가 백그라운드 저장이나 복제를 위해 fork할 때 보이는 메모리 overcommit 경고를 정리했습니다. 가상 메모리 할당을 허용하는 정책과 실제 RAM 사용량은 다르므로 커널 설정 하나만으로 메모리 부족이 해결되지는 않습니다.
현재 사용량과 정책 확인
vm.overcommit_memory는 주소 공간 할당 시 커널이 사용하는 정책입니다. 0은 휴리스틱 검사, 1은 overcommit 허용, 2는 commit 한도를 기준으로 제한하는 방식입니다. 값 2에서는 swap과 ratio 또는 kbytes 설정이 한도에 영향을 줍니다.
sysctl vm.overcommit_memory vm.overcommit_ratio
cat /proc/meminfo | grep -E 'MemAvailable|SwapTotal|CommitLimit|Committed_AS'
redis-cli --user lieper --askpass -p 16379 INFO memory
redis-cli --user lieper --askpass -p 16379 INFO persistenceCommitLimit은 실제 여유 RAM을 뜻하지 않습니다. fork 이후 쓰기가 발생하면 copy-on-write로 실제 메모리가 추가로 필요하고, AOF rewrite·RDB 저장·복제 버퍼도 사용량에 영향을 줍니다.
설정 적용과 지속성
해당 Redis 환경에 overcommit 허용이 필요하다고 확인한 경우 아래처럼 전용 sysctl 파일을 사용합니다. 즉시 적용한 값과 재부팅 후 값이 달라지지 않도록 기존 설정과 중복을 확인합니다.
# /etc/sysctl.d/90-redis-memory.conf
vm.overcommit_memory = 1sudo sysctl -p /etc/sysctl.d/90-redis-memory.conf
sysctl vm.overcommit_memory설정 후 확인할 항목
overcommit을 허용해도 메모리가 부족하면 OOM이 발생할 수 있습니다. maxmemory는 서버 RAM 전체보다 작게 두고 OS·버퍼·fork 시 추가 사용량을 위한 여유를 확보합니다. 단순 비율을 모든 서버에 일괄 적용하지 않습니다.
Redis 로그의 fork·background save 실패, persistence 상태, 커널 OOM 로그와 실제 peak 메모리를 함께 확인합니다. 설정 전후 부하 조건이 비슷한지 비교하고 기존 값과 복원 방법을 기록합니다.
참고: https://docs.kernel.org/mm/overcommit-accounting.html