Unix 서버에서 메모리 부족 (OOM) 상황을 시뮬레이션하는 프로그램을 만들고 싶습니다. 나는이 매우 간단한 메모리 먹는 사람을 만들었습니다 :
#include <stdio.h>
#include <stdlib.h>
unsigned long long memory_to_eat = 1024 * 50000;
size_t eaten_memory = 0;
void *memory = NULL;
int eat_kilobyte()
{
memory = realloc(memory, (eaten_memory * 1024) + 1024);
if (memory == NULL)
{
// realloc failed here - we probably can't allocate more memory for whatever reason
return 1;
}
else
{
eaten_memory++;
return 0;
}
}
int main(int argc, char **argv)
{
printf("I will try to eat %i kb of ram\n", memory_to_eat);
int megabyte = 0;
while (memory_to_eat > 0)
{
memory_to_eat--;
if (eat_kilobyte())
{
printf("Failed to allocate more memory! Stucked at %i kb :(\n", eaten_memory);
return 200;
}
if (megabyte++ >= 1024)
{
printf("Eaten 1 MB of ram\n");
megabyte = 0;
}
}
printf("Successfully eaten requested memory!\n");
free(memory);
return 0;
}
memory_to_eat
정확히 50GB의 RAM 인 정의 된만큼 많은 메모리를 사용 합니다. 메모리를 1MB 씩 할당하고 더 많은 할당에 실패한 지점을 정확하게 인쇄하여 어느 최대 값을 먹을 수 있는지 알 수 있습니다.
문제는 작동한다는 것입니다. 실제 메모리가 1GB 인 시스템에서도 가능합니다.
맨 위로 확인하면 프로세스가 50GB의 가상 메모리와 1MB 미만의 상주 메모리 만 사용한다는 것을 알 수 있습니다. 실제로 그것을 소비하는 메모리 이터를 만드는 방법이 있습니까?
시스템 사양 : Linux 커밋 3.16 ( Debian )은 스왑 및 가상화없이 오버 커밋이 활성화 된 (확실한 체크 아웃 방법) 가능성이 높습니다.
sysctl -w vm.overcommit_memory=2
루트 권한 으로 수행하면 예상대로 작동 합니다. mjmwired.net/kernel/Documentation/vm/overcommit-accounting을 참조하십시오 . 이것은 다른 결과를 초래할 수 있습니다. 특히 매우 큰 프로그램 (예 : 웹 브라우저)이 도우미 프로그램 (예 : PDF 리더)을 생성하지 못할 수 있습니다.