Skip to content

পোস্ট

.Net Core-এ গার্বেজ কালেকশনের ধরনসমূহ

২ সেপ্টেম্বর, ২০১৯ • 4 মিনিট পড়া

.Net Core-এ গার্বেজ কালেকশনের ধরনসমূহ

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

ক্যালিফোর্নিয়ায়, স্থানীয় শিক্ষা সংস্থাগুলির (LEA) জন্য ব্যাপক আর্থিক প্রতিবেদনের প্রয়োজনীয়তা রয়েছে, একটি LEA হতে পারে একটি কাউন্টি, একটি জেলা, একটি চার্টার বা একটি একক স্কুল। বেশিরভাগ LEA তাদের নিজস্ব আর্থিক প্রতিবেদন তৈরি করে যা সাধারণত Excel-কে কেন্দ্র করে থাকে, প্রতিটি প্রতিবেদন আলাদা হলে তা আশ্চর্যের কিছু নয়। এই সমস্যা সমাধানের জন্য ক্যালিফোর্নিয়া শিক্ষা বোর্ড আর্থিক প্রতিবেদন তৈরির জন্য সফটওয়্যার কমিশন করেছে।

আমি ডেভেলপমেন্ট টিমের একজন সদস্য ছিলাম।

আমার প্রথম গন্তব্য ছিল টেস্টিং লগ, Ed-Pro-এর লগ উচ্চ মেমরি ব্যবহারের দিকে ইঙ্গিত করেছিল, সম্ভবত একটি মেমরি লিক ছিল? একজন ইঞ্জিনিয়ার লক্ষ্য করেছিলেন যে Ed-Pro-এর গণনা প্রচুর পরিমাণে স্বল্পকালীন মেমরি ব্যবহার করে। যদি মেমরি দ্রুত পরিষ্কার না হয়, তাহলে এটি মেমরি লিকের মতো দেখাতে পারে।

Ed-Pro .Net Core-এর উপর নির্মিত, মাইক্রোসফটের মাল্টি-প্ল্যাটফর্ম ফ্রেমওয়ার্ক। .Net Core-এ, মেমরি তিনটি ট্যাগে বিভক্ত: স্বল্পকালীন (Gen0), মধ্যম কালীন (Gen1), এবং দীর্ঘকালীন (Gen2)। Gen0 স্বল্পকালীন ডেটার জন্য যা দ্রুত স্কোপের বাইরে চলে যায়, Gen1 মধ্যম কালীন মেমরির জন্য যা একটু বেশি সময় ধরে থাকে, এটিও শেষ পর্যন্ত স্কোপের বাইরে চলে যায় এবং Gen2 দীর্ঘকালীন মেমরির জন্য যা অ্যাপ্লিকেশনের জীবনকাল পর্যন্ত বেঁচে থাকতে পারে। Gen0 মেমরি ক্রমাগত পুনরুদ্ধার করা হয়, Gen1 Gen0-এর চেয়ে কম ঘন ঘন পুনরুদ্ধার করা হয়, এবং Gen2 Gen1-এর চেয়েও কম ঘন ঘন পুনরুদ্ধার করা হয়।

Ed-Pro-এর মেমরি ব্যবহার বোঝার একমাত্র নিশ্চিত উপায় ছিল এটি প্রোফাইল করা, নিচে JetBrains-এর dotMemory ব্যবহার করে একটি স্ক্রিনশট রয়েছে।

যেমনটি সন্দেহ করা হয়েছিল, আমরা প্রচুর পরিমাণে Gen0 মেমরি (নীল রঙের) পেয়েছি, এত বেশি যে মনে হচ্ছিল গার্বেজ কালেকশন তাল মিলিয়ে রাখতে পারছে না। প্রচুর পরিমাণে মেমরির জন্য ক্ষতিপূরণের একটি কৌশল, গার্বেজ কালেকশনকে মেমরি স্পেস বৃদ্ধি (অ্যাপ্লিকেশনের ব্যবহারের জন্য আরও মেমরি যোগ করা) এবং এটি পরিষ্কার করার মধ্যে দোলায়মান করেছে। পরিষ্কার করার চক্রের সময়, অ্যাপ্লিকেশন অপ্রতিক্রিয়াশীল থাকে।

প্রথমে, আমরা হতবাক হয়েছিলাম, GC-এর উদ্দেশ্য কি মেমরি পরিচ্ছন্ন রাখা নয়? দুটি নিবন্ধ .Net-এ গার্বেজ কালেকশন কীভাবে কাজ করে তা আমাদের বোঝার ক্ষেত্রে গুরুত্বপূর্ণ ছিল: Mark Vincze’s নিবন্ধ Troubleshooting high memory usage with ASP.Net Core on Kubernetes এবং Microsoft এর Fundamentals of Garbage Collection। উভয়ই দুর্দান্ত পড়া এবং Ed-Pro-এর মেমরি ব্যবহারে স্পষ্টতা এনেছে।

আমরা যা শিখেছি তার একটি সারসংক্ষেপ এখানে, .Net-এ দুই ধরনের গার্বেজ কালেকশন রয়েছে: সার্ভার গার্বেজ কালেকশন এবং ওয়ার্কস্টেশন গার্বেজ কালেকশন।

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

সার্ভার গার্বেজ কালেকশন মেমরি তৈরি হতে দেয়, কোনো এক সময়ে, এটি দুটি জিনিসের মধ্যে একটি করে: এটি হয় মেমরি স্পেস বৃদ্ধি করে মেমরি বৃদ্ধি করতে দেয় অথবা এটি অনাথ মেমরি মুক্ত করে। যখন এটি মেমরি মুক্ত করতে বেছে নেয়, গার্বেজ কালেকশন একটি উচ্চ অগ্রাধিকার থ্রেডে প্রক্রিয়া শুরু করে। উচ্চ অগ্রাধিকার থ্রেড অ্যাপ্লিকেশনের চেয়ে উচ্চ অগ্রাধিকার; যদি মেশিন দ্রুত হয়, পরিষ্কার করা লক্ষ্য করা উচিত নয়। তবে, যদি তা না হয়, তাহলে এটি পরিষ্কার সম্পূর্ণ না হওয়া পর্যন্ত অ্যাপ্লিকেশন বন্ধ করে দেবে।

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

ডিফল্ট হিসাবে, যদি .Net Core একটি সার্ভার সনাক্ত করে, এটি সার্ভার গার্বেজ কালেকশন টাইপ চালায়, যা আমাদের অ্যাপ্লিকেশনের ক্ষেত্রে ছিল। ওয়ার্কস্টেশন গার্বেজ কালেকশন টাইপ চালানোর জন্য আপনার প্রজেক্ট ফাইলে নিম্নলিখিত স্নিপেট যোগ করুন:

  <PropertyGroup> 
    <ServerGarbageCollection>false</ServerGarbageCollection>
  </PropertyGroup>

আমরা Ed-Pro-তে এই কনফিগারেশন পরিবর্তন করেছি, dotMemory ব্যবহার করে, আমরা ওয়ার্কস্টেশন গার্বেজ কালেকশন সক্ষম করে Ed-Pro-এর মেমরি প্রোফাইল করেছি এবং পূর্ববর্তী পরীক্ষার মতো একই স্ক্রিন লোড করেছি। এখানে ফলাফল রয়েছে:

মেমরি ব্যবহার উল্লেখযোগ্যভাবে হ্রাস পেয়েছে। Gen0 বরাদ্দ কার্যত অস্তিত্বহীন। গ্রাফের পার্থক্যের বাইরে, সার্ভার গার্বেজ কালেকশন মেমরি ব্যবহার ১ গিগ ছাড়িয়ে গেছে যখন ওয়ার্কস্টেশন গার্বেজ কালেকশন প্রায় ২০০ মেগে শীর্ষে পৌঁছেছে।

প্রতিটি অ্যাপ্লিকেশন আলাদা। আমাদের অ্যাপ্লিকেশন প্রচুর অস্থায়ী ডেটা ব্যবহার করে এবং এইভাবে প্রচুর Gen0 মেমরি ব্যবহার করে। আপনার অ্যাপ্লিকেশন দীর্ঘ জীবিত মেমরি যেমন Gen1 বা Gen2 ব্যবহার করতে পারে যেখানে সার্ভার গার্বেজ কালেকশন অনেক বেশি অর্থবহ। আমার পরামর্শ হল মেমরি কীভাবে ব্যবহৃত হয় তার একটি ধারণার জন্য বিভিন্ন অবস্থার অধীনে আপনার মেমরি প্রোফাইল করুন এবং তারপর আপনার অ্যাপ্লিকেশনের জন্য কোন মোড সবচেয়ে ভাল তা সিদ্ধান্ত নিন।

লেখক: চাক কনওয়ে সফটওয়্যার ইঞ্জিনিয়ারিং এবং জেনারেটিভ এআই-তে বিশেষজ্ঞ। তার সাথে সোশ্যাল মিডিয়ায় যোগাযোগ করুন: X (@chuckconway) অথবা তাকে YouTube-এ দেখুন।

↑ উপরে ফিরে যান

আপনি এগুলোও পছন্দ করতে পারেন