하위 프로세스 대신 상위 프로세스를 종료하도록 Linux OOM Killer를 구성하는 방법이 있습니까? 하위 프로세스가 종료되면 상위 프로세스는 계속해서 잘못된 상태로 실행됩니다. 하위 프로세스가 종료되었는지 감지한 다음 종료할 수 있지만 OOM 킬러에게 하위 프로세스를 희생하는 대신 상위 프로세스를 종료하도록 지시할 수 있는 방법이 있는지 궁금합니다.
답변1
더미 파일의 값을 변경하여 특정 프로세스가 OOM Killer의 피해자로 선택될 확률을 조정할 수 있습니다 /proc/<pid>/oom_score_adj
. 값이 1000에 가까울수록 OOM Killer가 프로세스를 선택할 가능성이 높아집니다.
피해자를 선택하기 위해 OOM Killer가 사용하는 논리는 다양한 커널 버전에서 변경되었습니다. 최신 커널 버전은 기본적으로 하위 프로세스를 종료하는 것을 선호합니다. 일반적인 오류 상황은 웹 서버가 작업자 프로세스를 시작하고 오류가 발생하면 단일 작업자 프로세스가 제어를 벗어나 메모리를 소비하기 시작하는 것이므로 최선의 수정 조치는 하위 프로세스를 종료하는 것입니다. 자식 프로세스 및 가정 부모 프로세스는 자식 프로세스가 종료되었음을 알게 되면 이 상황을 처리할 수 있습니다. Apache의 경우 특정 하위 프로세스의 실패를 기록하고 계속 실행됩니다. 반면에 PostgreSQL(Linux 커널의 Apache와 매우 유사함!)은 하위 프로세스가 종료되었음을 확인하고 자동으로 다른 모든 하위 프로세스를 종료하고 상위 프로세스를 다시 시작하여 전체 시스템 상태가 완전히 알려졌는지 확인합니다. 두 경우 모두 유일한 상위 프로세스를 종료해도 더 나은 결과가 나오지 않습니다. 여러 탭(각 탭이 별도의 하위 프로세스로 실행됨)이 있는 Google Chrome은 비슷하게 작동합니다. RAM이 부족한 탭 하나가 전체 브라우저 충돌을 일으키지 않습니다.
문제는 oom_score_adj
이것이 OOM 킬러의 선택 논리에 대한 승수가 아니라 프로세스에 대해 계산된 전체 시스템 RAM의 추가 천분의 일이라는 것입니다. 예를 들어, 32GB RAM이 있고 Chrome 탭의 oom_score_adj
값이 300(Google Chrome 호스트 프로세스에 의해 자동으로 설정됨)이고 탭이 실제로 105MB RAM을 소비하는 경우 해당 탭은 확실히 OOM 피해자로 선택됩니다. OOM Killer가 시작될 때 피해자가 발생하면 커널 OOM Killer 구현은 현재 해당 Chrome 하위 항목의 "논리적 메모리 사용량"을 105MB + 300/1000 * 32GB = 9705MB로 계산합니다. 분명히 시스템은 프로세스를 종료하여 9.7GB의 RAM을 확보하지는 않지만 더 큰 프로세스가 없으면 계속 선택됩니다.