커널 oom 점수는 어떻게 계산됩니까? . 사용 된 총

Google을보고 점수 proc/<pid>/oom_score계산 방법을 설명하는 항목을 찾을 수 없습니다 . 사용 된 총 메모리를 사용하는 대신이 점수를 사용하는 이유는 무엇입니까?



답변

당시 구현 한 Goldwyn Rodrigues의 2009 년 기사 , 현재의 행동에 대한 Jonathan Corbet의 2010 년 기사 , 향후 변경에 대한 아이디어는 Jonathan Corbet의 2013 년 기사참조하십시오 .

2010 년 기사에서 :

David의 패치 세트에서 오래된 badness () 휴리스틱은 거의 완전히 사라졌습니다. 대신, 계산은 사용 가능한 메모리의 몇 퍼센트가 프로세스에서 사용되고 있는지에 대한 간단한 질문으로 바뀝니다. 시스템 전체의 메모리가 부족하면 “사용 가능한 메모리”는 시스템에 사용 가능한 모든 RAM 및 스왑 공간의 합계입니다. 대신, 주어진 CPU / 제어 그룹에 허용 된 메모리를 소진하여 OOM 상황이 발생한 경우 “사용 가능한 메모리”는 해당 제어 그룹에 할당 된 총량입니다. 메모리 정책에 의해 부과 된 한계가 초과되면 유사한 계산이 수행됩니다. 각각의 경우에 프로세스의 메모리 사용은 상주 세트 (사용중인 RAM 페이지 수)와 스왑 사용의 합계로 간주됩니다.

이 계산은 결과적으로 10 배의 수를 산출합니다. 사용 가능한 메모리의 모든 바이트를 사용하는 프로세스의 점수는 1000이고 메모리가없는 프로세스의 점수는 0입니다. 이 점수에 대한 휴리스틱 조정은 거의 없지만 코드는 여전히 루트 프로세스의 점수에서 사용자 소유 프로세스보다 약간 더 가치가 있다는 개념에서 소량 (30)을 뺍니다.

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