কম্পিউটার টিউটোরিয়াল

রুবি মেমরি ব্লোট দূর করুন: অপ্টিমাল পারফরম্যান্সের প্রুভেন স্ট্র্যাটেজি

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

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

চলুন ডুব মেরি!

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

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

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

মেমরি ব্লোট ডায়াগনোজ ও ফিক্স করার আগে, রুবির মেমরি আর্কিটেকচারের একটি দ্রুত ওয়াকথ্রু নেই।

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

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

এছাড়া, গার্বেজ কালেকশন প্রসেসও একটি ভায়ব রোল পালন করে রুবি মেমরি কীভাবে ম্যানেজ ও রি-ইউজ হচ্ছে সেটি নির্ধারণে।

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

রুবি ল্যাঙ্গুয়েজ অবজেক্টগুলোকে হিপ পেজ নামক সেগমেন্টে অর্গানাইজ করে। সমগ্র হিপ স্পেস (উপলব্ধ মেমরি) ব্যবহৃত এবং খালি সেকশনে ভাগ করা থাকে। এই হিপ পেজগুলো আবার সমান আকারের স্লটসে ভাগ হয়, যেগুলো প্রতিটি একটি ইউনিট-সাইজড অবজেক্টের অনুমতি দেয়।

নতুন অবজেক্টের জন্য মেমরি অ্যালোকেট করার সময়, রুবি প্রথমে ব্যবহৃত হিপ স্পেসে ফ্রি স্লট খুঁজে বের করে। যদি কোনো না পায়, তবে খালি সেকশন থেকে একটি নতুন হিপ পেজ অ্যালোকেট করে।

মেমরি স্লটস ছোট মেমরি লোকেশন, প্রায় ৪০ বাইট আকারের। এই স্লটগুলো থেকে বাইরে পড়া ডেটা হিপ পেজের বাইরে একটি ভিন্ন এলিয়ায়ে স্টোর হয় এবং প্রতিটি স্লট এক্সটার্নাল ইনফরমেশনের একটি পয়েন্টার স্টোর করে।

এক সিস্টেমের মেমরি অ্যালোকেটর রুবি রানটাইম এনভায়রনমেন্টে সকল অ্যালোকেশন করে, হিপ পেজ এবং এক্সটার্নাল ডেটা পয়েন্টার সহ।

রুবিতে অপারেটিং সিস্টেম মেমরি অ্যালোকেশন

রুবি ল্যাঙ্গুয়েজ দ্বারা করা মেমরি অ্যালোকেশন কল হোস্ট অপারেটিং সিস্টেমের মেমরি অ্যালোকেটর দ্বারা হ্যান্ডেল ও রেসপন্ড করা হয়।

সাধারণত, মেমরি অ্যালোকেটর একটি গ্রুপ C ফাংশন থেকে গঠিত, নামত: malloc, calloc, realloc, এবং free। চলে ত্বরিত দেখি প্রতিটি:

  • Malloc: মেমরি অ্যালোকেশনের সংক্ষিপ্ত, এবং এটি অবজেক্টের জন্য ফ্রি মেমরি অ্যালোকেট করতে ব্যবহার হয়। এটি অ্যালোকেট করার মেমরির সাইজ ইনপুট নেয় এবং অ্যালোকেটেড মেমরি ব্লকের শুরুয় একটি পয়েন্টার রিটার্ন করে।
  • Calloc: কন্টিগুয়াস অ্যালোকেশনের সংক্ষিপ্ত, এবং এটি রুবি ল্যাঙ্গুয়েজকে কনসিকিউটিভ মেমরি ব্লক অ্যালোকেট করতে দেয়। এটি উপকারী যখন পরিচিত লেন্থের অবজেক্ট অ্যারে অ্যালোকেট করা হয়।
  • Realloc: রি-অ্যালোকেশনের সংক্ষিপ্ত, এবং এটি ল্যাঙ্গুয়েজকে নতুন সাইজের সাথে মেমরি রি-অ্যালোকেট করতে দেয়।
  • Free: প্রি-অ্যালোকেটেড মেমরি লোকেশন সেট ক্লিয়ার করতে ব্যবহার হয়। এটি অ্যালোকেটেড মেমরি ব্লকের শুরুর ইনডেক্সের একটি পয়েন্টার ইনপুট নেয় যা ফ্রি করতে হবে।

রুবিতে গার্বেজ কালেকশন

এক ল্যাঙ্গুয়েজ রানটাইমের গার্বেজ কালেকশন প্রসেস 劇енно প্রভাবিত করে কত ভালোভাবে এটি উপলব্ধ মেমরি ইউটিলাইজ করে।

রুবির পрисিডা অ্যাডভান্সড গার্বেজ কালেকশন আছে যা উপরের বর্ণিত সব API মেথড ব্যবহার করে অ্যাপ্লিকেশন মেমরি কনসাম্পশন সব সময় অপ্টিমাইজ করতে।

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

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

এই সেকশনে আমরা রুবিতে মেমরি ব্লোটের দুটি সবচেয়ে বড় কারণ আলোচনা করব: ফ্র্যাগমেন্টেশন এবং স্লো রিলিজ।

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

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

ফ্র্যাগমেন্টেশন দুটি ভিন্ন লেভেলে হতে পারে: ল্যাঙ্গুয়েজ লেভেল এবং মেমরি অ্যালোকেটর লেভেল। চলে উভয়টাই ডিটেইলসে দেখি।

রুবি লেভেলে ফ্র্যাগমেন্টেশন

ল্যাঙ্গুয়েজ লেভেলে ফ্র্যাগমেন্টেশন গার্বেজ কালেকশন প্রসেসের ডিজাইনের কারণে হয়। গার্বেজ কালেকশন প্রসেস একটি রুবি হিপ পেজ স্লটকে ফ্রি হিসেবে মার্ক করে, যাতে সেই স্লট রি-ইউজ করা যায় অন্য একটি অবজেক্ট মেমরিতে অ্যালোকেট করতে। যদি একটি সম্পূর্ণ রুবি হিপ পেজ শুধু ফ্রি স্লট থেকে গঠিত হয়, তবে সেই হিপ পেজ মেমরি অ্যালোকেটরকে রি-ইউজের জন্য ফেরত দেয়া যায়।

কিন্তু কী হবে যদি একটি হিপ পেজে 아주 কম সংখ্যক স্লট ফ্রি নাмар্কড থাকে? সেটি মেমরি অ্যালোকেটরে ফেরত দেওয়া হবে না। এখন, গার্বেজ কালেকশন দ্বারা বিভিন্ন হিপ পেজে একসাথে অনেক স্লট অ্যালোকেট ও ফ্রি হওয়া চিন্তা করুন। সম্পূর্ণ হিপ পেজ একসাথে রিলিজ হওয়া অনলাইকেলি। এমনকি গার্বেজ কালেকশন মেমরি ফ্রি করলেও, এটি মেমরি অ্যালোকেটরে রি-ইউজ করা যায় না কারণ মেমরি ব্লক আংশিকভাবে অকুপাইড থাকে।

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

মেমরি অ্যালোকেটর নিজেও একই সমস্যা মোকাবিলা করে: এটাকে OS হিপ রিলিজ করতে হয় যখন সেগুলো সম্পূর্ণ ফ্রি হয়। কিন্তু গার্বেজ কালেকশন প্রসেসের র‍্যান্ডম নेचার বিবেচনা করলে সম্পূর্ণ OS হিপ একসাথে ফ্রি হওয়া অনলাইকেলি।

মেমরি অ্যালোকেটর OS হিপও প্রোভিশন করে সিস্টেম মেমরি থেকে অ্যাপ্লিকেশনের ব্যবহার জন্য। এটি সিম্পলি নতুন OS হিপ প্রোভিশন করতে থাকবে, এমনকি যদি বিদ্যমান হিপগুলোর কাছে অ্যাপ্লিকেশনের মেমরি রিকোয়ারমেন্ট স্যাটিসফাই করার পর্যাপ্ত ফ্রি মেমরি থাকে। এটি অ্যাপ্লিকেশনের মেমরি মেট্রিক্সে স্পাইকের পერძেক্ট রেসিপি।

স্লো রিলিজ

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

মেমরি অ্যালোকেটর সোর্স araştান করলে দেখা যায়, অ্যালোকেটারটি OS পেজকে শুধু OS হিপের শেষে রিলিজ করার জন্য ডিজাইন করা, এবং সেটিও খুব কদাচিৎ। এটি পারফরম্যান্স কারণ হতে পারে, কিন্তু এটি ব্যাকফায়ার করে এবং কাউন্টার-প্রোডাক্টিভ হতে পারে।

রুবি মেমরি ব্লোট ফিক্স করা

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

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

ফ্র্যাগমেন্টেশন গার্বেজ কালেকশনের ডিজাইন কারণে হয়, এবং এটিকে ফিক্স করতে আপনি অনেক কিছু করতে পারবেন না। যাইহোক, কিছু स्टেপ ফলো করে ফ্র্যাগমেন্টেড মেমরি ডিস্কে শেষ হওয়ার চান্স কমাতে পারেন:

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

ট্রিমিং দিয়ে রুবি মেমরি ব্লোট ফিক্স

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

রুবি ২.৬-এর মডিফাইড কোড যেটি 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);

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

র‍্যাপ-আপ এবং পরবর্তী পদক্ষেপ

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

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

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

আশা করি আমি আপনাকে আপনার রুবি অ্যাপ্লিকেশনে মেমরি ব্লোট ফিক্স করার দিকে কিছু পদক্ষেপ নেওয়ায় সাহায্য করেছি।

P.S. Ruby Magic পোস্টগুলো প্রেস থেকে বের होतेই পেতে চাইলে, আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন এবং কোনো পোস্ট মিস করবেন না!

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

  1. রুবিতে এনভায়রনমেন্ট ভেরিয়েবল মাস্টার করুন: একটি প্র্যাকটিক্যাল গাইড

  2. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  3. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস

  4. উইন্ডোজ ১০-এ Chrome মেমরি ব্যবহার কমানো: দ্রুত ও কার্যকর টিপস