Android 12-এ DMABUF এবং GPU মেমরি অ্যাকাউন্টিং প্রয়োগ করুন

এই পৃষ্ঠাটি Android 12-এ প্রবর্তিত বিভিন্ন মেমরি অ্যাকাউন্টিং উন্নতির বর্ণনা করে।

sysfs-এ DMA-BUF পরিসংখ্যান

অ্যান্ড্রয়েড 11 এবং অ্যান্ড্রয়েড 12-এ, ব্যবহারকারী বিল্ডে debugfs মাউন্ট করা যাবে না। তাই Android 12-এর /sys/kernel/dmabuf/buffers ডিরেক্টরিতে sysfs এ DMA-BUF পরিসংখ্যান যোগ করা হয়েছে।

পথ বর্ণনা
/sys/kernel/dmabuf/buffers /sys/kernel/dmabuf/buffers ডিরেক্টরিতে প্রতিটি DMA-BUF-এর অভ্যন্তরীণ অবস্থার একটি স্ন্যাপশট রয়েছে। /sys/kernel/dmabuf/buffers/<inode_number> অনন্য ইনোড নম্বর <inode_number> সহ DMA-BUF-এর পরিসংখ্যান রয়েছে।
/sys/kernel/dmabuf/buffers/<inode_number>/exporter_name এই শুধুমাত্র পঠনযোগ্য ফাইলটিতে DMA-BUF রপ্তানিকারকের নাম রয়েছে৷
/sys/kernel/dmabuf/buffers/<inode_number>/size এই শুধুমাত্র পঠনযোগ্য ফাইলটি বাইটে DMA-BUF এর আকার নির্দিষ্ট করে।

libdmabufinfo API DMA-BUF sysfs পরিসংখ্যান বিশ্লেষণ করে প্রতি-রপ্তানিকারক এবং প্রতি-বাফার পরিসংখ্যান প্রকাশ করতে।

অনুগ্রহ করে মনে রাখবেন যে কার্নেল ড্রাইভার যারা DMA-BUF রপ্তানি করে তাদের অবশ্যই DMA-BUF তৈরি করতে dma_buf_export() API ব্যবহার করার আগে struct dma_buf_export_info এর exp_name ক্ষেত্রটি রপ্তানিকারকের নামের সাথে সঠিকভাবে সেট করতে হবে। এটি libdmabufinfo এবং dmabuf_dump টুলের জন্য প্রয়োজন প্রতি-রপ্তানিকারক পরিসংখ্যান সংগ্রহ করতে যা পরে বাগ রিপোর্টে প্রকাশ করা হয়।

dmabuf_dump টুলটিকে একটি নতুন আর্গুমেন্ট সহ এই তথ্য আউটপুট করার জন্য পরিবর্তন করা হয়েছে, -b

DMA-BUF হিপস ফ্রেমওয়ার্কের পরিসংখ্যান

GKI 2.0-এ ION-কে DMA-BUF হিপস ফ্রেমওয়ার্কের পক্ষে অবমূল্যায়ন করা হচ্ছে, যা আপস্ট্রিম লিনাক্স কার্নেলের অংশ।

নিম্নলিখিত বিশ্বব্যাপী ION পরিসংখ্যানগুলি Android 11 এ ট্র্যাক করা হয়েছে:

  • প্রতিটি ION হিপ দ্বারা রপ্তানি করা DMA-BUF এর মোট আকার৷
  • প্রতিটি ION হিপ দ্বারা সংরক্ষিত অব্যবহৃত প্রাক-বরাদ্দকৃত মেমরির মোট আকার

Android 11-এ প্রতি-ION হিপ পরিসংখ্যান প্রকাশ করার জন্য কোনও ইন্টারফেস উপলব্ধ নেই।

নিম্নলিখিত সারণীটি Android 12-এ DMA-BUF হিপ ফ্রেমওয়ার্ক ব্যবহার করে এমন ডিভাইসগুলির জন্য আইওন পরিসংখ্যান ইন্টারফেসগুলিকে তাদের প্রতিপক্ষের সাথে তুলনা করে।

Android 11 বা Android 12-এ ION সমর্থন সহ ডিভাইসগুলি চালু হচ্ছে৷ Android 12-এ DMA-BUF হিপস সহ ডিভাইসগুলি চালু হচ্ছে৷
প্রতি-হিপ ION পরিসংখ্যান কোনোটিই নয় DMA-BUF sysfs পরিসংখ্যান থেকে পার্স করা হয়েছে
DMA-BUFs এর মোট আকার রপ্তানি করা হয়েছে /sys/kernel/ion/total_heap_size_kb
(অ-আইওন রপ্তানিকারকদের দ্বারা রপ্তানি করা DMA-BUF এর আকার অন্তর্ভুক্ত নয়)
DMA-BUF sysfs পরিসংখ্যান থেকে পার্স করা হয়েছে
(রপ্তানি করা সমস্ত DMA-BUF এর আকার অন্তর্ভুক্ত)।
মোট মেমরি স্তূপ দ্বারা পুল /sys/kernel/ion/total_pool_size_kb /sys/kernel/dma_heap/total_pool_size_kb

হারিয়ে যাওয়া RAM গণনার সঠিকতা উন্নত করুন

পূর্বে হারানো RAM গণনা নিম্নরূপ করা হয়েছিল:

চূড়ান্ত দীর্ঘ lostRAM = memInfo.getTotalSizeKb( ) - ( totalPss - totalSwapPss )

- memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()

- kernelUsed - memInfo.getZramTotalSizeKb() ;

totalPss কম্পোনেন্টে জিপিইউ মেমরি ব্যবহার অন্তর্ভুক্ত ছিল (মেমট্র্যাক এইচএএল-এর গেটমেমোরি() ইন্টারফেস দ্বারা প্রত্যাবর্তন করা হয়েছে)। kernelUsed উপাদানটিতে মোট DMA-BUF মেমরি ব্যবহার অন্তর্ভুক্ত ছিল। যাইহোক, অ্যান্ড্রয়েড ডিভাইসের জন্য, GPU মেমরি নিম্নলিখিত থেকে এসেছে:

  • জিপিইউ ড্রাইভার ফিজিক্যাল পেজ অ্যালোকেটর ব্যবহার করে সরাসরি বরাদ্দ করে
  • DMA-BUFs GPU ঠিকানা স্থান ম্যাপ করা হয়েছে

তাই, DMA-BUFs যেগুলি GPU ঠিকানার জায়গায় মেমরি-ম্যাপ করা হয়েছিল যখন হারিয়ে যাওয়া RAM গণনা করা হয়েছিল তখন দুবার বিয়োগ করা হয়েছিল। অ্যান্ড্রয়েড 12 GPU অ্যাড্রেস স্পেসে ম্যাপ করা DMA-BUF-এর আকার গণনা করার জন্য একটি সমাধান প্রয়োগ করে, যার মানে হল যে এটি হারিয়ে যাওয়া RAM গণনাতে শুধুমাত্র একবারের জন্য হিসাব করা হয়েছে।

সমাধানের বিবরণ নিম্নরূপ:

  • Memtrack HAL API getMemory() যখন PID 0 এর সাথে কল করা হয় তখন মেমট্র্যাক টাইপ::জিএল এবং মেমট্র্যাকরেকর্ড::FLAG_SMAPS_UNACCOUNTED এর জন্য বিশ্বব্যাপী মোট GPU-প্রাইভেট মেমরির রিপোর্ট করতে হবে।
  • getMemory() কে PID 0 দিয়ে কল করা হলে GL ছাড়া অন্য MemtrackType এর জন্য অবশ্যই ব্যর্থ হবে না। এর পরিবর্তে 0 ফেরত দিতে হবে।
  • মোট GPU মেমরির জন্য Android 12 অ্যাকাউন্টে GPU মেমরি ট্রেসপয়েন্ট/eBPF সমাধান যোগ করা হয়েছে। মোট GPU মেমরি থেকে মোট GPU প্রাইভেট মেমরি বিয়োগ করলে GPU অ্যাড্রেস স্পেসে ম্যাপ করা DMA-BUF-এর আকার পাওয়া যায়। মান তারপর GPU মেমরি ব্যবহারের জন্য সঠিকভাবে হিসাব করে হারিয়ে যাওয়া RAM গণনার নির্ভুলতা উন্নত করতে ব্যবহার করা যেতে পারে।
  • প্রাইভেট GPU মেমরি বেশিরভাগ মেমট্র্যাক HAL বাস্তবায়নে totalPss এ অন্তর্ভুক্ত থাকে এবং সেইজন্য lostRAM থেকে মুছে ফেলার আগে অবশ্যই ডিডুপ্লিকেট করা উচিত।

বাস্তবায়িত সমাধান পরবর্তী বিভাগে বিস্তারিত আছে.

হারিয়ে যাওয়া RAM থেকে Memtrack পরিবর্তনশীলতা সরান

যেহেতু Memtrack HAL বাস্তবায়ন অংশীদারদের মধ্যে পরিবর্তিত হতে পারে, তাই HAL থেকে totalPSS অন্তর্ভুক্ত GPU মেমরি সবসময় সামঞ্জস্যপূর্ণ নয়। lostRAM থেকে পরিবর্তনশীলতা অপসারণ করার জন্য, MemtrackType::GRAPHICS এবং মেমট্র্যাক টাইপ::জিএল-এ মেমট্র্যাক টাইপ হিসাবে বিবেচিত হয়, lostRAM গণনার সময় totalPss থেকে MemtrackType::GL মুছে ফেলা হয়।

MemtrackType::GRAPHICS মেমরি totalPss থেকে সরানো হয়েছে এবং ActivityManagerService.java- তে lostRAM ক্যালকুলেশনে totalExportedDmabuf মেমরির সাথে প্রতিস্থাপিত হয়েছে যা নীচে দেখানো হয়েছে:

final long totalExportedDmabuf = Debug.getDmabufTotalExportedKb();

. . .

final long dmabufUnmapped = totalExportedDmabuf - dmabufMapped;

. . .

// Account unmapped dmabufs as part of the kernel memory allocations
kernelUsed += dmabufUnmapped;

// Replace Memtrack HAL reported Graphics category with mapped dmabufs
totalPss -= totalMemtrackGraphics;
totalPss += dmabufMapped;

MemtrackType::GL মেমরি totalPss থেকে সরিয়ে দেওয়া হয়েছে এবং ActivityManagerService.java- তে lostRAM ক্যালকুলেশনে প্রাইভেট GPU মেমরি ( gpuPrivateUsage ) দিয়ে প্রতিস্থাপিত হয়েছে, যা নীচে দেখানো হয়েছে:

final long gpuUsage = Debug.getGpuTotalUsageKb();

. . .

final long gpuPrivateUsage = Debug.getGpuPrivateMemoryKb();

. . .

// Replace the Memtrack HAL-reported GL category with private GPU allocations.
// Count it as part of the kernel memory allocations.
totalPss -= totalMemtrackGl;
kernelUsed += gpuPrivateUsage;

হালানো RAM হিসাব আপডেট করা হয়েছে

মোট ব্যক্তিগত GPU মেমরি এবং মোট রপ্তানিকৃত DMA বাফার মেমরি উভয়ই kernelUsed + totalPss এ থাকে যা lostRAM থেকে সরানো হয়। এটি হারিয়ে যাওয়া RAM গণনা থেকে ডাবল-কাউন্টিং এবং মেমট্র্যাক পরিবর্তনশীলতা উভয়ই দূর করে।

final long lostRAM = memInfo.getTotalSizeKb() - (totalPss - totalSwapPss)
- memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()
- kernelUsed - memInfo.getZramTotalSizeKb();

বৈধতা

ভিটিএস পরীক্ষাগুলি সেই নিয়মটি প্রয়োগ করে যে ডিভাইসগুলি Android 12 এ একটি Linux কার্নেল সংস্করণ 5.4 বা উচ্চতর সংস্করণের সাথে চালু করা getGpuDeviceInfo() API সমর্থন করে।

একটি নতুন Memtrack HAL API getGpuDeviceInfo() ব্যবহার করা GPU ডিভাইস সম্পর্কে তথ্য ফেরত দিতে হবে।

এটি DMA বাফার এবং GPU মেমরি ব্যবহারে আরও ভাল মেমরি অ্যাকাউন্টিং এবং দৃশ্যমানতা প্রদান করে। ভাল হারানো RAM এবং মেমরি অ্যাকাউন্টিংয়ের জন্য মেমট্র্যাক AIDL HAL প্রয়োগ করুন। এই বৈশিষ্ট্যটি Google পরিষেবার উপর নির্ভরশীল নয়৷

বাস্তবায়ন

এই বৈশিষ্ট্যটি AIDL Memtrack HAL- এর উপর নির্ভর করে এবং Android 12-এ এটি প্রয়োগ করার নির্দেশাবলী মন্তব্য হিসাবে কোডে অন্তর্ভুক্ত করা হয়েছে।

সমস্ত HIDL HALগুলিকে ভবিষ্যতে রিলিজে AIDL-এ রূপান্তরিত করার পরিকল্পনা করা হয়েছে৷

নিম্নলিখিত APIগুলি core/java/android/os/Debug.java তে যোগ করা হয়েছে:

   /**
     * Return total memory size in kilobytes for exported DMA-BUFs or -1 if
     * the DMA-BUF sysfs stats at /sys/kernel/dmabuf/buffers could not be read.
     *
     * @hide
     */
    public static native long getDmabufTotalExportedKb();

   /**
     * Return memory size in kilobytes allocated for DMA-BUF heap pools or -1 if
     * /sys/kernel/dma_heap/total_pools_kb could not be read.
     *
     * @hide
     */
    public static native long getDmabufHeapPoolsSizeKb();

আপনার সংস্করণটি উদ্দেশ্য অনুসারে কাজ করে তা নিশ্চিত করতে, আপনার GPU ড্রাইভারগুলিতে ট্রেসপয়েন্টগুলিকে একীভূত করুন এবং মেমট্র্যাক টাইপ::জিএল এবং মেমট্র্যাকরেকর্ড:: এর জন্য পিআইডি 0 দিয়ে কল করা হলে বিশ্বব্যাপী মোট GPU-প্রাইভেট মেমরি সঠিকভাবে ফেরত দিতে AIDL মেমট্র্যাক HAL getMemory() API প্রয়োগ করুন: FLAG_SMAPS_UNACCOUNTED