이 답변은 값을 기반으로 OOM 상황이 발생했을 때 커널이 취한 조치를 설명합니다 sysctl vm.overcommit_memory
.
overcommit_memory
가 0 또는 1로 설정 되면 이 overcommit
활성화되고 프로그램은 실제로 사용 가능한 것보다 많은 메모리를 할당 할 수 있습니다.
이 상황에서 메모리가 부족하면 어떻게됩니까? OOM 킬러 는 어떤 프로세스를 먼저 죽일 지 어떻게 결정합니까?
답변
시스템의 안정성을 위협 할 수있는 정도로 프로세스에 의해 메모리가 완전히 소모되면 OOM 킬러가 등장합니다.
참고 : 커널이 실행하려고하는 나머지 프로세스의 원활한 기능을 위해 충분한 메모리가 확보 될 때까지 프로세스를 계속 종료하는 것이 OOM Killer의 작업입니다.
OOM Killer는 죽일 최상의 프로세스 를 선택해야합니다 . 여기서 가장 좋은 것은 죽일 때 최대 메모리를 확보하고 시스템에 가장 중요하지 않은 프로세스를 나타냅니다.
주요 목표는 수행되는 손상을 최소화하면서 동시에 사용 가능한 메모리 양을 최대화하는 프로세스 수를 최소화하는 것입니다.
이를 용이하게하기 위해 커널 oom_score
은 각 프로세스마다를 유지 합니다. 디렉토리 아래 파일 시스템 oom_score
의 각 프로세스를 볼 수 있습니다 ./proc
pid
$ cat /proc/10292/oom_score
oom_score
프로세스 의 가치가 높을수록 메모리 부족 상황에서 OOM Killer 에 의해 종료 될 가능성이 높습니다 .
OOM_Score
계산 은 어떻게 되나요?
David의 패치 세트에서 오래된 badness () 휴리스틱은 거의 완전히 사라졌습니다. 대신, 계산은 사용 가능한 메모리의 몇 퍼센트가 프로세스에서 사용되고 있는지에 대한 간단한 질문으로 바뀝니다. 시스템 전체의 메모리가 부족하면 “사용 가능한 메모리”는 시스템에 사용 가능한 모든 RAM 및 스왑 공간의 합계입니다.
대신, 주어진 CPU / 제어 그룹에 허용 된 메모리를 소진하여 OOM 상황이 발생한 경우 “사용 가능한 메모리”는 해당 제어 그룹에 할당 된 총량입니다. 메모리 정책에 의해 부과 된 한계가 초과되면 유사한 계산이 수행됩니다. 각 경우에 프로세스의 메모리 사용은 상주 세트 (사용중인 RAM 페이지 수)와 스왑 사용의 합계로 간주됩니다.
이 계산은 결과적으로 10 배의 수를 산출합니다. 사용 가능한 메모리의 모든 바이트를 사용하는 프로세스의 점수는 1000이고 메모리가없는 프로세스의 점수는 0입니다. 이 점수에 대한 휴리스틱 조정은 거의 없지만 코드는 여전히 루트 프로세스의 점수에서 사용자 소유 프로세스보다 약간 더 가치가 있다는 개념에서 약간의 금액을 뺍니다 (30).
적용되는 또 다른 조정은 / proc을 통해 조정할 수있는 각 프로세스의 oom_score_adj 변수에 저장된 값을 추가하는 것입니다. 이 노브를 사용하면 사용자 공간에서 OOM 킬러에 대한 각 프로세스의 매력을 조정할 수 있습니다. -1000으로 설정하면 OOM 킬이 완전히 비활성화되고 +1000으로 설정하면 관련 프로세스에서 큰 대상을 그리는 것과 같습니다.
참고 문헌
http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process
https://serverfault.com/a/571326