파이문

[Linux] Memory Commit 이란? 본문

TIL/리눅스 Linux

[Linux] Memory Commit 이란?

민Z 2021. 2. 19. 00:20

 프로세스는 커널에게 필요한 만큼의 메모리를 요청하고 커널은 메모리 영역을 프로세스에게 주지만, 실제로는 할당은 하지 않고 해당 영역을 프로세스에게 주었다는 것을 저장해 둔다.

 

이 과정을 Memory commit 이라고 부른다.

 

Memory commit 이 필요한 이유

가장 큰 이유는 fork() 와 같은 프로세스를 생성하는 시스템 콜을 처리할 수 있어야 하기 때문이다.

 

예를 들면 물리 메모리가 4기가 일 때, 3기가 프로세스 A가 돌고 있다고 해 보자. 해당 프로세스가 자식 프로세스 B를 생성하게 (fork) 되면 자식 프로세스 B는 부모 프로세스 A와 마찬가지로 3기가 프로세스일 것이다. 

 

하지만 이미 전체 메모리 4기가에서 3기가를 부모 프로세스 A 가 사용하고 있기 때문에 가용 메모리는 1기가 밖에 되지 않는다.

메모리가 부족하기 때문에 fork 는 실패할 것이라고 생각 되지만 (자식 프로세스 B 생성 실패) 실제로는 성공한다.

 

커널에 의해서 memory commit 이 되어 자식 프로세스 B 에게 3기가를 준 척(?) 할 수 있는 것이다.

만약 memory commit 이 없다면 자식 프로세스는 생성 되지 못할 것이다.

 

이때 남은 가용 메모리가 1기가 였기 때문에 자식 프로세스 B 는 2기가가 overcommit 이 되었다고 한다.

overcommit 

이처럼 요구된 메모리가 가용 메모리 보다 커도 overcommit 이라는 개념 덕분에 프로세스는 정상 동작할 수 있게 된다.

 

만약 동작중인 프로세스가 실제로 가용 메모리 보다 더 큰 메모리를 사용하게 된다면 (위의 예시는 fork 를 위한 일시적인 메모리 요청) OOM Killer 가 동작하게 된다. (OOM Killer 참고)

 

OOM Killer 가 정말 중요한 (예를 들면 DB 라든가) 프로세스를 죽이면 안되기 때문에 overcommit 옵션을 조정하여 그 비율과 사용 여부를 설정할 수 있다.

 

이 때 두개의 파라미터를 사용한다. 바로 /proc/sys/vm/overcommit_memory 와 /proc/sys/vm/overcommit_ratio 이다.

 

/proc/sys/vm/overcommit_memory (v.overcommit_memory) 는 아래 3개의 옵션을 갖는다.

  • 0: 커널에서 사용하는 기본 값이다.
  • 1: 항상 commit 을 하겠다는 의미다. (overcommit 사용하지 않겠다는 의미) 그래서 남은 메모리가 얼마나 충분한지는 확인하지 않는다. 이 때문에 메모리 누수가 있는 프로세스가 있다면 문제가 생길 것이다. (OOM Killer 발생)
  • 2: vm.overcommit_ratio 에 따라서 overcommit 이 일어난다.

각 값에 대한 자세한 설명은 아래 참고 링크들에 있는 문서에 더 자세히 적혀 있다.

 

참고

- brunch.co.kr/@alden/16

- jujupapa.tistory.com/37?category=1018474

- engineering.pivotal.io/post/virtual_memory_settings_in_linux_-_the_problem_with_overcommit/

- www.kernel.org/doc/Documentation/vm/overcommit-accounting

- hakkyoonjung31.github.io/linux/memory-overcommit/

Comments