OOM 킬러는 어떤 프로세스를 먼저 종료할지 어떻게 결정합니까?

OOM 킬러는 어떤 프로세스를 먼저 종료할지 어떻게 결정합니까?

이것대답은 OOM 조건이 발생할 때 값을 기반으로 커널이 취하는 조치를 설명합니다 sysctl vm.overcommit_memory.

overcommit_memory0 또는 1로 설정 하면 overcommit활성화되고 프로그램이 실제로 사용 가능한 것보다 더 많은 메모리를 할당할 수 있습니다.

자, 이런 상황에서 메모리가 부족해지면 어떻게 될까요? 어떻게OOM 킬러어떤 프로세스를 먼저 종료할지 결정하세요.

답변1

시스템 안정성을 위협할 정도로 프로세스에 의해 메모리가 고갈되면 OOM 킬러가 나타납니다.

노트:OOM Killer의 임무는 커널이 실행하려는 나머지 프로세스가 원활하게 실행될 수 있도록 충분한 메모리가 확보될 때까지 프로세스를 계속 종료하는 것입니다.

OOM Killer를 선택해야 합니다.최고죽이는 과정입니다.최고이는 종료 후 가장 큰 메모리를 해제하는 프로세스를 의미하며 시스템에 가장 덜 중요한 프로세스이기도 합니다.

주요 목표는 최소한의 프로세스 수를 종료하여 피해를 최소화하면서 해제된 메모리 양을 최대화하는 것입니다.

이를 용이하게 하기 위해 커널은 oom_score각 프로세스마다 하나씩 유지합니다. 이 디렉토리 아래의 파일 시스템 oom_score에 있는 각 프로세스에 대한 정보를 볼 수 있습니다./procpid

$ cat /proc/10292/oom_score

프로세스의 가치가 높을수록 oom_score종료될 확률이 높아집니다.메모리 오버플로 킬러메모리가 부족한 경우.

어떻게 계산되나요 OOM_Score?

David의 패치 세트에서는 기존 badness() 휴리스틱이 거의 완전히 사라졌습니다. 대신, 계산은 프로세스에서 사용 가능한 메모리의 몇 퍼센트를 사용하고 있는지에 대한 간단한 질문이 됩니다. 시스템의 전체 메모리가 부족한 경우 "사용 가능한 메모리"는 시스템에서 사용할 수 있는 모든 RAM과 스왑 공간의 합계입니다.

반대로, 특정 CPUset/제어 그룹에 허용된 메모리를 소진하여 OOM 조건이 발생한 경우 "사용 가능한 메모리"는 해당 제어 그룹에 할당된 총량입니다. 메모리 정책에 의해 부과된 제한이 초과되는 경우에도 비슷한 계산이 이루어집니다. 각 경우에 프로세스의 메모리 사용량은 상주 세트(사용 중인 RAM 페이지 수)와 스왑 사용량의 합계로 간주됩니다.

이 계산을 통해 백분율에 10을 곱한 결과가 나옵니다. 사용 가능한 메모리의 모든 바이트를 사용하는 프로세스는 1000점을 받고, 메모리를 전혀 사용하지 않는 프로세스는 0점을 받습니다. 이 점수에 대한 경험적 조정은 거의 없지만 루트 소유 프로세스가 사용자 소유 프로세스보다 약간 더 가치가 있기 때문에 코드는 여전히 루트 소유 프로세스의 점수에서 소량(30)을 뺍니다.

적용된 또 다른 조정은 각 프로세스에 대해 oom_score_adj 변수에 저장된 값을 추가하는 것이었습니다. 이 값은 /proc를 통해 조정할 수 있습니다. 이 노브를 사용하면 사용자 공간에서 각 프로세스가 OOM 킬러에게 얼마나 매력적인지 조정할 수 있습니다. -1000으로 설정하면 OOM 킬링이 완전히 비활성화되고, +1000으로 설정하면 관련 프로세스에 큰 대상을 그리는 것과 같습니다.

인용하다

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326

관련 정보