OOM-killer가 때때로 자원 점유자를 죽이지 못하는 이유는 무엇입니까?

OOM-killer가 때때로 자원 점유자를 죽이지 못하는 이유는 무엇입니까?

이것을 쉘에 입력하면 메모리가 고갈될 때까지 영원히 쓰려고 시도 x=`yes`하게 됩니다 . 커널의 OOM-killer가 더 이상 할당할 바이트가 없으며 즉시 종료해야 한다고 알려주기 때문에 메시지를 받습니다 .cannot allocate 18446744071562067968 bytes (4295032832 bytes allocated)yesxcannot allocate <memory>xrealloc

하지만 game_engine리소스 부족으로 인해 존재하지 않는 그래픽 메모리를 더 할당해달라고 누군가에게 요청하면 요청된 메모리를 할당하기 위해 RAM과 CPU가 사용됩니다.

커널의 OOM-killer가 game_engine대용량 메모리를 할당하려는 시도를 포착하지 못하는 이유는 무엇입니까 x=`yes`?

즉, 실행 중이고 game_engine사용자가 memory-hog 이후 새 프로세스를 생성하지 않은 경우 OOM-killer에 의해 종료되지 않고 내 시스템을 응답하지 않고 복구할 수 없는 상태로 만드는 데 항상 성공하는 game_engine이유는 무엇입니까 game_engine?


나는 게임 엔진을 예로 들었습니다. 왜냐면 게임 엔진은 나의 불쌍한 작은 통합 카드에 많은 메모리를 할당하는 경향이 있기 때문입니다. 그러나 이것은 자원 집약적인 X 프로세스가 많은 경우에 발생하는 것 같습니다.

OOM-killer가 효과적이지 않거나 프로세스 메모리를 비활성화할 수 없는 상황이 있습니까?

답변1

사실, OOM 킬러에 대한 최선의 해결책은 그것을 갖지 않는 것입니다. 과도한 메모리를 사용하지 않도록 시스템을 구성하고 이에 의존하는 응용 프로그램 및 라이브러리의 사용을 거부하십시오. 무한 디스크 시대에 무제한 스왑을 제공하는 것은 어떨까요? 메모리를 사용하지 않는 이상 스왑을 커밋할 필요는 없겠죠?

귀하의 질문에 대한 대답은 OOM 킬러가 귀하가 생각하는 대로 작동하지 않는다는 것일 수 있습니다. OOM 킬러는 경험적 방법을 사용하여 종료할 프로세스를 선택하며 규칙이 항상 마지막 요청자가 종료된다는 것을 의미하지는 않습니다. 참조.OOM 킬러 길들이기. 따라서 OOM 킬러가 "무효"라는 문제가 아니라 그 중 하나가 원하는 것과 다른 선택을 하는 것이 문제입니다.

관련 정보