কম্পিউটার

TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

রুবিতে মেমরি বরাদ্দ কিভাবে কাজ করে?

রুবি টুকরো টুকরো মেমরি পায়, যাকে পেজ বলা হয়, এখানে নতুন বস্তু সংরক্ষিত হয়।

তারপর…

যখন এই পৃষ্ঠাগুলি পূর্ণ হয়, তখন আরও মেমরির প্রয়োজন হয়৷

রুবি 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-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

TCmalloc শুধুমাত্র আপনাকে এই সুন্দর প্রোফাইলিং ক্ষমতা দেয় না, কিন্তু এটি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা 4-9% বৃদ্ধি করতে পারেন! আপনি jemalloc ব্যবহার করে দেখতে পারেন , যা অন্য malloc বাস্তবায়ন যা একটি প্রোফাইলারও অন্তর্ভুক্ত করে।

সারাংশ

আপনি রুবি ইন্টারপ্রেটারের মেমরি ব্যবহার কল্পনা ও বিশ্লেষণ করতে gperftools (Google Performance Tools) ব্যবহার করতে শিখেছেন।

পড়ার জন্য ধন্যবাদ! 🙂


  1. রুবির সাথে মার্জ সাজানোর অন্বেষণ

  2. রুবির সাথে সিলেকশন সর্ট বোঝা

  3. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  4. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন