Я хочу создать программу, которая будет имитировать ситуацию с нехваткой памяти (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
, которая теперь составляет ровно 50 килобайт ОЗУ. Он выделяет память на 1 Мб и печатает точно ту точку, в которой он не может выделить больше, так что я знаю, какое максимальное значение ему удалось съесть.
Проблема в том, что она работает. Даже в системе с 1 ГБ физической памяти.
Когда я проверяю верху, я вижу, что процесс ест 50 виртуальных номеров и только 1 Мб резидентной памяти. Есть ли способ создать любителя памяти, который действительно его потребляет?
Характеристики системы: Ядро Linux 3.16 (Debian), скорее всего, с включенным overcommit (не уверен, как его проверить) без обмена и виртуализации.