귀하의 의견으로는 시스템이 스와핑되는 것처럼 들립니다.
리눅스는 OOM 킬러를 가지고 있는데,이 시스템은 시스템이 메모리를 오버 커밋하고 호출 할 때 호출된다.
리눅스는 기본적으로 메모리 오버 커밋을 수행하는데, 이는 기본적으로 시스템이 실제로 가지고있는 것보다 더 많은 메모리를 제공한다는 것을 의미합니다. 프로그램이 실제로 요청한 모든 메모리를 사용하지 않는다는 가정하에이를 수행합니다. 그러나 시스템에 메모리가 부족하면 이미 실행중인 다양한 프로세스에 메모리가 있다고 알려주므로 더 이상 거부 할 수 없습니다. 대신 OOM 킬러를 호출하는 것입니다. OOM 킬러는 기본적으로 커널이 메모리 부족 조건을 완화 할 것이라고 생각하는 프로세스를 찾습니다. 일반적으로 이것은 가장 많은 양의 메모리를 사용하는 프로세스이지만 알고리즘은 실제로 그보다 훨씬 복잡합니다.
당신이 한 이후 overcommit_memory
로 설정 0
(자동 모드), 커널은 메모리 오버 커밋을 수행하고 있습니다. 설명 된 동작에서 시스템이 크게 바뀌는 것처럼 들립니다.
여기에는 두 가지 옵션이 있습니다.
스왑 감소
시스템에 RAM이 부족하여 커널이 스왑을 시작합니다. 시스템의 스왑이 부족하면 OOM 킬러를 호출합니다. 그러나 사용 가능한 스왑 공간이 남아 있기 때문에 이런 일이 발생하지 않습니다.
당신의 원래 아이디어는 수동으로 프로세스를 죽입니다.
시스템이 너무 많이 스왑되고 있다고 생각할 때 프로세스를 수동으로 종료 할 수 있습니다. 이것은 커널 SysRq 트리거를 통해 수행 할 수 있습니다.
커널에는 "magic SysRq"라고하는 것이 있습니다. 이것은 커널에게 일종의 비상 작업을 수행하도록 지시하는 약간의 기능입니다. "모든 볼륨을 읽기 전용으로 마운트 해제", "모든 파일 시스템 동기화"또는 "지금 재부팅"과 같은 것이 될 수 있습니다. 이러한 옵션 중 하나는 OOM 킬러를 호출하는 것입니다.
커널에 매직 SysRq가 활성화 된 경우 (커널 옵션 CONFIG_MAGIC_SYSRQ
) 두 가지 방법으로이를 수행 할 수 있습니다.
- Alt+ SysRq+ f
키보드에서이 3 개의 키를 누르기 만하면됩니다.
echo f > /proc/sysrq-trigger
이것은 키보드 방법과 똑같은 작업을 수행하지만 프로그래밍 방식으로 수행합니다.
또한 스왑을 완전히 비활성화 할 수 있으며 이것이 대부분의 시스템에서 수행하는 작업이며 정확한 이유입니다. 스왑은 커널이 사용되지 않는 데이터를 선제 적으로 스왑하여 캐싱에 더 많은 램을 사용할 수 있다는 점에서 유리합니다. 그러나 그것은 당신이보고있는이 강제 교환 문제로 이어집니다.
개인적으로 가장 좋은 해결책은 강제 스왑에서 OOM 킬러를 호출하는 일종의 커널 옵션이라고 생각합니다. 기본적으로 선제 적 스왑이 작동하도록하지만 RAM이 부족하여 커널이 스왑으로 이동해야하는 경우 OOM 킬러를 호출하십시오.
불행히도 이것은 나의 개인적인 소망일뿐입니다. 이 작업을 수행하지 않습니다.