মেমরি ম্যানেজমেন্ট ডেমন

Android 17 ও এর পরের যেকোনও ভার্সনে মেমরি ম্যানেজমেন্ট ডেমোন (mmd) কাজ করে। এটি একটি সিস্টেম ডেমোন যা ডেমোন কনফিগারেশন, টিউনযোগ্য এবং চলমান সোয়াপ বা ZRAM ম্যানেজমেন্ট টাস্ক হ্যান্ডেল করে।

ব্যাকগ্রাউন্ড

mmd চালু করার আগে, Android-এর ZRAM কনফিগারেশন ফ্র্যাগমেন্টেড ছিল এবং সীমিত কাস্টমাইজেশন অফার করত। mmd ZRAM ম্যানেজমেন্টকে কেন্দ্রীভূত করে, আরও অত্যাধুনিক কনফিগারেশন লজিক চালু করে এবং নতুন ফিচার ও আর্কিটেকচারাল উন্নতি যোগ করার প্রক্রিয়াকে সহজ করে এই সমস্যার সমাধান করে। mmd এছাড়াও, এটি জাভা-ভিত্তিক system_server প্রসেস এবং কার্নেল-লেভেল সোয়াপ বা মেমরি ম্যানেজমেন্টের মধ্যে উদ্বেগের একটি স্পষ্ট বিভাজন তৈরি করে।

আর্কিটেকচার ও ZRAM ম্যানেজমেন্ট

বুট সম্পূর্ণ হলে (অর্থাৎ, sys.boot_completed=1), mmd_setup নির্দিষ্ট প্যারামিটার সহ ZRAM কনফিগার করার চেষ্টা করে। ZRAM সেট-আপ সম্পূর্ণ হওয়ার পরে, সিস্টেম mmd পরিষেবা চালু করে যা চলমান রক্ষণাবেক্ষণের টাস্কগুলি ম্যানেজ করে।

mmd প্রোজেক্টের সাথে, IMmd ইন্টারফেস ব্যবহার করে mmd-এ বাইন্ডার অনুরোধ পাঠানোর মাধ্যমে system_server থেকে রক্ষণাবেক্ষণ অপারেশন শুরু করা হয়। mmd-এর নিজস্ব ইন্টার্নাল নীতি ইঞ্জিনের উপর ভিত্তি করে ZRAM রাইটব্যাক, রিকম্প্রেশন এবং প্রসেস-পিছু রাইটব্যাকের মতো রক্ষণাবেক্ষণের কাজগুলি হ্যান্ডেল করে। সিস্টেম প্রপার্টি ব্যবহার করে ActivityManagerService থেকে শিডিউল করা এবং ZRAM পরিচালনা সংক্রান্ত নীতি, দুটিই কনফিগার করা যেতে পারে।

সিস্টেম সার্ভার ইন্টিগ্রেশন (system_server)

Java-ভিত্তিক system_server প্রসেস নির্ধারণ করে যে কখন mmd আহ্বান করা হয়। এই প্রসেস, গ্লোবাল রক্ষণাবেক্ষণ সুইপকে টার্গেট করা প্রতি-অ্যাপ মেমরি অপ্টিমাইজেশন থেকে আলাদা করে।

স্বাভাবিক পোস্ট-প্রসেসিং রক্ষণাবেক্ষণ

গ্লোবাল ZRAM রক্ষণাবেক্ষণ ActivityManagerService দ্বারা পরিচালিত হয় এবং এর জন্য com.android.server.memory.ZramMaintenance ব্যবহার করা হয়।

zram-maintenance

ছবি ১. ZRAM রক্ষণাবেক্ষণ শিডিউলিং ফ্লো।

  • শিডিউলিং ইঞ্জিন: ZramMaintenance Android-এর JobScheduler-এর সাথে একটি পর্যায়ক্রমিক ব্যাকগ্রাউন্ড জব রেজিস্টার করে।
  • জব সংক্রান্ত সীমাবদ্ধতা: ফোরগ্রাউন্ড UI স্টাটারিং বা CPU কনটেনশন এড়াতে, জবটি setRequiresDeviceIdle(true) এবং setRequiresBatteryNotLow(true)-এর সাথে স্পষ্টভাবে কনফিগার করা হয়েছে।
  • বাইন্ডার ট্রিগার করা: শিডিউলার যখন onStartJob() ফায়ার করে, system_server mmd.doZramMaintenanceAsync()-কে ইনভোক করে। এটি একমুখী অ্যাসিঙ্ক্রোনাস বাইন্ডার কল; system_server মেন্টেনেন্স সোয়িপ শেষ হওয়ার জন্য অপেক্ষা করে ব্লক করে না। mmd এটিকে ব্যাকগ্রাউন্ড ওয়ার্কার থ্রেডে সারিবদ্ধ করে যাতে রিকম্প্রেশন ও রাইটব্যাক ক্রমানুসারে করা যায়।

প্রতি প্রসেস রাইটব্যাক

প্রসেস প্রতি টার্গেট করা মেমরি খালি করার বিষয়টি ActivityManagerService ম্যানেজ করে, যা com.android.server.am.CachedAppOptimizer ব্যবহার করে।

mmd-writeback

ছবি ২. প্রসেস পিছু mmd রাইটব্যাক ফ্লো।

কোনও প্রসেস ব্যাকগ্রাউন্ডে ক্যাশে করা অবস্থায় চলে গেলে, ActivityManager মেমরি কম্প্যাকশন পারফর্ম করে। যদি প্রসেসের লো মেমরি কিল ব্যবহারকারী দেখতে পান, অর্থাৎ, প্রসেসটি কোনও অ্যাক্টিভিটি হোস্ট করে এবং যদি ZRAM প্রতি-প্রসেস রাইটব্যাক প্রসেসের মেমরি ফুটপ্রিন্টকে প্রায় শূন্যে নিয়ে আসে, তাহলে সিস্টেম এই ধাপগুলি অনুসরণ করে:

  1. কম্প্যাকশনের পরে, CachedAppOptimizer তার ইন্টার্নাল কম্প্যাকশন হ্যান্ডলারে একটি বিলম্বিত মেসেজ (ZRAM_WRITEBACK_MSG) পোস্ট করে (mZramWritebackWaitSeconds দ্বারা বিলম্বিত)।
  2. বিলম্বের সময়সীমা শেষ হয়ে গেলে, ActivityManager একটি সুরক্ষিত প্রসেস ফাইল ডেসক্রিপ্টর pidfd খোলে।
  3. সিস্টেম সার্ভার mmd.asyncWritebackProcessZramMemory(pfd, callback)-কে কল করে।
  4. mmd প্রতি-প্রসেস রাইটব্যাক ioctl এক্সিকিউট করে এবং IMmdProcessWritebackCallback ব্যবহার করে রিপোর্ট করে। সফল হলে, ActivityManager প্রসেস রেকর্ডকে (setIsZramWrittenBack(app, true)) ফ্ল্যাগ করে যাতে প্রসেসের oom_score_adj বুস্ট করা যায় এবং FrameworkStatsLog.ZRAM_WRITEBACK_EVENT-এ মেট্রিক লগ করে।

প্রতিটি প্রসেসের জন্য প্রিফেচ

ব্যবহারকারী আগে ক্যাশে করা অ্যাপ (UNFREEZE_REASON_ACTIVITY-এর কারণে আনফ্রোজেন) আবার চালু করলে, ActivityManager ব্যাকআপ স্টোরেজ থেকে প্রধান পৃষ্ঠা সংক্রান্ত সমস্যার কারণে অ্যাপ স্টার্টআপ লেটেন্সি কম করে:

  1. CachedAppOptimizer আনফ্রিজ ইভেন্ট ইন্টারসেপ্ট করে এবং prefetchZram(app) ইনভোক করে।
  2. সিস্টেম সার্ভার mmd.asyncPrefetchProcessZramMemory(pfd) ব্যবহার করে Binder জুড়ে অ্যাপের pidfd ডিসপ্যাচ করে। mmd ioctl ZRAM_ANDROID_IOC_PROCESS_PREFETCH ইস্যু করে, যার মাধ্যমে কার্নেলকে নির্দেশ দেওয়া হয় যে অ্যাপের মূল UI থ্রেড ইনিশিয়ালাইজ করার সময় অ্যাসিঙ্ক্রোনাসভাবে সোয়াপ করা পৃষ্ঠাগুলি RAM-এ প্রিফেচ করতে হবে।

রক্ষণাবেক্ষণ ও পোস্ট-প্রসেসিং টাস্কের ওভারভিউ

এই বিভাগে ব্যাকগ্রাউন্ডে রক্ষণাবেক্ষণ অপারেশন ও পোস্ট-প্রসেসিং টাস্কের বিবরণ দেওয়া আছে যা mmd সোয়াপ স্পেস ও সিস্টেম মেমরি অপ্টিমাইজ করার জন্য রান করে।

mmd-তে রক্ষণাবেক্ষণ

mmd-এ, পরিচর্যা বলতে শিডিউল করা, ব্যাকগ্রাউন্ড পরিচর্যা সুইপকে বোঝায় যা অ্যাক্টিভ ব্যবহারকারীর ফোরগ্রাউন্ড পারফর্ম্যান্সকে প্রভাবিত না করেই সোয়াপ স্পেস ও ফিজিক্যাল মেমরি ইউটিলাইজেশন অপ্টিমাইজ করে। একটানা, সিনক্রোনাস সুইপ (যা CPU-এর গুরুতর ঘুম ভাঙানো এবং UI জ্যাঙ্ক ঘটায়) পারফর্ম করার পরিবর্তে, অ্যাসিঙ্ক্রোনাসভাবে রক্ষণাবেক্ষণ করা হয়:

  1. system_server Binder জুড়ে মাঝে মাঝে doZramMaintenanceAsync() ফায়ার করে।

  2. mmd ব্যাকগ্রাউন্ড ওয়ার্ক কোয়েরিতে অনুরোধটি রাখে LowPrioWorkItem::ZramMaintenance।

  3. mmd-এ একটিই ওয়ার্কার থ্রেড আছে যা বেশি-অগ্রাধিকারের সারি এবং কম-অগ্রাধিকারের সারি, দুটিই ম্যানেজ করে। উচ্চ অগ্রাধিকারযুক্ত ওয়ার্ক আইটেম (যেমন, প্রসেস-প্রতি প্রিফেচ) প্রথমে প্রসেস করা হয় এবং কম অগ্রাধিকারযুক্ত ওয়ার্ক আইটেমকে প্রিএম্প্ট করতে পারে। রক্ষণাবেক্ষণ এবং প্রসেস-প্রতি রাইটব্যাক কম-অগ্রাধিকারের কাজের আইটেম হিসেবে কাজ করে। পপ-আপ হলে, ওয়ার্কার থ্রেড দুটি প্রাথমিক রক্ষণাবেক্ষণ অপারেশন পরপর এক্সিকিউট করে:

    • ZRAM রিকমপ্রেশন: আগে থেকে থাকা সোয়াপ পৃষ্ঠাগুলি স্ক্যান করে এবং উচ্চতর রেশিও সেকেন্ডারি কম্প্রেশন অ্যালগরিদম ব্যবহার করে অলস পৃষ্ঠাগুলি রিকমপ্রেস করে, যেমন, zstd।

    • ZRAM রাইটব্যাক: অলস পৃষ্ঠা স্ক্যান করে এবং /data-এ ফাইল থেকে লুপ ডিভাইস ফ্ল্যাশ স্টোরেজে ব্যাক-আপ নিতে RAM থেকে সম্পূর্ণভাবে সরিয়ে দেয়।

ZRAM-এ পোস্ট-প্রসেসিং টাস্ক

Linux kernel ZRAM মডিউল এবং mmd আর্কিটেকচারে, পোস্ট-প্রসেসিং টাস্ক হল অ্যাসিঙ্ক্রোনাস ট্রান্সফর্মেশন যা মেমরি পেজে পরে প্রয়োগ করা হয়, সেগুলি ইতিমধ্যেই কার্নেলের স্ট্যান্ডার্ড রিক্লেইম পাথ (kswapd বা কম্প্যাকশন) দ্বারা সোয়াপ আউট করা হয়েছে।

কোনও পৃষ্ঠা প্রথমবার সোয়াপ-আউট করা হলে, সিস্টেম স্পিডকে অগ্রাধিকার দেয়: এটি একটি দ্রুত প্রাথমিক কম্প্রেশন অ্যালগরিদম (যেমন lz4) ব্যবহার করে এবং RAM-এ কম্প্রেস করা পৃষ্ঠা স্টোর করে। তবে, সময়ের সাথে সাথে, অদল-বদল করা অনেক পৃষ্ঠা কোল্ড বা নিষ্ক্রিয় হয়ে যায়, যেমন, ব্যাকগ্রাউন্ডে ক্যাশে করা অ্যাপ যা কয়েক ঘণ্টা ধরে আবার চালু করা হয়নি। দ্রুত, হালকা-কম্প্রেস করা ZRAM-এ কোল্ড পেজ রেখে দেওয়া অদক্ষ।

পোস্ট-প্রসেসিং পাইপলাইন

mmd এইসব পৃষ্ঠা অপ্টিমাইজ করতে মাল্টি-স্টেজ পোস্ট-প্রসেসিং লাইফসাইকেল প্রয়োগ করে:

mmd-page-lifecycle

ছবি ৩. mmd পৃষ্ঠার লাইফসাইকেল।

  1. পর্যায় ১: প্রাথমিক সোয়াপ-আউট (দ্রুত কম্প্রেশন): kswapd বা অ্যাপ কমপ্যাকশনের মাধ্যমে প্রথমে মেমরি রিক্লেইম করা হয়। সাধারণত, এই প্রথম রিক্লেম lz4-এর মতো দ্রুত কম্প্রেশন অ্যালগরিদম ব্যবহার করে করা হয় এবং কন্টেন্ট RAM-এ স্টোর করা হয়।

  2. পর্যায় ২: নিষ্ক্রিয় চিহ্নিতকরণ (এজিং ও ট্র্যাকিং): mmd নিষ্ক্রিয় ট্র্যাকিং অ্যাক্সেস কার্নেল মেমরি ট্র্যাকিং (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) করে অথবা পৃষ্ঠা কতক্ষণ ধরে স্পর্শ করা হয়নি তা ট্র্যাক করতে এর সফ্টওয়্যার নিষ্ক্রিয় মার্কার ব্যবহার করে।

  3. স্টেজে ৩: পোস্ট-প্রসেসিং ১ - রিকম্প্রেশন (ইন-মেমরি রিক্লেমেশন): যেসব পৃষ্ঠা রিকম্প্রেশন আইডল এজে (min_idle_seconds থেকে max_idle_seconds) পৌঁছে যায়, সেগুলি রিকম্প্রেশন করা হয়। mmd লিখে /sys/block/zram0/recompress কার্নেলকে নির্দেশ দেয় যে lz4 পৃষ্ঠাটি ডিকম্প্রেস করে zstd ব্যবহার করে আবার কম্প্রেস করতে হবে। এটি ফ্ল্যাশ রাইট ওয়্যার না করেই ফিজিক্যাল RAM রিক্লেইম করে।

  4. ধাপ ৪: পোস্ট-প্রসেসিং ২ - রাইটব্যাক (ফ্ল্যাশ স্টোরেজে ইভিকশন): মেমরি প্রেশার চলতে থাকলে এবং পৃষ্ঠাগুলি রাইটব্যাক আইডল এজে (সাধারণত ২০ ঘণ্টা বা তার বেশি) পৌঁছালে, mmd রাইটব্যাক ট্রিগার করে। mmd লিখে /sys/block/zram0/idle এবং /sys/block/zram0/writeback থেকে কম্প্রেস করা পৃষ্ঠাটি RAM থেকে ব্যাক-আপ ফ্ল্যাশ স্টোরেজে সম্পূর্ণভাবে সরিয়ে দেয়।

ZRAM সেট-আপ কনফিগারেশন

mmd নিম্নলিখিত ZRAM সেট-আপ প্রপার্টি লোড ও প্রসেস করে:

প্রপার্টি ব্যবহার করুন ডিফল্ট
mmd.zram.enabled mmd ZRAM সেট-আপ চালু আছে কিনা। false
mmd.zram.num_devices কনফিগার করার জন্য ZRAM ডিভাইসের সংখ্যা। Nনম্বর-এর জন্য, সিস্টেম sys.boot_completed=1 সেট করার আগে zram<N-1>-এর মাধ্যমে ডিভাইস zram0 অবশ্যই উপস্থিত থাকতে হবে। প্রতিটি ZRAM ডিভাইস তালিকায় থাকা প্রপার্টি প্রতিটি ডিভাইস অনুযায়ী কনফিগার করা যেতে পারে। 1
mmd.zram.device_priority swapon-এ কল করার সময় পাস করার জন্য অগ্রাধিকারের ভ্যালু। সেট করা নেই
mmd.zram.comp_algorithm ZRAM কম্প্রেশন অ্যালগরিদম। উল্লেখ করা না থাকলে, কার্নেলের ডিফল্ট কম্প্রেশন অ্যালগরিদম ব্যবহার করা হয়। সেট করা নেই
mmd.zram.size ZRAM ডিভাইসের সাইজ বাইটে, অথবা ডিভাইসের RAM সাইজের শতাংশ, যেমন, 75%। 50%
mmd.zram.writeback.enabled ZRAM রাইটব্যাক চালু করা হবে কিনা। false
mmd.zram.writeback.device_size রাইটব্যাক ডিভাইসের সাইজ বাইটে অথবা ডেটা পার্টিশনের শতাংশ হিসেবে। ডেটা পার্টিশনে উপলভ্য স্পেসের উপর ভিত্তি করে ডিভাইসের আসল সাইজ অ্যাডজাস্ট করা যেতে পারে। 1073741824 (১ GiB)
mmd.zram.writeback.min_free_space_mib রাইটব্যাক ডিভাইস সেট-আপ করার পরে MiB-তে ন্যূনতম ফ্রি স্পেস উপলভ্য থাকতে হবে। 1536 (১.৫ GiB)
mmd.zram.writeback.use_nr_tags_prop true, mmd.zram.writeback.nr_tags-এর ভ্যালু ব্যবহার করে লুপ ডিভাইস ব্যাক করার ZRAM রাইটব্যাকের কিউ ডেপথ কনফিগার করে। এটি এমন পরিস্থিতির জন্য একটি বিকল্প সমাধান, যেখানে mmd-কে ব্লক ডিভাইস ব্যাক-এন্ড /data-এর nr_tags সরাসরি রিড করার অনুমতি দেওয়ার জন্য ভেন্ডর SELinux নীতি কনফিগার করা যায় না। false
mmd.zram.writeback.nr_tags mmd.zram.writeback.use_nr_tags_prop দেখুন। সেট করা নেই
mmd.zram.recompression.enabled ZRAM রিকম্প্রেশন ফিচার চালু করা হবে কিনা। false
mmd.zram.recompression.algorithm সেকেন্ডারি ZRAM রিকম্প্রেশন অ্যালগরিদম। zstd

প্রতি ZRAM ডিভাইস প্রপার্টি

mmd.zram.num_devices-এর মান একের বেশি হলে, প্রতিটি ZRAM ডিভাইসের জন্য নির্দিষ্ট প্রপার্টি ঐচ্ছিকভাবে কনফিগার করা যেতে পারে। এর জন্য প্রপার্টিতে mmd.zram.num_devices এলিমেন্ট সহ কমা-সেপারেটেড ভ্যালু সেট করতে হবে। এইসব প্রপার্টির মধ্যে রয়েছে:

  • mmd.zram.size
  • mmd.zram.comp_algorithm
  • mmd.zram.device_priority
  • mmd.zram.recompression.enabled
  • mmd.zram.recompression.huge_idle.enabled
  • mmd.zram.recompression.idle.enabled
  • mmd.zram.recompression.huge.enabled
  • mmd.zram.recompression.threshold_bytes
  • mmd.zram.recompression.algorithm
  • mmd.zram.writeback.device_size
  • mmd.zram.writeback.huge_idle.enabled
  • mmd.zram.writeback.idle.enabled
  • mmd.zram.writeback.huge.enabled

আগে থেকে থাকা ZRAM সেট-আপ বন্ধ করা

ZRAM ও ডিস্ক-ভিত্তিক সোয়াপ স্পেস সেট-আপ করার জন্য swapon_all এখনও Android-এ উপলভ্য থাকলেও, ZRAM ম্যানেজমেন্টের জন্য mmd হল পছন্দের পদ্ধতি, কারণ এটি সহজ কনফিগারেশন ও ZRAM রিকমপ্রেশনের মতো উন্নত ফিচার প্রদান করে।

mmd.zram.enabled-এর মাধ্যমে mmd ZRAM সেট-আপ চালু করা হলে:

  • swapon_all-এ ZRAM সেট-আপ প্রয়োগ করা হলে তা কোনও কাজ করে না।
  • ওভারলে config.xml ফাইল এবং ro.zram.* রাইটব্যাক সিস্টেম প্রপার্টিতে config_zramWriteback-এর মতো আগে থেকে থাকা ZRAM কনফিগারেশন উপেক্ষা করা হয়।

ZRAM রক্ষণাবেক্ষণ টিউন করার সুবিধা

ZRAM রক্ষণাবেক্ষণ বক্সের বাইরে কাজ করা উচিত এবং আপনি এই বিভাগে সিস্টেম প্রপার্টি ব্যবহার করে এটিকে আরও ফাইন টিউন করতে পারেন।

ZRAM রক্ষণাবেক্ষণ শিডিউলিং

এইসব প্রপার্টি নিয়ন্ত্রণ করে যে কীভাবে এবং কখন ZRAM রক্ষণাবেক্ষণের টাস্ক system_server-এর মাধ্যমে শিডিউল করা হয়।

প্রপার্টি ব্যবহার করুন ডিফল্ট
mm.zram.maintenance.first_delay_seconds প্রথম ZRAM রক্ষণাবেক্ষণ শুরু করার আগে বিলম্ব। 3600 (১ ঘণ্টা)
mm.zram.maintenance.periodic_delay_seconds পরপর ZRAM রক্ষণাবেক্ষণ শিডিউল করার মধ্যে দেরি। 3600 (১ ঘণ্টা)
mm.zram.maintenance.require_device_idle ডিভাইস অলস থাকলে তবেই ZRAM রক্ষণাবেক্ষণ শুরু করা হবে কিনা। true
mm.zram.maintenance.require_battery_not_low ZRAM রক্ষণাবেক্ষণ শুরু করার আগে ব্যাটারি কম না থাকলেই চলবে কিনা। true

ZRAM রাইটব্যাক নীতি

ব্যাক-আপ ডিভাইসে কখন এবং কী ধরনের মেমরি লেখা হবে তা নিম্নলিখিত প্যারামিটারগুলি নিয়ন্ত্রণ করে:

প্রপার্টি ব্যবহার করুন ডিফল্ট
mmd.zram.writeback.backoff_seconds শেষ রাইটব্যাক অপারেশনের পর থেকে ব্যাকঅফ টাইম। 600 (১০ মিনিট)
mmd.zram.writeback.min_idle_seconds মেমরি ব্যবহারের ভগ্নাংশের উপর ভিত্তি করে রাইটব্যাকের জন্য উপযুক্ত কোনও পৃষ্ঠার আইডল এজ গণনা করতে mmd.zram.writeback.max_idle_seconds-এর সাথে একত্রিত করা হয়েছে। মেমরির চাপ না থাকলে কাজ কমানোর জন্য দুটি প্যারামিটারের মধ্যে গণনা করা আইডল এজ এক্সপোনেনশিয়ালি ইন্টারপোলেট করা হয়। 72000 (২০ ঘণ্টা)
mmd.zram.writeback.max_idle_seconds মেমরি ব্যবহারের উপর ভিত্তি করে ডাইনামিকভাবে নিষ্ক্রিয় পেজের বয়স গণনা করার জন্য ব্যবহৃত সর্বাধিক সেকেন্ড। 90000 (২৫ ঘণ্টা)
mmd.zram.writeback.huge.enabled HUGE পৃষ্ঠা রাইটব্যাক চালু করা হবে কিনা। false
mmd.zram.writeback.idle.enabled IDLE পৃষ্ঠা রাইটব্যাক চালু করা হবে কিনা। true
mmd.zram.writeback.huge_idle.enabled HUGE_IDLE পৃষ্ঠা রাইটব্যাক চালু করা হবে কিনা। true
mmd.zram.writeback.min_bytes আইডল রাইটব্যাকের এক রাউন্ডে রাইটব্যাক করার জন্য ন্যূনতম বাইট। 5242880 (৫ MiB)
mmd.zram.writeback.max_bytes আইডল রাইটব্যাকের এক রাউন্ডে রাইটব্যাক করার জন্য সর্বাধিক বাইট। 314572800 (৩০০ MiB)
mmd.zram.writeback.max_bytes_per_day ২৪-ঘণ্টার মধ্যে সর্বাধিক কত বাইট লেখা যাবে। 25769803776 (২৪ GiB)
mmd.zram.writeback.limit.enabled দৈনিক রাইটব্যাক বাজেট সীমা অ্যাকাউন্টিং চালু করা হবে কিনা। true

ZRAM রিকমপ্রেশন নীতি

নিম্নলিখিত প্যারামিটারগুলি কখন এবং কোন ধরনের মেমরি রিকম্প্রেস করা হবে তা নিয়ন্ত্রণ করে:

প্রপার্টি ব্যবহার করুন ডিফল্ট
mmd.zram.recompression.backoff_seconds শেষবার আবার কমপ্রেস করার পর থেকে ব্যাক-অফ টাইম। 1800 (৩০ মিনিট)
mmd.zram.recompression.min_idle_seconds mmd.zram.recompression.max_idle_seconds-এর সাথে মিলিয়ে মেমরি ইউটিলাইজেশন ফ্র্যাকশনের ভিত্তিতে আবার কম্প্রেশন করার উপযুক্ত হওয়ার জন্য কোনও পৃষ্ঠার আইডল বয়স গণনা করুন। মেমরির চাপ না থাকলে কাজ কমানোর জন্য দুটি প্যারামিটারের মধ্যে গণনা করা আইডল এজ এক্সপোনেনশিয়ালি ইন্টারপোলেট করা হয়। 7200 (২ ঘণ্টা)
mmd.zram.recompression.max_idle_seconds ডায়নামিক পদ্ধতিতে নিষ্ক্রিয় পৃষ্ঠার বয়স গণনা করার জন্য ব্যবহৃত সর্বাধিক সেকেন্ড। 14400 (৪ ঘণ্টা)
mmd.zram.recompression.threshold_bytes আবার কম্প্রেস করার জন্য বিবেচনা করা ZRAM পৃষ্ঠার বাইটে ন্যূনতম সাইজ। 1024 (১ KiB)
mmd.zram.recompression.huge.enabled HUGE পৃষ্ঠা আবার কম্প্রেশন চালু করা হবে কিনা। true
mmd.zram.recompression.idle.enabled IDLE পৃষ্ঠা আবার কম্প্রেশন চালু করা হবে কিনা। true
mmd.zram.recompression.huge_idle.enabled HUGE_IDLE পৃষ্ঠা আবার কম্প্রেশন চালু করা হবে কিনা। true

ZRAM আইডল পৃষ্ঠা ট্র্যাকিং

mmd ZRAM রক্ষণাবেক্ষণ, ZRAM পৃষ্ঠাগুলিকে কতদিন ধরে অ্যাক্সেস করা হয়নি তার উপর ভিত্তি করে সেগুলিকে নিষ্ক্রিয় হিসেবে চিহ্নিত করে। এই ফিচারের জন্য CONFIG_ZRAM_TRACK_ENTRY_ACTIME বা CONFIG_ZRAM_MEMORY_TRACKING কার্নেল কনফিগারেশন চালু করতে হবে। GKI কার্নেল 6.18 এবং তার পরবর্তী ভার্সনে CONFIG_ZRAM_TRACK_ENTRY_ACTIME ডিফল্ট হিসেবে চালু করা থাকে। আগের কার্নেলে, এতে মেমরি ওভারহেড আছে এবং এটি ডিফল্ট হিসেবে চালু করা থাকে না।

কার্নেল কনফিগারেশন চালু করা না থাকলে, mmd ZRAM রক্ষণাবেক্ষণ সফ্টওয়্যার সাবস্টিটিউট লজিক ব্যবহার করে অলস ZRAM পৃষ্ঠা ট্র্যাক করে:

  1. mmd শুরু হলে সব ZRAM পৃষ্ঠা নিষ্ক্রিয় হিসেবে চিহ্নিত করুন।

  2. প্রয়োজনীয় ব্যাক-অফ পিরিয়ড না পেরোনো পর্যন্ত পরবর্তী ZRAM রক্ষণাবেক্ষণ এড়িয়ে যান।

  3. ZRAM রাইটব্যাক বা অলস পৃষ্ঠা আবার কম্প্রেস করা। রাইটব্যাক সীমা থাকার কারণে যদি কিছু আইডল পৃষ্ঠা থেকে যায়, তাহলে mmd নতুন পৃষ্ঠাগুলিকে আইডল হিসেবে চিহ্নিত না করেই (৪ নম্বর ধাপ এড়িয়ে গিয়ে) পরবর্তী রক্ষণাবেক্ষণে পৃষ্ঠাগুলি রাইটব্যাক করা চালিয়ে যায়।

  4. সবকটি অলস পৃষ্ঠা আবার লেখা হয়ে গেলে, সবকটি ZRAM পৃষ্ঠাকে আবার অলস হিসেবে চিহ্নিত করুন এবং ধাপ ২-এ ফিরে যান। ZRAM রাইটব্যাক বন্ধ করা থাকলে, mmd ZRAM রিকমপ্রেশন হওয়ার পরে রিকমপ্রেশন আইডল সময়সীমা শেষ হলে সব ZRAM পেজকে আইডল হিসেবে চিহ্নিত করে।

সমস্যার সমাধান ও যাচাইকরণ সংক্রান্ত নির্দেশিকা

mmd এবং ZRAM অপারেশন যাচাই ও ডায়াগনসিস করতে, নিম্নলিখিত যাচাইকরণ ধাপ ও সমস্যা সমাধান পদ্ধতি ব্যবহার করুন।

ZRAM সেট-আপ যাচাই করা

বুট করার সময় mmd সফলভাবে ZRAM কনফিগার করেছে কিনা তা যাচাই করতে:

  1. অ্যাক্টিভ কম্প্রেশন অ্যালগরিদম ও ডিস্কের সাইজ চেক করুন:

    cat /sys/block/zram0/comp_algorithm
    cat /sys/block/zram0/disksize
    
  2. mmd সিস্টেম প্রপার্টি ও চালু থাকা পরিষেবার স্টেট যাচাই করুন:

    getprop | grep mmd.zram
    dumpsys -l | grep mmd
    

ZRAM রক্ষণাবেক্ষণ ও রাইটব্যাক যাচাই করুন

ZRAM রাইটব্যাক ও রিকমপ্রেশন রক্ষণাবেক্ষণ টাস্ক কাজ করছে কিনা তা যাচাই করুন:

  1. ব্যাকআপ ব্লক ডিভাইসের স্ট্যাটাস চেক করুন:

    cat /sys/block/zram0/bd_stat
    
  2. /sys/block/zram0/mm_stat মনিটর করে আবার কম্প্রেশন করার দক্ষতা চেক করুন। কম্প্রেস করা ডেটার সাইজে পরিবর্তন রক্ষণাবেক্ষণ চক্রের পরে দেখা যাবে।

প্রতিটি প্রসেস অনুযায়ী রাইটব্যাক যাচাই করা

প্রতি-প্রসেস রাইটব্যাক যে কাজ করছে তা যাচাই করতে নিম্নলিখিতগুলি ব্যবহার করা যেতে পারে:

  • সফল রাইটব্যাক লগ বা ব্যর্থতা ডায়াগনস্টিকসের জন্য adb logcat -s mmd চেক করুন।

সাধারণ সমস্যা ও ডায়াগনস্টিক

ব্যবহারকারী যেসব সাধারণ সমস্যার সম্মুখীন হতে পারেন সেগুলি নিচে উল্লেখ করা হল:

  • WritebackDailyLimitExceeded: এই সমস্যা থেকে বোঝা যায় যে mmd.zram.writeback.max_bytes_per_day কোটা শেষ হয়ে গেছে। এটি ঘটলে, mmd ২৪-ঘণ্টার রোলিং উইন্ডো এগিয়ে না যাওয়া পর্যন্ত আইডল রাইটব্যাক পজ করে।
  • Process prefetch or writeback failed: ioctl কাজ না করলে এই সমস্যাটি logcat-এ দেখা যেতে পারে। সাধারণত এই সব ক্ষেত্রে সেটি দেখানো হয়:
    • EBADF বা ESRCH: mmd কার্নেলে pidfd পাঠাতে পারার আগেই টার্গেট প্রসেস শেষ হয়ে গেছে।
    • ENOSPC: ব্যাক-আপ স্টোরেজ পার্টিশন ভর্তি হয়ে গেছে অথবা লুপ ডিভাইস কিউ শেষ হয়ে গেছে।
  • ZRAM সেট-আপ করা হয়নি: বুট করার সময় mmd যদি ZRAM কনফিগার করতে না পারে, তাহলে হতে পারে যে mmd এক্সিকিউট করার আগে /dev/block/zram0-কে লিগ্যাসি swapon_all বা ভেন্ডর ইনিট স্ক্রিপ্ট লক করে দিয়েছে।