কম্পিউটার

রুবিতে মেমরি ব্লোট কীভাবে হ্রাস করবেন

রুবি অ্যাপ্লিকেশনগুলিতে মেমরি ব্লোটের সমস্যাটি ঘন ঘন আলোচনার একটি বিষয়। এই পোস্টে, আমরা দেখব কিভাবে রুবি মেমরি ম্যানেজমেন্ট ভুল হতে পারে, এবং আপনি আপনার রুবি অ্যাপ্লিকেশনটিকে উড়িয়ে দেওয়া থেকে রক্ষা করতে কী করতে পারেন৷

প্রথমে, আমাদের বুঝতে হবে একটি অ্যাপ্লিকেশনের মেমরির প্রেক্ষাপটে ব্লোট বলতে কী বোঝায়।

আসুন ডুব দেওয়া যাক!

রুবিতে মেমরি ব্লোট কি?

মেমরি ব্লোট হল যখন আপনার অ্যাপ্লিকেশনের মেমরির ব্যবহার আপাত ব্যাখ্যা ছাড়াই হঠাৎ করে বেড়ে যায়। এই বৃদ্ধি দ্রুত হতে পারে বা নাও হতে পারে, তবে বেশিরভাগ ক্ষেত্রে এটি ক্রমাগত হয়ে যায়। এটি একটি মেমরি লিক থেকে ভিন্ন, যা কিছু সময়ের মধ্যে একাধিক মৃত্যুদন্ডের ফলে ঘটে।

মেমরি ব্লোট উৎপাদনে আপনার রুবি অ্যাপ্লিকেশনে ঘটতে সবচেয়ে খারাপ জিনিসগুলির মধ্যে একটি হতে পারে। যাইহোক, আপনি যদি সঠিক ব্যবস্থা গ্রহণ করেন তবে এটি এড়ানো যায়। উদাহরণস্বরূপ, আপনি যদি আপনার অ্যাপ্লিকেশনের মেমরি ব্যবহারে একটি স্পাইক লক্ষ্য করেন, তাহলে অন্যান্য সমস্যার সমাধান করার আগে মেমরি ব্লোটের লক্ষণগুলি পরীক্ষা করা ভাল৷

কীভাবে মেমরি ব্লোট নির্ণয় এবং ঠিক করা যায় তা অন্বেষণ করার আগে, আসুন রুবির মেমরি আর্কিটেকচারের একটি দ্রুত ওয়াকথ্রু নেওয়া যাক।

রুবির মেমরি স্ট্রাকচার

রুবির মেমরি ব্যবহার নির্দিষ্ট উপাদানগুলির চারপাশে ঘোরে যা উপলব্ধ সিস্টেম সংস্থানগুলির ন্যায়সঙ্গত ব্যবহার পরিচালনা করে। এই উপাদানগুলির মধ্যে রয়েছে রুবি ভাষা, হোস্ট অপারেটিং সিস্টেম এবং সিস্টেম কার্নেল৷

এগুলি ছাড়াও, রুবি মেমরি কীভাবে পরিচালনা এবং পুনরায় ব্যবহার করা হয় তা নির্ধারণে আবর্জনা সংগ্রহ প্রক্রিয়াও গুরুত্বপূর্ণ ভূমিকা পালন করে৷

রুবি হিপ পেজ এবং মেমরি স্লট

রুবি ভাষা বস্তুকে হিপ পেজ নামক সেগমেন্টে সংগঠিত করে। সম্পূর্ণ হিপ স্পেস (উপলব্ধ মেমরি) ব্যবহৃত এবং খালি বিভাগে বিভক্ত। এই স্তূপ পৃষ্ঠাগুলিকে আরও সমান-আকারের স্লটে বিভক্ত করা হয়েছে, যা প্রতিটি একক-আকারের বস্তুকে অনুমতি দেয়।

একটি নতুন বস্তুর জন্য মেমরি বরাদ্দ করার সময়, রুবি প্রথমে বিনামূল্যে স্লটের জন্য ব্যবহৃত হিপ স্পেসের দিকে তাকায়। যদি কোনটি পাওয়া না যায়, তাহলে এটি খালি বিভাগ থেকে একটি নতুন হিপ পৃষ্ঠা বরাদ্দ করে৷

মেমরি স্লট ছোট মেমরি অবস্থান, প্রতিটি প্রায় 40 বাইট আকার. এই স্লটগুলির বাইরে যে ডেটা ওভারফ্লো হয় তা হিপ পৃষ্ঠার বাইরে একটি ভিন্ন এলাকায় সংরক্ষণ করা হয় এবং প্রতিটি স্লট বাহ্যিক তথ্যের জন্য একটি পয়েন্টার সংরক্ষণ করে৷

একটি সিস্টেমের মেমরি বরাদ্দকারী রুবি রানটাইম পরিবেশে সমস্ত বরাদ্দ করে, হিপ পেজ এবং বাহ্যিক ডেটা পয়েন্টার সহ।

রুবিতে অপারেটিং সিস্টেম মেমরি বরাদ্দ

রুবি ভাষার দ্বারা করা মেমরি বরাদ্দ কলগুলি পরিচালনা করা হয় এবং হোস্ট অপারেটিং সিস্টেমের মেমরি বরাদ্দকারী দ্বারা প্রতিক্রিয়া জানানো হয়৷

সাধারণত, মেমরি বরাদ্দকারী C ফাংশনগুলির একটি গ্রুপ নিয়ে গঠিত, যথা malloc , calloc , realloc , এবং ফ্রি . আসুন দ্রুত একে একে দেখে নেওয়া যাক:

  • ম্যালক :Malloc মেমরি বরাদ্দ জন্য দাঁড়িয়েছে, এবং এটি বস্তুর বিনামূল্যে মেমরি বরাদ্দ করতে ব্যবহৃত হয়. এটি বরাদ্দ করা মেমরির আকার নেয় এবং বরাদ্দ করা মেমরি ব্লকের প্রারম্ভিক সূচকে একটি পয়েন্টার ফেরত দেয়৷
  • Calloc :Calloc সংলগ্ন বরাদ্দের জন্য দাঁড়িয়েছে, এবং এটি রুবি ভাষাকে মেমরির পরপর ব্লকগুলি বরাদ্দ করতে দেয়। পরিচিত দৈর্ঘ্যের অবজেক্ট অ্যারে বরাদ্দ করার সময় এটি উপকারী।
  • Realloc :Realloc এর অর্থ হল পুনরায় বরাদ্দ করা, এবং এটি ভাষাকে একটি নতুন আকারের সাথে মেমরি পুনরায় বরাদ্দ করার অনুমতি দেয়৷
  • ফ্রি :ফ্রি ব্যবহার করা হয় মেমরি অবস্থানের প্রাক-বরাদ্দ সেট পরিষ্কার করতে। এটি মেমরি ব্লকের প্রারম্ভিক সূচকে একটি পয়েন্টার নেয় যা মুক্ত করতে হবে।

রুবিতে আবর্জনা সংগ্রহ

একটি ভাষার রানটাইমের আবর্জনা সংগ্রহের প্রক্রিয়া নাটকীয়ভাবে প্রভাবিত করে যে এটি তার উপলব্ধ মেমরিকে কতটা ভালোভাবে ব্যবহার করে।

রুবির কাছে বেশ উন্নত আবর্জনা সংগ্রহ রয়েছে যা সর্বদা অ্যাপ্লিকেশন মেমরি খরচ অপ্টিমাইজ করতে উপরে বর্ণিত সমস্ত API পদ্ধতি ব্যবহার করে৷

রুবিতে আবর্জনা সংগ্রহের প্রক্রিয়া সম্পর্কে একটি আকর্ষণীয় তথ্য হল যে এটি সম্পূর্ণ অ্যাপ্লিকেশনটি বন্ধ করে দেয়! এটি নিশ্চিত করে যে আবর্জনা সংগ্রহের সময় কোনও নতুন বস্তু বরাদ্দ না হয়। এই কারণে, আপনার আবর্জনা সংগ্রহের রুটিন বিরল এবং যত তাড়াতাড়ি সম্ভব হওয়া উচিত।

রুবিতে মেমরি ফোলার দুটি সাধারণ কারণ

এই বিভাগে রুবিতে মেমরি ব্লোট হওয়ার দুটি সবচেয়ে উল্লেখযোগ্য কারণ নিয়ে আলোচনা করা হবে:ফ্র্যাগমেন্টেশন এবং ধীর রিলিজ।

মেমরি ফ্র্যাগমেন্টেশন

মেমরি ফ্র্যাগমেন্টেশন হল যখন মেমরিতে বস্তুর বরাদ্দ সব জায়গায় ছড়িয়ে ছিটিয়ে থাকে, ফ্রি মেমরির সংলগ্ন অংশের সংখ্যা হ্রাস করে। সংলগ্ন ব্লক ছাড়া বস্তুতে মেমরি বরাদ্দ করা যাবে না, এমনকি যদি ডিস্কে পর্যাপ্ত পরিমাণের বেশি ফ্রি মেমরি পাওয়া যায়। এই সমস্যাটি যেকোন প্রোগ্রামিং ভাষা বা পরিবেশে ঘটতে পারে এবং প্রতিটি ভাষার সমস্যা সমাধানের জন্য নিজস্ব পদ্ধতি রয়েছে৷

ফ্র্যাগমেন্টেশন দুটি ভিন্ন স্তরে ঘটতে পারে:ভাষার স্তর এবং মেমরি বরাদ্দকারীর স্তর। আসুন এই দুটিরই বিস্তারিতভাবে দেখে নেওয়া যাক।

রুবি স্তরে ফ্র্যাগমেন্টেশন

আবর্জনা সংগ্রহ প্রক্রিয়ার নকশার কারণে ভাষা স্তরে খণ্ডিতকরণ ঘটে। আবর্জনা সংগ্রহের প্রক্রিয়াটি একটি রুবি হিপ পৃষ্ঠা স্লটকে বিনামূল্যে হিসাবে চিহ্নিত করে, সেই স্লটের পুনঃব্যবহারের অনুমতি দেয় মেমরিতে অন্য বস্তু বরাদ্দ করতে। যদি একটি সম্পূর্ণ রুবি হিপ পৃষ্ঠায় শুধুমাত্র বিনামূল্যের স্লট থাকে, তাহলে সেই হিপ পৃষ্ঠাটি পুনঃব্যবহারের জন্য মেমরি বরাদ্দকারীর কাছে ছেড়ে দেওয়া যেতে পারে।

কিন্তু যদি একটি স্তূপে অল্প সংখ্যক স্লট বিনামূল্যে চিহ্নিত না করা হয়? এটি মেমরি বরাদ্দকারীতে ফিরে আসবে না। এখন, আবর্জনা সংগ্রহের মাধ্যমে একই সাথে বরাদ্দ করা এবং মুক্ত করা বিভিন্ন স্তূপ পৃষ্ঠার অনেক স্লট সম্পর্কে চিন্তা করুন। সম্পূর্ণ হিপ পৃষ্ঠাগুলি একবারে প্রকাশ করা অসম্ভব। যদিও আবর্জনা সংগ্রহের প্রক্রিয়াটি মেমরিকে মুক্ত করে, মেমরি অ্যালোকেটর দ্বারা এটি পুনরায় ব্যবহার করা যাবে না যেহেতু মেমরি ব্লকগুলি আংশিকভাবে এটি দখল করে৷

মেমরি অ্যালোকেটর স্তরে ফ্র্যাগমেন্টেশন

মেমরি বরাদ্দকারী নিজেই একটি অনুরূপ সমস্যার সম্মুখীন হয়:এটি সম্পূর্ণরূপে বিনামূল্যে হয়ে গেলে OS হিপগুলি ছেড়ে দিতে হবে। কিন্তু আবর্জনা সংগ্রহের প্রক্রিয়ার এলোমেলো প্রকৃতি বিবেচনা করে একবারে একটি সম্পূর্ণ OS গাদা মুক্ত করা সম্ভব নয়।

মেমরি বরাদ্দকারী একটি অ্যাপ্লিকেশনের ব্যবহারের জন্য সিস্টেম মেমরি থেকে OS হিপসের ব্যবস্থা করে। এটি কেবলমাত্র নতুন OS হিপগুলির প্রভিশনে চলে যাবে, এমনকি যদি বিদ্যমান হিপগুলিতে অ্যাপ্লিকেশনের মেমরির প্রয়োজনীয়তাগুলি পূরণ করার জন্য পর্যাপ্ত ফ্রি মেমরি থাকে। এটি একটি অ্যাপ্লিকেশনের মেমরি মেট্রিক্স একটি স্পাইক জন্য নিখুঁত রেসিপি.

ধীরে রিলিজ

রুবিতে মেমরি ব্লোটের আরেকটি গুরুত্বপূর্ণ কারণ হল সিস্টেমে মুক্ত মেমরির ধীরে ধীরে রিলিজ। এই অবস্থায়, বস্তুতে যে হারে নতুন মেমরি ব্লক বরাদ্দ করা হয় তার চেয়ে অনেক বেশি ধীরে ধীরে মেমরি মুক্ত হয়। যদিও এটি সমাধান করার জন্য একটি প্রচলিত বা একটি রকি সমস্যা নয়, এটি মেমরি ব্লোটকে তীব্রভাবে প্রভাবিত করে — এমনকি ফ্র্যাগমেন্টেশনের চেয়েও বেশি!

মেমরি বরাদ্দকারীর উত্স অনুসন্ধান করার পরে, এটি দেখা যাচ্ছে যে বরাদ্দকারীটি OS পৃষ্ঠাগুলিকে OS স্তূপের শেষে প্রকাশ করার জন্য ডিজাইন করা হয়েছে, এবং তারপরেও, শুধুমাত্র মাঝে মাঝে। এটি সম্ভবত পারফরম্যান্সের কারণে, তবে এটি বিপরীতমুখী হতে পারে এবং প্রতি-উৎপাদনশীল হতে পারে৷

রুবি মেমরি ব্লোট কিভাবে ঠিক করবেন

এখন যেহেতু আমরা জানি রুবির মেমরি ফুলে যাওয়ার কারণ কী, চলুন দেখে নেওয়া যাক কীভাবে আপনি এই সমস্যাগুলি সমাধান করতে পারেন এবং ডিফ্র্যাগমেন্টেশন এবং ট্রিমিংয়ের মাধ্যমে আপনার অ্যাপের কর্মক্ষমতা উন্নত করতে পারেন৷

ডিফ্র্যাগমেন্টেশন সহ রুবি মেমরি ব্লোট ঠিক করুন

আবর্জনা সংগ্রহের নকশার কারণে ফ্র্যাগমেন্টেশন ঘটে এবং এটি ঠিক করার জন্য আপনি অনেক কিছু করতে পারেন না। যাইহোক, কয়েকটি ধাপ রয়েছে যা আপনি একটি খণ্ডিত মেমরি ডিস্কের সাথে শেষ হওয়ার সম্ভাবনা কমাতে অনুসরণ করতে পারেন:

  • যদি আপনি এমন একটি বস্তুর রেফারেন্স ঘোষণা করেন যা যথেষ্ট পরিমাণে মেমরি ব্যবহার করে, তবে নিশ্চিত করুন যে আপনি এটিকে ম্যানুয়ালি মুক্ত করেছেন যখন এটির কাজটি হয়ে গেছে৷
  • একটি বড় ব্লকে আপনার সমস্ত স্ট্যাটিক অবজেক্ট বরাদ্দ ঘোষণা করার চেষ্টা করুন। এটি আপনার সমস্ত স্থায়ী ক্লাস, অবজেক্ট এবং অন্যান্য ডেটা একই হিপ পৃষ্ঠাগুলিতে রাখবে। পরে, আপনি যখন গতিশীল বরাদ্দ নিয়ে খেলবেন, তখন আপনাকে স্ট্যাটিক হিপ পেজ নিয়ে চিন্তা করতে হবে না।
  • যদি সম্ভব হয়, শুরুতে বড় গতিশীল বরাদ্দ করার চেষ্টা করুন আপনার কোডের। এটি তাদের আপনার বড় স্ট্যাটিক অ্যালোকেশন মেমরি ব্লকের কাছাকাছি রাখবে এবং আপনার বাকি মেমরি পরিষ্কার রাখবে৷
  • যদি আপনি একটি ছোট এবং খুব কমই সাফ করা ক্যাশে ব্যবহার করেন, তবে এটিকে শুরুতে স্থায়ী স্ট্যাটিক বরাদ্দ দিয়ে গ্রুপ করা ভাল। এমনকি আপনার অ্যাপের মেমরি ম্যানেজমেন্ট উন্নত করতে আপনি এটিকে সম্পূর্ণ অপসারণ করার কথাও বিবেচনা করতে পারেন।
  • স্ট্যান্ডার্ড glibc মেমরি বরাদ্দকারীর পরিবর্তে jemalloc ব্যবহার করুন। এই ছোট খামচি আপনার রুবি মেমরি খরচ চার গুণ পর্যন্ত কমিয়ে আনতে পারে। এখানে একমাত্র সতর্কতা হল যে এটি সব পরিবেশে সামঞ্জস্যপূর্ণ নাও হতে পারে, তাই প্রোডাকশনে রোল করার আগে আপনার অ্যাপটি ভালোভাবে পরীক্ষা করতে ভুলবেন না।

রুবি মেমরি ব্লোট ঠিক করতে ছাঁটাই

ধীর মেমরি রিলিজ ঠিক করতে আপনাকে আবর্জনা সংগ্রহের প্রক্রিয়াটিকে ওভাররাইড করতে হবে এবং মেমরি রিলিজ করতে হবে। malloc_trim নামে একটি API আছে যা এটি করতে পারে . আবর্জনা সংগ্রহের প্রক্রিয়া চলাকালীন এই ফাংশনটি কল করার জন্য আপনাকে যা করতে হবে তা হল রুবিকে সংশোধন করতে।

এখানে পরিবর্তিত রুবি 2.6 কোড যা কল করে malloc_trim gc.c ফাংশনে gc_start :

gc_prof_timer_start(objspace);
{
    gc_marks(objspace, do_full_mark);
    // BEGIN MODIFICATION
    if (do_full_mark)
    {
        malloc_trim(0);
    }
    // END MODIFICATION
}
gc_prof_timer_stop(objspace);

দ্রষ্টব্য: এটি উত্পাদন অ্যাপ্লিকেশনগুলিতে সুপারিশ করা হয় না কারণ এটি আপনার অ্যাপটিকে অস্থির করে তুলতে পারে৷ যাইহোক, এটি কাজে আসে যখন ধীর মেমরি রিলিজ আপনার পারফরম্যান্সে বড় হিট সৃষ্টি করে এবং আপনি যেকোনো সমাধান চেষ্টা করার জন্য প্রস্তুত।

র্যাপ-আপ এবং পরবর্তী পদক্ষেপগুলি

মেমরি ব্লোট শনাক্ত করা কঠিন এবং ঠিক করা আরও বেশি চ্যালেঞ্জিং।

এই নিবন্ধটি রুবি অ্যাপে মেমরি ব্লোট হওয়ার পিছনে দুটি উল্লেখযোগ্য কারণ দেখেছে — ফ্র্যাগমেন্টেশন এবং স্লো রিলিজ — এবং দুটি ফিক্স:ডিফ্র্যাগমেন্টেশন এবং ট্রিমিং৷

একটি আসন্ন ব্লোট ঘটনা শনাক্ত করতে এবং আপনার অ্যাপটি ডাউন করার আগে এটিকে ঠিক করতে আপনাকে অবশ্যই আপনার অ্যাপের মেট্রিক্সের উপর অবিচল নজর রাখতে হবে।

আমি আশা করি যে আমি আপনাকে আপনার রুবি অ্যাপ্লিকেশনে মেমরি ব্লোট ঠিক করার দিকে কিছু পদক্ষেপ নিতে সাহায্য করেছি৷

পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্টও মিস করবেন না!

আমাদের অতিথি লেখক কুমার হর্ষ একজন নতুন সফটওয়্যার ডেভেলপার। তিনি একজন উত্সাহী লেখক যিনি রুবি এবং জাভাস্ক্রিপ্টের মতো জনপ্রিয় ওয়েব প্রযুক্তিগুলির চারপাশে বিষয়বস্তু একত্রিত করেন৷ আপনি তার ওয়েবসাইটের মাধ্যমে তার সম্পর্কে আরও জানতে পারেন এবং Twitter-এ তাকে অনুসরণ করতে পারেন৷


  1. রুবিতে পরিবেশের ভেরিয়েবলগুলি কীভাবে ব্যবহার করবেন

  2. একটি ম্যাট্রিক্স কি এবং রুবিতে এটি কীভাবে ব্যবহার করবেন?

  3. রুবিতে স্ট্রাকট এবং ওপেনস্ট্রাক্ট কীভাবে ব্যবহার করবেন

  4. কিভাবে Google ক্রোম উইন্ডোজ 10 এ উচ্চ মেমরির ব্যবহার কমাতে হয়