본문 바로가기

좋아하는 것_매직IT/9.redis

31.Redis, 운영 시 메모리 설정은 어떻게 해야 할까요?

반응형

Redis 의 메모리 설정

  • Redis 운영 시  비교적 남은 메모리가 넉넉함에도 불구하고, fork 함수의 수행이 실패하는 경우가 발생함.
    • 우선 fork() 함수에 대해서 알아보면,
      • fork() 함수는 부모 프로세스와 동일한 크기의 메모리를 사용하는 프로세스를 생성함.
        • 즉,리눅스에서 부모 프로세스가 사용하는 만큼의 메모리가 남아있지 않으면, fork() 함수가 실패하게 됨.
    • Redis 에서 fork() 함수를 호출하는 경우
      • 스냇샷
      • AOF
      • 위의 2경우에서 호출한 fork() 함수가 실패한 이후의 Redis 는 모든 쓰기 연산에 대하여 실패 응답을 전송하게됨.
  • 즉, 다시말해서 이론적으로 만약 8GB의 데이터를 가진 Redis 를 운용하기 위해서는 반드시 8GB 이상의 유휴 메모리가 필요함.
    • 그러나, 대부분의 상황에서는 Redis 가 호출한 fork() 함수에 의해서 생성된 자식 프로세스는 부모 프로세스의 메모리를 복사할 필요가 없음.
      • 왜냐하면, 현재 부모 프로세스의 메모리를 읽어서 디스크에 저장하기 때문에..
      • 그럼에도 불구하고, 추가적인 8GB의 메모리가 존재하지 않으면, fork() 함수가 실패함.
        • 위의 현상을 방지하기 위해서 아래 리눅스 시스템 파라미터에 옵션을 추가함.
          • /etc/sysctl.conf
            • vm.overcommit_memory=1 
      • 여기서 잠깐!) vm.overcommit_memory 커널 파라미터의 옵셤에 대해서 알아보자
- vm.overcommit_memory 설정 값 정의 (0,1,2)

#설정 값 0 의미
 - 리눅스 시스템의 기본 설정 값, 메모리 할당 요청인 malloc 함수의 요청이 들어오면 요청된 크기만큼의 물리적 메모리가 존재할 때에만 메모리를 할당함. 

#설정 값 1 의미
 - 메모리 할당 요청인 malloc 함수의 요청이 들어오면 남은 물리 메모리가 없더라도, 성공을 응답함. 단, 요청으로 입력된 크기의 스왑영역이 존재할 때에만 성공함.

#설정 값 2
 - 사용중인 메모리 크기가, "스왑공간 크기 + vm.overcommit_ratio * 물리 메모리 크기" 이내 일때 메모리를 할당함.
  • vm.overcommit_memory 가 1로 세팅되어 있을 경우 메모리 상태는 아래와 같음.
    •  
    • 설명
      • fork() 함수 수행 시 메모리 상태는 AS-IS -> TO-BE 상태로 변경됨.
      • 자식 프로세스는 COW(Copy On Write)에 의하여 부모 프로세스의 메모리 페이지 테이블을 복사하여, SWAP 영역에 저장하게 됨.
        • 이 상태에는 부모 프로세스에 읽기 연산만 들어온다면 Redis 응답 시간에는 문제가 없음.
        • but, 쓰기 연산이 들어오게 되면, 부모 프로세스가 운영체제에게 추가적인 메모리할당을 요청하게 되고, 운영체제는 요청된 메모리를 SWAP 영역을 할당하게 됨.
          • 다시말해서, 디스크에 데이터를 기록하게 되므로 추가적인 응답시간이 필요하게 되어 응답시간이 길어지게됨.
      • 그리고, 만약, 응답시간을 줄이기 위해서, SWAP 영역을 Redis 에 저장된 데이터 크기보다, 작게 잡게되면, OOM 킬러에 의해서 레디스 프로세스가 종료될 수 도 있음.
    • 평균적인 응답속도를 유지하기 위해 적절한 데이터의 크기는 어떻게 산정해야 될까요?
    • 제가 생각하는 결론은,
      • 첫째, 운영하는 서비스에 대해서 먼저 파악이 필요할듯 하다.
      • 둘째, 통계적인 접근 방법이 필요할것 같다.
      • 예를 들면, 쓰기/읽기 연산의 비율을 산정해서, 해당 비율에 따라서 정해야함
      • 전체 연산 횟수가 100이라고 가정.
        • 쓰기 연산 비율이 50을 넘는다면, 물리 메모리의 60%를 지정하는 것이 적당함.
          • 이값을 기준으로, 쓰기 비율이 줄어들수록, 저장 가능한 메모리의 비율을 늘릴 수 있을 것 같음.

결론

  • Redis 운용 시 메모리 이슈가 있을 수 있으며, 서비스의 특성을 파악해서 메모리크기를 산정해야 함.
  • Redis 운용 시 아래 커널 파라미터 값에 유의해야 한다.
    • /etc/sysctl.conf 
      • vm.overcommit_memory
  • 오늘도 Redis 운용 관련 메모리에 대한 마술(?) 획득 완료. 감사합니다. ^^

  • 오늘의 명언 한마디
    • 티끌모아 태산, 작은 실천이 쌓여 인생을 바꾼다. - 야마모토 노리아키지음, "인생을바꾸는, 아침 1시간 노트" 중에서-

  • 오늘의 영어 한마디
    • 질문) I get irritated when things don't go my way.
      • 생각대로 되지 않을 땐 정말 초조해서 미칠 것 같아.
    • 응답) That attitude must put you under a lot of stress.
      • 자꾸 그러면 스트레스 쌓일 텐데.
    • 해설
      • "생각대로 되지 않다"는 things don't go my way. 또는 I can't go my own 이라고 표현함.
      • attitude 는 심신의 태도
      • put you under stress 는 "스트레스의 원인이 되다"는 의미임.
728x90
300x250