ฉันต้องการสร้างโปรแกรมที่จะจำลองสถานการณ์ out-of-memory (OOM) บนเซิร์ฟเวอร์ Unix ฉันสร้างหน่วยความจำที่กินง่ายสุด ๆ นี้:
#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
ซึ่งตอนนี้เป็น RAM 50 GB มันจัดสรรหน่วยความจำ 1 MB และพิมพ์จุดที่มันไม่สามารถจัดสรรได้มากขึ้นดังนั้นฉันจึงรู้ว่ามันคุ้มค่าที่จะกินมากที่สุด
ปัญหาคือมันใช้งานได้ แม้แต่ในระบบที่มีหน่วยความจำกายภาพ 1 GB
เมื่อฉันตรวจสอบด้านบนฉันเห็นว่ากระบวนการกินหน่วยความจำเสมือน 50 GB และมีหน่วยความจำภายในน้อยกว่า 1 MB มีวิธีการสร้างหน่วยความจำที่กินมันจริง ๆ หรือไม่?
รายละเอียดของระบบ: Linux kernel 3.16 ( Debian ) เป็นไปได้มากที่สุดเมื่อเปิดใช้งาน overcommit (ไม่แน่ใจว่าจะตรวจสอบได้อย่างไร) โดยไม่มีการสลับและการจำลองเสมือน
sysctl -w vm.overcommit_memory=2
เป็นเหมือนราก ดูmjmwired.net/kernel/Documentation/vm/overcommit-accounting โปรดทราบว่านี่อาจมีผลกระทบอื่น ๆ โดยเฉพาะอย่างยิ่งโปรแกรมที่มีขนาดใหญ่มาก (เช่นเว็บเบราว์เซอร์ของคุณ) อาจล้มเหลวในการวางไข่โปรแกรมช่วยเหลือ (เช่นโปรแกรมอ่าน PDF)