OOM Killer 사전 로드

OOM Killer 사전 로드

내 컴퓨터에는 스왑 파티션/파일이 없고 2GB RAM만 있습니다.

때로는 일부 프로세스로 인해 메모리가 포화되는 경우가 있습니다(도래 송곳+ 브라우저 + 컴파일러 +...) 시스템이 무기한 정지되는 경우 시스템을 다시 시작하는 유일한 방법(하드 리셋 제외)은 SysRq를 사용하는 것입니다.

알겠어요메모리 부족 킬러메모리가 완전히 가득 차면 커널이 OOM Killer 자체를 할당할 수 없기 때문에 도움이 되지 않습니다.

메모리가 완전히 가득 찼을 때 실제로 작동할 수 있도록 OOM Killer를 미리 로드할 수 있는 방법이 있습니까?
아니면 메모리가 가득 찼을 때 OOM Killer가 활성화되도록 커널을 조정할 수 있습니까 ${TOTAL_RAM} - 10MB?

답변1

나는 커널이 자체적으로, 즉 oom_killer를 시작하기 위해 일부 메모리를 예약한다고 확신합니다.

(메모리가 부족해서 로드할 수 없다면 oom_killer가 무슨 소용이 있나요?)

답변2

커널은가장 작은여유 공간 자체의 양. 다음을 통해 값을 볼 수 있습니다.

$ sysctl vm.min_free_kbytes
vm.min_free_kbytes = 2842

$ cat /proc/sys/vm/min_free_kbytes
vm.min_free_kbytes = 2842

이 값의지하다RAM 용량(위의 경우 512MB)에 대해서는 늘려볼 수 있지만 이것이 문제를 해결해줄 수는 없을 것 같습니다(OOM이 더 빨라질 확률이 더욱 높아집니다).

OOM 킬러는 애플리케이션을 종료할 수 있을 만큼 충분한 여유 메모리를 가지고 있어야 합니다. 그렇지 않으면 Chris가 이미 지적한 대로 메모리 보유 목적을 상실하게 됩니다.

편집하다: 그런데, 단지 커널 매개변수(OOM 값)를 수정하는 것이 사용자 공간 프로그램 문제를 해결하는 가장 좋은 방법은 아니라고 생각합니다. 커널은 무슨 일이 일어나고 있는지, 특정 상황을 처리하는 방법을 가장 잘 알고 있습니다. 이러한 값을 사용하지 말고 대신 사용자 공간 프로그램(Xorg, 브라우저)에서 생성된 메모리 문제를 해결해 보십시오. 또 댓글도 보세요mm/oom_kill.c소스 문서에서 커널 개발자조차도 OOM 킬러가 잘 구성된 환경에서 많은 일을 해야 한다고 믿지 않습니다.

답변3

이를 방지하는 한 가지 방법은 경험적 오버커밋 처리를 끄고 오버커밋 없음으로 설정하는 것입니다. sysctl vm.overcommit_memory=2를 설정한 다음 vm.overcommit_ratio를 낮추세요. 이 기사를 읽어보세요커널 문서에서.

특정 PID를 타겟팅할 수도 있습니다.OOM의 우대/proc/$PID/oom_adj를 수정합니다.

답변4

시스템이 무기한 정지됨

왜 멈추는지 알고 싶다면 다음을 참조하세요.답변비슷한질문.

중단되는 것을 방지하고 필요한 경우 거의 즉시 OOM-killer를 실행하려면 다음을 시도해 보십시오 EDIT.이 문제(참고: 커널을 다시 컴파일해야 합니다).

관련 정보