RAM이 512MB이고 스왑 공간이 348MB인 Debian VM 시스템에서 편집기에서 1GB 파일을 열었을 때 메모리가 부족해지면 어떻게 됩니까?
시스템 충돌을 일으킬까요? 아니면 그렇지 않다면 Linux는 이를 어떻게 처리할 것인가?
설치는 현명한 조치가 아닙니다.스왑 공간그렇다면 필요한 경우 충분한 스왑 공간이 자동으로 동적으로 생성됩니까?
sudo apt-get install swapspace
답변1
이는 런타임 설정, 특히 메모리 오버커밋( /proc/sys/vm/overcommit_memory
, man 5 proc
자세한 내용은 참조)에 따라 다릅니다.
메모리 오버커밋이 비활성화되면 편집기(및 동시에 시도하는 다른 프로그램)의 메모리 할당 시도가 실패합니다. 그들은 시스템 호출로부터 실패 결과를 얻게 될 것입니다. 이를 처리하는 것은 각 프로그램에 달려 있지만 불행하게도 일반적인 결과는 프로그램이 충돌하는 것입니다. 예를 들어, 편집자는 단순히 파일 열기를 거부할 수 있습니다.
메모리 오버커밋이 활성화되면 메모리를 요청하는 시스템 호출이 성공할 가능성이 높습니다. 이 경우 실제로 메모리에 접근하면 커널은 메모리 부족을 인지하고 메모리를 회수하기 위해 프로세스를 종료한다. 프로세스는 편집자일 수도 있고 아닐 수도 있습니다. 선택은 시스템의 각 프로세스 oom_score
(여러 커널 경험적 방법의 결과) 및 (구성) 에 따라 달라집니다. oom_score_adj
이는 proc(5) 맨페이지에도 있습니다.
답변2
이 경우 Linux에는 큰 문제가 있습니다. 메모리 부족 상황에 가까워지면 전체 시스템이 과도하게 스왑을 시작하면서 완전히 응답하지 않게 되는 것을 알 수 있습니다. 심지어 마우스 커서도 너무 "느려져" 터미널을 시작할 수 없고 문제가 되는 메모리를 잡아먹는 프로세스를 수동으로 종료할 수 없습니다. 이는 과도한 디스크 작업으로 인해 발생합니다.
이를 방지하기 위해 저는 일반적으로 스왑을 완전히 비활성화하여 Linux 커널이 항상 응답하고 최악의 경우 메모리 부족(OOM) 킬러가 일부 프로세스를 종료합니다. OOM에 의해 프로세스가 종료되는 논리는 커널 버전에 따라 다릅니다.
따라서 대답은 '아니오'입니다. 동적 스왑 할당을 활성화하지 마십시오. 기계가 정지될 것입니다.
루프에서 일부 메모리를 계속 할당하는 프로그램을 사용하여 시도해 보는 것은 쉽습니다. 이 프로그램을 텍스트 파일에 저장하십시오 memeater.c
.
#include <stdlib.h>
int main() {
for (;;) {char* mem=malloc(4096); mem[0]=1;};
}
그런 다음 컴파일하십시오.
$ gcc memeater.c -o memeater
그리고 다음을 실행하세요:
$ ./memeater
스왑을 사용하지 말고 동적 스왑 할당을 사용해 보십시오.
또한 대부분의 경우 이 OOM 상황은 소프트웨어의 버그(메모리 누수)로 인해 발생하거나 "이 10GB 파일을 편집기에서 로드" 또는 "병렬 실행으로 크기를 조정하기 위해 너무 많은 그래픽 파일을 실행"과 같은 잘못된 작업을 수행했기 때문에 발생한다는 점을 명심하세요. "하고 다음 결론을 수행합니다. 스왑이 필요합니까?