About OOM (Out of memory)

rOOM 이란 메모리가 부족하여 프로세스에게 메모리를 더 이상 할당해 줄 수 없는 상황을 말합니다.
r
r보통 다음의 3가지 상황에 의해 발생합니다.
§1. 새로운 프로세스 실행 (fork, exec)
§2. 동적 메모리할당 (malloc)
§3. 할당만 되어있는 영역에 R/W을 할 때
r

현재 리눅스 커널은 OOM이 발생하면 oom_kill.c 에 구현되어 있는 OOM_Killer가 알고리즘에 따라 포인트를 계산하고 가장 높은 포인트를 가진 프로세스를 죽입니다

 

r리눅스는 각각의 프로세스마다 가상메모리라는 것을 가지고 있으며, Overcommit이라는 개념을 사용하여 다소 낙관적인 메모리 할당 정책을 사용하고 있습니다. (Swap 고려)
§프로세스는 자신이 요청한 메모리 양을 동시에 모두 사용하지 않는다.’
§
rOvercommit 이란 할당된 가상메모리 주소 중 실제 물리메모리의 크기를 넘어서는 부분을 의미합니다.
r
r또한 리눅스는 실제로 가상메모리가 물리메모리에 맵핑되는 시점을 프로세스가 메모리에 읽기/쓰기 할 때로 미룹니다.

 

room_kill_allocating_task
§/proc/sys/vm/oom_kill_allocating_task에 위치
§값을 변경하여 OOM에 대한 동작을 변경할 수 있음
§
§
§
§
§
§값 변경
$ sudo echo 0 > /proc/sys/vm/oom_kill_allocating_task
Value Action
0 tasklist에 있는 모든 task에 대해 heuristic한 방법으로 killtask를 선택
not 0 OOM 상황을 triggertask를 선택해서 kill

 

§/proc/sys/vm/overcommit_memory에 위치

 

§값을 변경하여 OOM에 대한 동작을 변경할 수 있음

 

Value Action
0 커널이 overcommit을 허용할지를 결정할 때, 이미 정의되어 있는 Heuristic한 방식을 적용하여 결정 (default)
- 메모리 요구가 있을 때 여유 공간이 없는 경우, 실행중인 프로세스를 강제 종료하여 메모리를 확보
1 항상 overcommit을 수행
2 overcommit이 특정 값을 넘어가지 않도록 방지
- 전체 commit = [Swap space size] + [RAM size] * [overcommit_ratio] / 100

 

§/proc/sys/vm/swappiness에 위치
§스왑 메모리에 대한 활용 수준을 조절
 
Value Meaning
0 Swapping 끄기
1 Swapping 최소화
10 메모리가 충분할 경우, 성능향상을 위해 권장
60 기본값 (default)
100 적극적으로 스왑 메모리를 사용

 

§값 변경
# echo 10 > /proc/sys/vm/swappiness