메모리 상승과 오버커밋

사내 테스트용 DB서버에서 프로세스에 메모리할당을 하지못하는 부하문제가 발생하여 메모리 할당에 실패한 시간대에 메모리 사용량을 조사하였다

$ sar -r -f /var/log/sa/sarXX

결과적으로 %commit가 100에 가까워졌을때 메모리할당에 실패하고있는것을 확인하였다. 100을 넘지 못하고 메모리 할당에 실패하고 있다는것은 OS 설정상 메모리 오버커밋이 허용되지 않은 상태라는 것이다.

%commit 이란 무엇인가

%commit을 기록하고있는 /var/log/sa/sarxx 파일은 시스템의 통계정보와 관련된 기능을 모은 systat 패키지에 포함된 기능(명령어)중 하나인 sar 명령어로 출력되는 파일이다.

CPU, 메모리,I/O, 네트워크등 시스템과 관련된 사용상태정보를 정기적으로 기록하고있기 때문에 시스템의 동작상태를 확인하는데 도움이되는 기능이다.

$ man sar 로 확인하면 아래와 같은 설명이있다

Percentage  of memory needed for current workload in relation to the total amount of memory (RAM+swap).
This number may be greater than 100% because the kernel usually overcommits memory.

Linux에서는 프로세스가 메모리를 확보하는경우 즉시 실제메모리를 할당하는것이아닌 가상메모리만을 할당한다. 그리고 실제 사용하는 단계에서 실제 물리메모리를 할당한다.

이렇게 프로세스가 가상메모리를 할당받은상태를 %commit이라고 한다 (메모리 할당을 요청하고 사용하지않는 상태)

그렇게 하는 이유는 프로세스가 요구하는 메모리는 실제 요구한 메모리를 전부 사용하는 경우는 별로 없기때문이다

예를들면 피크상태에서 40MB정도가 사용되기 때문에 일단 40MB를 확보하려하는 프로그램이 있다고 가정하자. 그러나 그 프로그램은 실제로 40MB를 사용하는 경우느 거의없고 보통1MB정도만 사용된다. 그런경우 요구된 메모리를 항상 할당해버리면 프로그램이 동작할때 39MB가 할당만되고 사용되지않는 상태가 된다.

이렇듯 프로그램이나 프로세스가 요구한 메모리를 그대로 할당해버리면 사용되지않는 메모리가 증가해버린다. 사용되지않고 할당만된 메모리가 많으면 다른 프로그램이나 프로세스가 동작되지않는등 악영향을 끼칠 가능성이 있다.

메모리 오버커밋이란

Linux에서는 요구된 메모리를 그대로 할당하는것이아닌 실제 사용되는 시점에 필요한 만큼의 메모리를 할당한다라는 방식을 취하고있다. 만약 요구된 메모리의 총합이 실제OS에서 가지고있는 메모리의 총량보다 많더라도 실제로 메모리가 부족해지기 전까지는 실제로 사용되지 않을 가능성이 있기때문에 OK라고 판단하여 계속 프로그램의 동작을 허가해버린다. 결과적으로 요구 메모리의 총량 = %commit 이 100%를 넘는경우가 생긴다.

이렇듯 실제메모리 총량을 넘는 메모리를 요구를 허용하는것을 오버커밋이라 부른다. 그덕에 Linux에서는 메모리 낭비없이 활용하는것이 가능하다.

그러나 동작중인 프로세스가 실제 대량으로 메모리를 사용하여 실제메모리총량을 넘어설경우 어떻게될까? 그 답은 중요도가 떨어지는, 동작하지않는, 메모리 사용량이 많은등의 조건으로 필요없는 프로세스를 kill하여 그 프로세스가 사용하던 메모리를 확보한다. 즉 OOM-killer(Out Of Memory killer) 로 문제를 해결하는것이다.

OOM-Killer는 장애의 원인으로 지목되기도 하지만 오버커밋을 이용하여 메모리를 운용하기 위해서는 필수불가결한 기능이다.

오버커밋 제어

OOM-killer에 의한 장애도 무시할수 없기때문에 오버커밋 가능한 메모리량을 제어 하는 기능이 있다.

/etc/sysctl.d/ 에 이하의 설정이 가능하다. 설정후에는 $ sysctl -p 명령어로 설정을 반영할수있다.

vm.overcommit_memory = X

x에 설정가능한 값은 0 ~ 2 이다.

  • 0 : 기본값
    • 그 시점에서 이용가능한 메모리 총량을 넘어설경우 메모리할당 요구를 거부한다.
  • 1:무제한
    • 오버커밋을 제한하지 않는다. OOM-killer 발생 리스크가 크다.
  • 2: 무효
    • 요구된 메모리총량이 swap총량 + 물리메모리총량 * vm.overcommit_ratio/100 을 넘어설경우 메모리요구를 거부한다.
    • vm.overcommit_ratio도 /etc/sysctl.d/에서 설정 가능하다. 기본값은 50이다.

현재의 설정값은 sysctl vm.overcommit_memory 명령어로 확인이 가능하다.

현재 문제가 일어나고 있는 사내 시스템은 설정치가 2로 되어있다. 그렇기 때문에 OOM-killer 발생가능성은 적지만 오버커밋이 일어나지않고 메모리 할당에 실패하는것이다.

일단 swap메모리를 추가하는것으로 1차 대응을 실시하여 현재는 문제없이 가동되고 있는 상태이다.

태그: ,

카테고리:

업데이트: