আমি এমন একটি প্রোগ্রাম তৈরি করতে চাই যা ইউনিক্স সার্ভারে একটি মেমরির (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
যা এখন ঠিক 50 গিগাবাইট র্যাম। এটি 1 এমবি দ্বারা মেমরি বরাদ্দ করে এবং ঠিক আরও বেশি বরাদ্দ করতে ব্যর্থ হয় ঠিক এমন পয়েন্টটি মুদ্রণ করে, যাতে আমি জানি যে এটি কোন সর্বোচ্চ মান খেতে পরিচালিত হয়েছিল।
সমস্যাটি হ'ল এটি কাজ করে। এমনকি 1 জিবি শারীরিক মেমরি সহ এমন একটি সিস্টেমে।
আমি যখন শীর্ষে যাব তখন আমি দেখতে পাচ্ছি যে প্রক্রিয়াটি 50 গিগাবাইট ভার্চুয়াল মেমরি খায় এবং আবাসিক মেমরির 1 এমবি এরও কম। মেমরি ইটার তৈরির কোনও উপায় আছে যা সত্যই এটি গ্রাস করে?
সিস্টেমের বৈশিষ্ট্য: লিনাক্স কার্নেল ৩.১16 ( দেবিয়ান ) সম্ভবত অদলবদল এবং ভার্চুয়ালাইজড ওভারকমিট সক্ষম (এটি কীভাবে পরীক্ষা করবেন তা নিশ্চিত নয়) with
sysctl -w vm.overcommit_memory=2
মূল হিসাবে কাজ করেন; দেখতে mjmwired.net/kernel/Documentation/vm/overcommit-accounting । দ্রষ্টব্য যে এটির অন্যান্য পরিণতিও হতে পারে; বিশেষত, খুব বড় প্রোগ্রাম (যেমন আপনার ওয়েব ব্রাউজার) সাহায্যকারী প্রোগ্রাম (যেমন পিডিএফ রিডার) স্প্যান করতে ব্যর্থ হতে পারে।