রুবিতে মেমরি বরাদ্দ কিভাবে কাজ করে?
রুবি টুকরো টুকরো মেমরি পায়, যাকে পেজ বলা হয়, এখানে নতুন বস্তু সংরক্ষিত হয়।
তারপর…
যখন এই পৃষ্ঠাগুলি পূর্ণ হয়, তখন আরও মেমরির প্রয়োজন হয়৷
রুবি malloc
দিয়ে অপারেটিং সিস্টেম থেকে আরও মেমরির অনুরোধ করে ফাংশন।
এই malloc
ফাংশন নিজেই অপারেটিং সিস্টেমের অংশ, কিন্তু বিকল্প বাস্তবায়ন আপনি ব্যবহার করতে পারেন।
এই বাস্তবায়নের মধ্যে একটি হল Google-এর tcmalloc৷৷
TCmalloc হল Google পারফরমেন্স টুল স্যুটের অংশ৷
৷রুবি কীভাবে মেমরি বরাদ্দ করে তা অন্বেষণ করতে আপনি এই সরঞ্জামগুলি ব্যবহার করতে পারেন৷
এবং LD_PRELOAD
কে ধন্যবাদ পরিবেশ পরিবর্তনশীল (লিনাক্সে) আমরা আপনার সিস্টেমের malloc
প্রতিস্থাপন করতে পারি tcmalloc সহ ফাংশন।
এরকম :
LD_PRELOAD="/usr/lib/libtcmalloc.so" ruby -e "puts 123"
কিন্তু এটি শুধুমাত্র লাইব্রেরি লোড করে, এটি এখনও কোনো ডেটা সংগ্রহ সক্ষম করে না৷
৷দেখা যাক কিভাবে করা হয়।
প্রোফাইলার সক্ষম করা হচ্ছে
আপনি একটি অতিরিক্ত এনভায়রনমেন্ট ভেরিয়েবল (HEAPPROFILE
দিয়ে tcmalloc এর প্রোফাইলার সক্ষম করতে পারেন )।
LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPPROFILE=/tmp/profile ruby -e "puts 123"
এটি নিম্নলিখিত আউটপুট তৈরি করবে:
Starting tracking the heap 123 Dumping heap profile to /tmp/profile.0001.heap (Exiting, 2 MB in use)
এখানে আপনি একটি নিশ্চিতকরণ দেখতে পাচ্ছেন যে প্রোফাইলার সক্ষম করা হয়েছে৷
৷তারপর আমরা দেখি :
- প্রোগ্রামের আউটপুট
- ফাইলের নাম (
profile.0001.heap
) - আমাদের প্রোগ্রাম দ্বারা ব্যবহৃত মেমরির পরিমাণ (
2 MB
)
এই ফাইলটি পড়ার জন্য আপনাকে tcmalloc এর সাথে অন্তর্ভুক্ত আরেকটি টুলের প্রয়োজন হবে।
pprof --text `which ruby` /tmp/profile.0001.heap | head -10
এটি নিম্নলিখিত আউটপুট তৈরি করবে:
Total: 2.4 MB 1.1 44.7% 44.7% 1.1 44.7% 0x00005570fa4df074 0.7 27.8% 72.5% 0.7 27.8% 0x00005570fa4e0c09 0.4 15.3% 87.8% 0.4 15.3% 0x00005570fa4db460 0.1 5.9% 93.7% 0.1 5.9% 0x00005570fa4df19f 0.1 3.2% 96.9% 0.1 3.2% 0x00005570fa6349a0 0.0 1.4% 98.3% 0.0 1.4% 0x00005570fa589924 0.0 0.3% 98.6% 0.0 0.3% 0x00005570fa59c4f2 0.0 0.3% 98.8% 0.0 0.3% 0x00005570fa4db48a 0.0 0.2% 99.0% 0.0 0.2% 0x00005570fa4dbaa5 0.0 0.2% 99.1% 0.0 0.2% _dl_new_object
ঠিক আছে, এটি কেবল মেমরি ঠিকানাগুলির একটি গুচ্ছ! ফাংশনের নাম দেখতে সক্ষম হতে আপনার ডিবাগিং চিহ্ন সহ রুবির একটি সংস্করণ প্রয়োজন৷
তারপর আপনি এই আউটপুটটি পাবেন :
Using local file ruby. Using local file /tmp/profile.0001.heap. Total: 2.9 MB 1.0 36.2% 36.2% 1.0 36.2% objspace_xmalloc0 0.7 26.1% 62.4% 0.7 26.1% aligned_malloc 0.5 18.8% 81.1% 0.5 18.8% objspace_xcalloc 0.3 9.9% 91.0% 0.3 9.9% stack_chunk_alloc 0.1 3.7% 94.7% 0.1 3.7% objspace_xrealloc 0.1 2.7% 97.4% 0.1 2.7% Init_Method 0.0 1.3% 98.7% 0.0 1.7% onig_new_with_source 0.0 0.4% 99.2% 0.8 26.6% heap_page_allocate 0.0 0.2% 99.4% 0.0 0.2% add_bitset
আপনি এখানে যা দেখছেন তা হল এমআরআই এর কার্যকারিতা দ্বারা কতটা মেমরি বরাদ্দ করা হয়েছিল৷
৷
এটা জানা আকর্ষণীয় যে aligned_malloc
রুবি বস্তু, stack_chunk_alloc
এর জন্য নতুন পৃষ্ঠাগুলি বরাদ্দ করতে ব্যবহৃত ফাংশন চিহ্নিতকরণ পর্বের সময় GC নিজেই ব্যবহার করে এবং objspace_xmalloc0
/ objspace_xcalloc
স্ট্রিং, অ্যারে এবং অন্য যেকোন ডেটার জন্য স্থান বরাদ্দ করুন যা RVALUE
-এর সাথে খাপ খায় না গঠন।
এখন:
TCmalloc রুবি অবজেক্ট সম্পর্কে কিছুই জানে না, এটি শুধুমাত্র ম্যালোক, কলক এবং রিয়েললকের কল ট্র্যাক করে কত মেমরির অনুরোধ করা হয়েছে তা খুঁজে বের করার জন্য।
আপনি রুবি স্তরে একটি হিপ ডাম্প পেতে চাইলে আপনি ObjectSpace.dump_all
ব্যবহার করতে পারেন . এটি আপনাকে আপনার অ্যাপ্লিকেশনের সমস্ত লাইভ বস্তু এবং তাদের মেমরির আকার সহ একটি JSON ফাইল দেয়৷
কিন্তু কি tcmalloc
আপনাকে দেখাতে পারে যে সমস্ত সি ফাংশনগুলির একটি ভিজ্যুয়ালাইজেশন যা মেমরির অনুরোধ করে।
pprof --web `which ruby` /tmp/profile.0001.heap
এটি একটি SVG ফাইল সহ Chrome বা Firefox খুলবে যা দেখতে এইরকম:
TCmalloc শুধুমাত্র আপনাকে এই সুন্দর প্রোফাইলিং ক্ষমতা দেয় না, কিন্তু এটি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা 4-9% বৃদ্ধি করতে পারেন! আপনি jemalloc
ব্যবহার করে দেখতে পারেন , যা অন্য malloc
বাস্তবায়ন যা একটি প্রোফাইলারও অন্তর্ভুক্ত করে।
সারাংশ
আপনি রুবি ইন্টারপ্রেটারের মেমরি ব্যবহার কল্পনা ও বিশ্লেষণ করতে gperftools (Google Performance Tools) ব্যবহার করতে শিখেছেন।
পড়ার জন্য ধন্যবাদ! 🙂