시스템이 비활성 페이지를 선제적으로 교체하도록 할 수 있지만( vm.swappiness
) 시스템의 RAM이 부족해(메모리가 부족해지는 대신) 강제로 교체해야 하는 경우 oom-killer를 호출할 수 있습니까?
궁극적인 목표는 주요 페이지 오류로 인해 디스크가 손상되기 시작하는 경우 시스템이 정지되는 것을 방지하면서도 여전히 비활성 페이지를 교체할 수 있도록 허용하는 것입니다.
또 다른 희망은 oom-killer가 트리거되기 전에 시스템이 강제로 사용해야 하는 스왑 메모리의 양을 구성하는 것입니다. 이렇게 하면 시스템은 너무 많지 않은 한 스왑 공간을 약간 사용할 수 있습니다. 또는 모든 RAM이 사용되기 전에 oom-killer를 트리거하는 임계값을 설정하여 항상 파일 시스템 캐시를 위한 공간을 확보할 수 있습니다(따라서 더 많은 디스크 스래싱을 방지).
그렇게 하기는 어려울 것 같지 않습니다. 시스템이 X 램을 사용/유휴 상태일 때 oom-killer가 트리거되도록 지시할 수 있는 것 같습니다. 하지만 그것이 내가 묻는 이유입니다.
vm.swappiness
명확히 하기 위해 스와핑을 끄거나 매개변수를 조정하고 싶지 않습니다.
답변1
저도 이 문제로 어려움을 겪고 있습니다. 어쨌든 저는 시스템이 계속 응답하기를 원하며 몇 분 동안 기다리기보다는 프로세스를 놓치는 편이 낫습니다. 커널 OOM 킬러를 사용하여 이를 달성할 수 있는 방법은 없는 것 같습니다.
그러나 사용자 공간에서는 우리가 원하는 것은 무엇이든 할 수 있습니다. 그래서 저는 초기 OOM 데몬(https://github.com/rfjakob/earlyoom) 사용 가능한 RAM이 10% 미만으로 떨어지면 가장 큰 프로세스가 RSS를 통해 종료됩니다.
Earlyoom이 없으면 부팅하여 내 컴퓨터(8GB RAM)를 쉽게 잠글 수 있습니다.http://www.unrealengine.com/html5/여러번. 이제 문제가 해결되기 전에 유죄 브라우저 탭이 종료됩니다.
답변2
이는 지나치게 복잡한 솔루션처럼 들립니다. 나는 (최대 절전 모드가 필요하지 않은 시스템에서 이 작업을 수행함) 간단히 소량의 스왑 공간(128-256MiB)을 할당하는 것을 권장합니다. 이런 방식으로 커널은 일부 페이지를 교환할 수 있지만 문제가 발생하기 전에 OOM-killer가 호출됩니다.
정말로 이 작업을 수행하려면 스왑 사용량을 모니터링하고 다음을 사용하여 OOM-killer를 호출하는 스크립트/프로그램을 직접 작성해야 한다고 생각합니다.마법의 SysReq 키(이것은 프로그래밍 방식으로 작성하여 수행할 수 있습니다 /proc/sysrq-trigger
).