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

অ্যান্ড্রয়েড ১৭ এবং এর পরবর্তী সংস্করণগুলো মেমরি ম্যানেজমেন্ট ডেমন ( mmd ) সমর্থন করে, যা একটি সিস্টেম ডেমন এবং এটি ডেমন কনফিগারেশন, টিউনেবলস, এবং চলমান সোয়াপ বা ZRAM রক্ষণাবেক্ষণের কাজগুলো পরিচালনা করে।

পটভূমি

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

স্থাপত্য এবং ZRAM ব্যবস্থাপনা

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

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

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

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

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

ActivityManagerService com.android.server.memory.ZramMaintenance ব্যবহার করে বৈশ্বিক ZRAM রক্ষণাবেক্ষণ পরিচালনা করে।

zram-maintenance

চিত্র ১. ZRAM রক্ষণাবেক্ষণ সময়সূচি প্রণয়ন প্রবাহ।

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

প্রতি-প্রক্রিয়া রাইটব্যাক

ActivityManagerService com.android.server.am.CachedAppOptimizer ব্যবহার করে প্রতিটি প্রসেসের জন্য নির্দিষ্ট মেমরি অপসারণ পরিচালনা করে।

mmd-writeback

চিত্র ২. এমএমডি প্রতি-প্রক্রিয়া রাইটব্যাক প্রবাহ।

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

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

প্রতি-প্রক্রিয়া প্রিফেচ

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

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

রক্ষণাবেক্ষণ এবং পরবর্তী প্রক্রিয়াকরণের কাজগুলির সংক্ষিপ্ত বিবরণ

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

এমএমডি-তে রক্ষণাবেক্ষণ

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

  1. system_server পর্যায়ক্রমে Binder জুড়ে doZramMaintenanceAsync() ফাংশনটি চালু করে।

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

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

    • ZRAM পুনঃসংকোচন: এটি বিদ্যমান সোয়াপ পেজগুলো পরীক্ষা করে এবং zstd মতো একটি উচ্চ-অনুপাতের দ্বিতীয় কম্প্রেশন অ্যালগরিদম ব্যবহার করে নিষ্ক্রিয় পেজগুলোকে পুনরায় সংকুচিত করে।

    • ZRAM রাইটব্যাক: নিষ্ক্রিয় পেজগুলো স্ক্যান করে এবং সেগুলোকে /data তে থাকা একটি ফাইল থেকে লুপ ডিভাইসের মাধ্যমে র‍্যাম থেকে সম্পূর্ণরূপে ব্যাকএন্ড ফ্ল্যাশ স্টোরেজে স্থানান্তর করে।

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

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

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

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

mmd এই পৃষ্ঠাগুলিকে অপ্টিমাইজ করার জন্য একটি বহু-পর্যায়ের পোস্ট-প্রসেসিং জীবনচক্র প্রয়োগ করে:

mmd-page-lifecycle

চিত্র ৩. mmd পেজের জীবনচক্র।

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

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

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

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

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

mmd নিম্নলিখিত ZRAM সেটআপ বৈশিষ্ট্যগুলি লোড এবং প্রক্রিয়া করে:

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

যখন mmd.zram.enabled দ্বারা mmd ZRAM সেটআপ সক্রিয় করা হয়:

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

ZRAM রক্ষণাবেক্ষণ টিউনেবল

ZRAM রক্ষণাবেক্ষণ স্বয়ংক্রিয়ভাবে কাজ করার কথা, এবং আপনি এই বিভাগের সিস্টেম প্রোপার্টিজ ব্যবহার করে এটিকে আরও সূক্ষ্মভাবে সমন্বয় করতে পারেন।

ZRAM রক্ষণাবেক্ষণের সময়সূচী

এই প্রোপার্টিগুলো নিয়ন্ত্রণ করে যে system_server কখন এবং কীভাবে ZRAM রক্ষণাবেক্ষণের কাজগুলো নির্ধারণ করবে।

সম্পত্তি ব্যবহার ডিফল্ট
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 (৫ এমআইবি)
mmd.zram.writeback.max_bytes এক রাউন্ড নিষ্ক্রিয় রাইটব্যাকে সর্বাধিক যত বাইট লেখা হবে। 314572800 (৩০০ এমআইবি)
mmd.zram.writeback.max_bytes_per_day ২৪ ঘন্টার মধ্যে সর্বাধিক যত বাইট ফেরত লেখা যাবে। 25769803776 (২৪ জিবি)
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 (১ কিলোবাইট)
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 রাইটব্যাক নিষ্ক্রিয় থাকে, তাহলে পুনঃসংকোচনের নিষ্ক্রিয় সময়কাল শেষ হওয়ার পরে যখন ZRAM পুনঃসংকোচন ঘটে, তখন mmd সমস্ত 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 কার্যকর হওয়ার আগেই লিগ্যাসি swapon_all বা ভেন্ডর ইনিট স্ক্রিপ্টগুলো /dev/block/zram0 ফাইলটিকে লক করে দিয়েছে।