পোস্ট
.Net Core-এ গার্বেজ কালেকশন টাইপ
২ সেপ্টেম্বর, ২০১৯ • 4 মিনিট পড়া
আধুনিক ভাষায় মেমোরি ম্যানেজমেন্ট প্রায়শই একটি পরবর্তী চিন্তা। সব উদ্দেশ্যের জন্য, আমরা মেমোরি সম্পর্কে কোনো চিন্তা ছাড়াই সফটওয়্যার লিখি। এটি আমাদের ভালোভাবে সেবা করে কিন্তু সর্বদা ব্যতিক্রম থাকে…
ক্যালিফোর্নিয়ায়, স্থানীয় শিক্ষা সংস্থাগুলির (LEA) জন্য ব্যাপক আর্থিক প্রতিবেদন প্রয়োজনীয়তা রয়েছে, একটি LEA একটি কাউন্টি, একটি জেলা, একটি চার্টার বা একটি একক স্কুল হতে পারে। বেশিরভাগ LEA তাদের নিজস্ব আর্থিক প্রতিবেদন তৈরি করে যা সাধারণত এক্সেলের চারপাশে কেন্দ্রীভূত থাকে, এটি অবাক করার মতো নয় যখন প্রতিটি প্রতিবেদন আলাদা। এই সমস্যা সমাধানের জন্য ক্যালিফোর্নিয়া শিক্ষা বোর্ড আর্থিক প্রতিবেদন তৈরি করার জন্য সফটওয়্যার নিয়োগ করেছিল।
আমি উন্নয়ন দলের একটি অংশ ছিলাম।
আমার প্রথম স্টপ ছিল পরীক্ষার লগ, 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 এর নিবন্ধ Troubleshooting high memory usage with ASP.Net Core on Kubernetes এবং Fundamentals of Garbage Collection Microsoft দ্বারা। উভয়ই দুর্দান্ত পাঠ এবং Ed-Pro-তে মেমোরি ব্যবহারে স্পষ্টতা এনেছিল।
এখানে আমরা যা শিখেছি তার একটি সারসংক্ষেপ, .Net-এ দুটি ধরনের গার্বেজ কালেকশন রয়েছে: সার্ভার গার্বেজ কালেকশন এবং ওয়ার্কস্টেশন গার্বেজ কালেকশন।
সার্ভার গার্বেজ কালেকশন কয়েকটি অনুমান করে: প্রথমত, প্রচুর মেমোরি উপলব্ধ এবং দ্বিতীয়ত, প্রসেসরগুলি মাল্টি-কোর এবং দ্রুত। উভয়ই সত্য হতে পারে, কিন্তু আমরা ভার্চুয়াল মেশিন এবং ডকারের একটি বিশ্বে বাস করি যেখানে উভয় অনুমানই মিথ্যা হওয়ার সম্ভাবনা বেশি।
সার্ভার গার্বেজ কালেকশন মেমোরি তৈরি করতে দেয়, কোনো এক পর্যায়ে, এটি দুটি জিনিসের একটি করে: এটি হয় মেমোরি স্পেস বৃদ্ধি করে মেমোরি বৃদ্ধি করতে দেয় বা এটি অনাথ মেমোরি মুক্ত করে। যখন এটি মেমোরি মুক্ত করতে বেছে নেয়, গার্বেজ কালেকশন একটি উচ্চ অগ্রাধিকার থ্রেডে প্রক্রিয়া শুরু করে। উচ্চ অগ্রাধিকার থ্রেড অ্যাপ্লিকেশনের চেয়ে উচ্চতর অগ্রাধিকার; যদি মেশিন দ্রুত হয়, পরিষ্কার লক্ষ্য করা উচিত নয়। তবে, যদি এটি না হয়, তবে এটি পরিষ্কার সম্পন্ন না হওয়া পর্যন্ত অ্যাপ্লিকেশনকে থামিয়ে দেবে।
ওয়ার্কস্টেশন গার্বেজ কালেকশন ভিন্নভাবে কাজ করে। এটি ক্রমাগত অ্যাপ্লিকেশনের সমান অগ্রাধিকার সহ একটি থ্রেডে মেমোরি পুনরুদ্ধার করে। এর মানে এটি অ্যাপ্লিকেশনের সাথে সম্পদের জন্য প্রতিযোগিতা করছে যা অ্যাপ্লিকেশন ধীরতা সৃষ্টি করতে পারে। ইতিবাচক দিক হল অ্যাপ্লিকেশনের মেমোরি ব্যবহার বেশ কম থাকতে পারে, প্রাথমিকভাবে যখন এটি প্রচুর পরিমাণে Gen0 ব্যবহার করে।
ডিফল্ট হিসাবে, যদি .Net Core একটি সার্ভার সনাক্ত করে, এটি সার্ভার গার্বেজ কালেকশন টাইপ চালায়, যা আমাদের অ্যাপ্লিকেশনের ক্ষেত্রে ছিল। ওয়ার্কস্টেশন গার্বেজ কালেকশন টাইপ চালাতে আপনার প্রকল্প ফাইলে নিম্নলিখিত স্নিপেট যোগ করুন:
<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
আমরা Ed-Pro-তে এই কনফিগারেশন পরিবর্তন করেছি, dotMemory ব্যবহার করে, আমরা ওয়ার্কস্টেশন গার্বেজ কালেকশন সক্ষম করে Ed-Pro এর মেমোরি প্রোফাইল করেছি এবং পূর্ববর্তী পরীক্ষার মতো একই স্ক্রিন লোড করেছি। এখানে ফলাফল রয়েছে:

মেমোরি ব্যবহার উল্লেখযোগ্যভাবে হ্রাস পেয়েছে। Gen0 বরাদ্দগুলি কার্যত অস্তিত্বহীন। গ্রাফের পার্থক্যের বাইরে, সার্ভার গার্বেজ কালেকশন মেমোরি ব্যবহার 1 গিগ শীর্ষে পৌঁছেছিল যখন ওয়ার্কস্টেশন গার্বেজ কালেকশন মোটামুটি 200 মেগ শীর্ষে পৌঁছেছিল।
প্রতিটি অ্যাপ্লিকেশন আলাদা। আমাদের অ্যাপ্লিকেশন প্রচুর পরিমাণে অস্থায়ী ডেটা ব্যবহার করেছিল এবং এইভাবে প্রচুর পরিমাণে Gen0 মেমোরি ব্যবহার করেছিল। আপনার অ্যাপ্লিকেশন দীর্ঘস্থায়ী মেমোরি যেমন Gen1 বা Gen2 ব্যবহার করতে পারে যেখানে সার্ভার গার্বেজ কালেকশন অনেক বেশি অর্থপূর্ণ। আমার পরামর্শ হল বিভিন্ন পরিস্থিতিতে আপনার মেমোরি প্রোফাইল করা মেমোরি কীভাবে ব্যবহার করা হয় তার একটি ধারণা পেতে এবং তারপর আপনার অ্যাপ্লিকেশনের জন্য কোন মোড সেরা তা সিদ্ধান্ত নিন।
লেখক: চাক কনওয়ে একজন এআই ইঞ্জিনিয়ার যার কাছে প্রায় ৩০ বছরের সফটওয়্যার ইঞ্জিনিয়ারিং অভিজ্ঞতা রয়েছে। তিনি ব্যবহারিক এআই সিস্টেম তৈরি করেন—কন্টেন্ট পাইপলাইন, অবকাঠামো এজেন্ট এবং সরঞ্জাম যা বাস্তব সমস্যার সমাধান করে—এবং তার শেখার বিষয়গুলি শেয়ার করেন। তার সাথে সোশ্যাল মিডিয়ায় সংযোগ করুন: X (@chuckconway) অথবা তাকে YouTube এবং SubStack এ দেখুন।