স্থানীয় স্মৃতি বিশ্লেষণ

নেটিভ মেমরি বলতে C, C++, বা Rust কোডে malloc , free মতো ফাংশন অথবা newdelete মতো অপারেটর ব্যবহার করে করা মেমোরি অ্যালোকেশনকে বোঝায়। জাভার মতো নয়, নেটিভ মেমরি স্বয়ংক্রিয়ভাবে গার্বেজ-কালেক্টেড হয় না; প্রতিটি অ্যালোকেশনের লাইফসাইকেল পরিচালনার দায়িত্ব আপনার।

heapprofd দিয়ে প্রোফাইলিং

heapprofd হলো অ্যান্ড্রয়েডের জন্য প্ল্যাটফর্ম-ব্যাপী নেটিভ হিপ প্রোফাইলার। এটি ন্যূনতম ওভারহেড সহ অ্যালোকেশন এবং ডিঅ্যালোকেশন রেকর্ড করতে একটি স্যাম্পলিং-ভিত্তিক পদ্ধতি ব্যবহার করে।

heap_profile টুল ব্যবহার করে

নেটিভ হিপ প্রোফাইল ক্যাপচার করার সবচেয়ে সহজ উপায় হলো পারফেট্টো দ্বারা প্রদত্ত heap_profile স্ক্রিপ্টটি ব্যবহার করা।

  1. পারফেটটো রিপোজিটরি থেকে স্ক্রিপ্টটি ডাউনলোড করুন:

    curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/heap_profile
    chmod +x heap_profile
    
  2. আপনার ডিভাইসটি ADB-এর মাধ্যমে সংযুক্ত আছে কিনা তা নিশ্চিত করুন এবং টার্গেট প্রসেসটি নির্দিষ্ট করে টুলটি চালান:

    ./heap_profile -n <package_name_or_process_name>
    
  3. আপনার অ্যাপ্লিকেশনে ব্যবহারকারীর যাত্রাটি সম্পাদন করুন।

  4. প্রোফাইলারটি বন্ধ করুন (Ctrl+C)। স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে প্রোফাইলটি সংগ্রহ করবে, একটি স্থানীয় pprof সার্ভার চালু করবে এবং ফ্লেমগ্রাফটি দেখার জন্য আপনার ওয়েব ব্রাউজারটি খুলবে।

স্ন্যাপশট ট্রিগার করা

পারফেটটো ট্রেস চলার সময়ও আপনি বর্তমান হিপ স্টেটের একটি ডাম্প ট্রিগার করতে পারেন:

adb shell killall -USR1 heapprofd

এটি পারফেটটো UI-তে একটি স্ন্যাপশট (ডায়মন্ড আইকন) তৈরি করে। এরকম একটি উদাহরণ heapprofd কনফিগারেশন ব্যবহার করুন:

buffers: {
    size_kb: 65536
}
data_sources: {
    config {
        name: "android.heapprofd"
        heapprofd_config {
            sampling_interval_bytes: 4096
            process_cmdline: "com.example.myapp"
        }
    }
}
duration_ms: 20000

পিপিওআরএফ দিয়ে বিশ্লেষণ

heapprofd-এর আউটপুট হলো একগুচ্ছ .pb.gz ফাইল। যদি আপনি heap_profile স্ক্রিপ্টটি ব্যবহার করে থাকেন, তাহলে এই ফাইলগুলো স্বয়ংক্রিয়ভাবে আপনার হোস্ট মেশিনের টেম্পোরারি ডিরেক্টরিতে (যেমন, Linux বা macOS-এ /tmp/heap_profile-XXXXXX ) চলে আসে এবং /tmp/heap_profile-latest এ একটি সুবিধাজনক সিমলিঙ্ক তৈরি হয়।

আরও দেখুন: পারফেট্টো দিয়ে মেমরি প্রোফাইল রেকর্ড করা

আপনি pprof নামক একটি টুল ব্যবহার করে এই ফাইলগুলো ম্যানুয়ালি বিশ্লেষণ করতে পারেন, যা প্রোফাইলিং ডেটার ভিজ্যুয়ালাইজেশন ও বিশ্লেষণের একটি টুল।

ফ্লেমগ্রাফ দেখা

আপনার প্রোফাইলটি গুগল পিপ্রফ (Google pprof)-এর মতো কোনো pprof ভিউয়ারে আপলোড করুন, যা গিটহাবে (GitHub) উপলব্ধ

com.android.memorylab-এর জন্য অপ্রকাশিত Malloc সাইজ প্রদর্শনকারী নেটিভ হিপ ফ্লেমগ্রাফ।

  • অপ্রকাশিত মেমরি : এমন মেমরি বরাদ্দ (অ্যালোকেশন) খুঁজুন যা করা হয়েছে কিন্তু কখনও মুক্ত (ফ্রি) করা হয়নি। একটি ফ্লেমগ্রাফ সবচেয়ে বেশি অপ্রকাশিত বাইটের জন্য দায়ী কল স্ট্যাকগুলো দেখাবে।
  • মোট বরাদ্দ : আপনি সম্পূর্ণ প্রোফাইল সময়কাল জুড়ে বরাদ্দ করা মোট বাইটের সংখ্যাও দেখতে পারেন, যা নেটিভ কোডে বরাদ্দের পরিবর্তন (অ্যালোকেশন চার্ন) খুঁজে বের করার জন্য সহায়ক।

নেটিভ হিপ প্রোফাইলের জন্য পারফেটটোএসকিউএল

যদি আপনি একটি সম্পূর্ণ পারফেটটো ট্রেসের মধ্যে ( heapprofd ব্যবহার করে) নেটিভ হিপ প্রোফাইলটি ক্যাপচার করে থাকেন, তাহলে আপনি র অ্যালোকেশনগুলো কোয়েরি করতে পারবেন। এটি অবজেক্ট গণনা করতে বা বাইটগুলোর সারসংক্ষেপ করতে সহায়ক:

SELECT
  upid,
  count(id) AS allocation_count,
  sum(size) AS total_bytes
FROM heap_profile_allocation
GROUP BY upid
ORDER BY total_bytes DESC;

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

প্রতীকীকরণ

আপনার ফ্লেমগ্রাফে যদি "unknown" ফ্রেম দেখতে পান, তাহলে আপনাকে প্রোফাইলটি সিম্বোলাইজ করতে হবে। এর জন্য আপনার নেটিভ লাইব্রেরিগুলোর আনস্ট্রিপড ভার্সন (ডিবাগ সিম্বলসহ .so ফাইল) প্রদান করতে হবে।

AOSP-তে সিম্বল কোথায় পাবেন: বিল্ড প্রক্রিয়ার সময় সিম্বল তৈরি হয় এবং out/target/product/<device_name>/symbols/ -এ সংরক্ষিত থাকে।

heap_profile টুলের সাথে --sym-dir ফ্ল্যাগটি ব্যবহার করুন:

./heap_profile -n <process> --sym-dir <path-to-unstripped-symbols>

গ্রাফিক্স এবং ডিএমএ-বিইউএফ বিশ্লেষণ

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

যেহেতু DMA-BUF-গুলো বিভিন্ন প্রসেসের মধ্যে শেয়ার করা হয় (যেমন, আপনার অ্যাপ এবং surfaceflinger বা ক্যামেরা সার্ভিসের মধ্যে), তাই এগুলো ট্র্যাক করা কঠিন হতে পারে। dmabuf_dump টুলটি DMA-BUF ব্যবহারকারী সমস্ত প্রসেসের রিপোর্ট করে।


← বিটম্যাপস | ↑ উপরে | ওয়েবভিউ →