Friday, May 9, 2008

Memory, Opportunistic Allocation

linux는 opportunistic allocation을 사용한다. 프로세스가 메모리 할당을 추가로 요구하면 바로 commit 해주지만 실제로 할당은 안되어 있다. 프로세스가 할당되어 있다고 생각한 이 영역에 뭔가를 쓰려고 하면 그때야 비로소 메모리를 할당해주는데 여기에는 demand paging, cow 등이 사용될 수 있다.

이런식의 메모리 할당은 실제 필요한 메모리만 할당해줄 수 있어 공간 효율적이고, 할당 작업을 실제 필요할 때까지 늦출 수 있으며, 실제 가능한 공간 이상으로 할당 해줄 수도 있다(overcommitment)

경우에 따라서 가용한 메모리 공간 보다 더 큰 영역을 할당해달라고 요청하는 프로세스들도 있는데, 커널에서 이를 수용하는 것을 overcommitment라고 한다. 이렇게 overcommitment되어 잘사용되면 다행이고, 진짜로 실제 메모리 이상을 사용하게 되면 OOM (out of memory)에러를 내어 OOM Killer가 해당 프로세스를 종료시키므로, 전체 동작에는 지장이 없다. overcommit 에도 옵션이 있는데, /proc/sys/vm/overcommit_memory 의 값을 통해 조정할 수 있다 (혹은 sysctl의 vm.overcommit_memory).

값이 0인 경우 휴리스틱한 overcommitment를 허용해주고, 1인경우 모든 요청을 허용해준다. 2인 경우에는 overcommitment를 disable하고 strict accounting을 enable하는데, 메모리 할당이 스왑영역 + 물리적 메모리의 일정 비율부분 까지로 제한된다. 일정 비율 부분은 /proc/sys/vm/overcommit_ratio에 정의되어 있는데, 이 값이 50인경우(default) 할당 가능한 메모리 공간은 스왑크기 + 물리적 메모리 크기의 50% 이다.

OOM Killer에 의해 프로세스가 죽는 것을 원치 않기 때문에 strict accounting을 하려고 하지만, 이게 만병통치약은 아니다. ( 가상 메모리는 대부분의 프로세스가 필요이상의 메모리를 할당하여 동작하려한다는 패턴에 기초하여 제공되는 메커니즘인데, 이를 사용하지 않겠다는 것이기 때문이다 )

No comments:

Post a Comment