Redis cannot allocate memory

Redis cannot allocate memory

1. 에러 상황

12:M 27 Aug 16:20:23.500 * Starting BGSAVE for SYNC with target: disk
12:M 27 Aug 16:20:23.500 # Can't save in background: fork: Cannot allocate memory
12:M 27 Aug 16:20:23.500 # BGSAVE for replication failed
12:M 27 Aug 16:20:29.083 * 1 changes in 900 seconds. Saving...
12:M 27 Aug 16:20:29.084 # Can't save in background: fork: Cannot allocate memory
12:M 27 Aug 16:20:35.094 * 1 changes in 900 seconds. Saving...
12:M 27 Aug 16:20:35.095 # Can't save in background: fork: Cannot allocate memory
12:M 27 Aug 16:20:41.009 * 1 changes in 900 seconds. Saving...
12:M 27 Aug 16:20:41.009 # Can't save in background: fork: Cannot allocate memory

 

2. 에러 발생이유 및 해결방법

2-1. 에러 발생 이유

Redis는 In-memory database 여서, data를 memory 에 저장한다.
사용 가능한 memory 대비 data가 커지면 위와 같은 에러가 발생했다.
저장되는 data 크기를 줄이거나, memory 크기를 늘려서 해결하는 것이 좋다.
여건이 안될 때는 vm.overcommit_memory 설정을 줄 수 있다.

2-2. vm.overcommit_memory 옵션 의미

  • 0 : 기본값
    • 메모리 총량을 넘어설경우 메모리할당을 거부한다.
    • 메모리가 부족한 상황이라면 서비스를 OOM(out of memory)으로 Kill 하는 편이 좋다고 판단될 경우, 프로세스를 종료시켜 여유 메모리를 확보함
  • 1:항상 overcommit함
    • overcommit을 제한하지 않는다.
    • 메모리가 부족한 상황속에서 다소 느리더라도 서비스가 계속 되어야 하는 경우
  • 2 : overcommit 하지 않음
    • swap총량 + 물리메모리총량 * vm.overcommit_ratio/100 의 값을 계산하여 메모리가 이보다 넘어설 경우 메모리 할당을 거부한다.
    • vm.overcommit_ratio 를 설정해서 메모리를 얼마까지 사용할 것인지 지정할 수 있다. 기본 값을 50이며 /etc/sysctl.conf 에서 설정 가능하다.

2-3. 적용방법

적용시에는 아래 두가지 방법 중 하나를 사용할 수 있다.

  • 설정파일 변경 후 재시작
$ sudo vi /etc/sysctl.conf
vm.overcommit_memory = 1
  • 즉시 적용하기 (재부팅하면 원래대로 돌아감)
sysctl vm.overcommit_memory=1

 

참고

https://linux.systemv.pe.kr/redis-운영에-필요한-잡지식들/
https://jinhokwon.github.io/redis/redis-optimize/
https://charsyam.wordpress.com/2021/04/14/입-개발-redis가-maxmemory-보다-더-썼다가-oom-에러를-던져요/
https://jujupapa.tistory.com/37

댓글

Designed by JB FACTORY