리눅스 서버의 vm.overcommit 허용 설정 확인과 설정 방법을 정리해둔다.
설정 확인
cat /proc/sys/vm/overcommit_memory
값 | 의미 |
0 | 기본값. 적당히(hueristic) overcommit 허용 |
1 | 항상 overcommit. 항상 메모리 할당에 성공한다. |
2 | 제한적으로 overcommit 허용. 가용 메모리 내에서만 할당 가능 |
설정 변경
echo 1 > /proc/sys/vm/overcommit_memory
echo 명령으로 값을 설정할 수 있다. 시스템 설정을 변경하는 작업이기 때문에 root 권한이 필요하다.
memory commit
프로세스는 시스템 콜을 사용해 커널에 메모리를 요청한다. 커널을 시스템 콜을 받고 해당하는 메모리 영역의 주소를 전달자로 반환하는데, 프로세스가 메모리 할당만 받고 사용은 하지 않을 수도 있기 때문에 할당한 메모리 주소를 물리 메모리에 바인딩하지는 않는다.
즉, memory commit이란 프로세스는 메모리를 할당받았으나, 실제로 물리 메모리는 할당되지 않은 상태를 말한다.
commit 비율 확인
sar -r
프로세스가 메모리를 요청했으나 사용은 하지 않은 메모리 공간이 22.3% 임을 확인할 수 있다.
overcommit
commit을 더 하게 해주는 기능으로, 순간적으로 많은 메모리를 요구하는 작업이 필요할 수 있기 때문에 사용한다.
특히 새로운 프로세스를 생성하는 시스템 콜인 fork()를 호출하면 자식 프로세스는 부모 프로세스의 모든 메모리 주소 공간을 복사하는데 이 과정에서 memory commit 발생하고, 경우에 따라서는 overcommit이 필요하다.
overcommit는 프로세스가 메모리를 할당하는데 큰 영향을 주는 설정이다.
2로 설정하여 제한적으로 overcommit을 허용하면 가용 메모리 내에서만 할당하기 때문에 OOM Killer가 동작하진 않지만, 메모리 할당 문제로 인해 프로세스가 죽을 수 있다.
1로 설정하여 항상 overcommit이 가능하도록 허용하면, 갑작스러운 시스템 행 상태가 발생할 수 있다.
참고 문서