반응형
Redis 의 메모리 설정
- Redis 운영 시 비교적 남은 메모리가 넉넉함에도 불구하고, fork 함수의 수행이 실패하는 경우가 발생함.
- 우선 fork() 함수에 대해서 알아보면,
- fork() 함수는 부모 프로세스와 동일한 크기의 메모리를 사용하는 프로세스를 생성함.
- 즉,리눅스에서 부모 프로세스가 사용하는 만큼의 메모리가 남아있지 않으면, fork() 함수가 실패하게 됨.
- fork() 함수는 부모 프로세스와 동일한 크기의 메모리를 사용하는 프로세스를 생성함.
- Redis 에서 fork() 함수를 호출하는 경우
- 스냇샷
- AOF
- 위의 2경우에서 호출한 fork() 함수가 실패한 이후의 Redis 는 모든 쓰기 연산에 대하여 실패 응답을 전송하게됨.
- 우선 fork() 함수에 대해서 알아보면,
- 즉, 다시말해서 이론적으로 만약 8GB의 데이터를 가진 Redis 를 운용하기 위해서는 반드시 8GB 이상의 유휴 메모리가 필요함.
- 그러나, 대부분의 상황에서는 Redis 가 호출한 fork() 함수에 의해서 생성된 자식 프로세스는 부모 프로세스의 메모리를 복사할 필요가 없음.
- 왜냐하면, 현재 부모 프로세스의 메모리를 읽어서 디스크에 저장하기 때문에..
- 그럼에도 불구하고, 추가적인 8GB의 메모리가 존재하지 않으면, fork() 함수가 실패함.
- 위의 현상을 방지하기 위해서 아래 리눅스 시스템 파라미터에 옵션을 추가함.
- /etc/sysctl.conf
- vm.overcommit_memory=1
- /etc/sysctl.conf
- 위의 현상을 방지하기 위해서 아래 리눅스 시스템 파라미터에 옵션을 추가함.
- 여기서 잠깐!) vm.overcommit_memory 커널 파라미터의 옵셤에 대해서 알아보자
- 그러나, 대부분의 상황에서는 Redis 가 호출한 fork() 함수에 의해서 생성된 자식 프로세스는 부모 프로세스의 메모리를 복사할 필요가 없음.
- 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%를 지정하는 것이 적당함.
- 이값을 기준으로, 쓰기 비율이 줄어들수록, 저장 가능한 메모리의 비율을 늘릴 수 있을 것 같음.
- 쓰기 연산 비율이 50을 넘는다면, 물리 메모리의 60%를 지정하는 것이 적당함.
-
결론
- Redis 운용 시 메모리 이슈가 있을 수 있으며, 서비스의 특성을 파악해서 메모리크기를 산정해야 함.
- Redis 운용 시 아래 커널 파라미터 값에 유의해야 한다.
- /etc/sysctl.conf
- vm.overcommit_memory
- /etc/sysctl.conf
- 오늘도 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 는 "스트레스의 원인이 되다"는 의미임.
- 질문) I get irritated when things don't go my way.
300x250
'좋아하는 것_매직IT > 9.redis' 카테고리의 다른 글
33.Redis, 레디스의 스냅샷에 대해서 알아보자구요! ^^ (0) | 2021.01.15 |
---|---|
32.Redis, 레디스 설정(redis.conf) 에 대해서 알아보자구요.^^ (0) | 2021.01.15 |
30.Redis, 운영 시 임계점에 대해서 알아 볼까요? ^^ CPU, Memory, Network에 대해서.. (0) | 2021.01.15 |
29.Redis, 샤딩에 대해서 알아볼께요. ^^.. Redis 는 클라이언트 측 샤딩만 지원한다네요..ㅎ (0) | 2021.01.15 |
28.Redis, 레디스 복제에 대해서 알아볼까요? 다중 복제의 단점을 보완하기 위한 계층형 복제란 ? ^^ (0) | 2021.01.15 |