মেমরি লিমিটার

অ্যান্ড্রয়েড ১৭ এবং এর পরবর্তী সংস্করণগুলো মেমরি লিমিটার সমর্থন করে, যা একটি সিস্টেম সার্ভিস। এটি লিনাক্স সিগ্রুপ ভি২ (Linux cgroup v2) ব্যবহার করে অ্যাপ্লিকেশন প্রসেসগুলোর মেমরি ব্যবহার পর্যবেক্ষণ ও সীমিত করে। মেমরি লিমিটার কোনো নির্দিষ্ট অ্যাপকে অতিরিক্ত সিস্টেম মেমরি ব্যবহার করা থেকে বিরত রাখে, যা সিস্টেম-ব্যাপী মেমরির চাপ কমায় এবং গুরুত্বপূর্ণ প্রসেসগুলোকে মেমরি শেষ হয়ে যাওয়ার (OOM) কারণে হঠাৎ বন্ধ হয়ে যাওয়া থেকে রক্ষা করে।

প্রক্রিয়া

মেমরি লিমিটার প্রসেস লাইফসাইকেল ইভেন্ট এবং অবস্থার পরিবর্তন ট্র্যাক করার জন্য অ্যাক্টিভিটি ম্যানেজার সার্ভিস (AMS)-এর সাথে সমন্বিতভাবে কাজ করে। মেমরি লিমিটার লিনাক্স কার্নেলের cgroup v2 ফাইল সিস্টেম ব্যবহার করে মেমরির সীমা প্রয়োগ করে।

মেমরি লিমিটার ব্যবহার করার জন্য, ডিভাইস কার্নেলকে অবশ্যই সিগ্রুপ ভি২ (cgroup v2) এবং memory কন্ট্রোলার সমর্থন করতে হবে। এই পরিষেবাটি বিশেষভাবে নিম্নলিখিত অ্যাট্রিবিউটগুলোর উপর নির্ভর করে:

memory.high
একটি নমনীয় সীমা। এটি অতিক্রম করলে, প্রসেসটির গতি কমিয়ে দেওয়া হয় এবং কার্নেল এর থেকে মেমরি পুনরুদ্ধার করার চেষ্টা করে।
memory.swap.max
প্রসেসটি যে পরিমাণ সোয়াপ স্পেস ব্যবহার করতে পারে, তা সীমিত করে।

অ্যাপের উপর প্রভাব

যেসব অ্যাপ তাদের মেমোরির সীমা অতিক্রম করে না, সেগুলো মেমোরি লিমিটার দ্বারা প্রভাবিত হয় না।

যখন কোনো অ্যাপ তার memory.high সীমা অতিক্রম করে, তখন অ্যাপটিকে সীমার মধ্যে রাখার জন্য কার্নেল অ্যাপটির ফাইল-ব্যাকড মেমরি সরিয়ে দেয় এবং এর অ্যানোনিমাস মেমরি সোয়াপ আউট করে। এই অপসারণ এবং সোয়াপের ফলে অ্যাপটি ধীরগতিতে চলতে পারে।

চরম ক্ষেত্রে, যদি অ্যাপটি ক্রমাগত অ্যানোনিমাস মেমরি বরাদ্দ করতে থাকে এবং ডিভাইসের সোয়াপ স্পেস শেষ হয়ে যায়, তাহলে অ্যাপটি মেমরি বরাদ্দ করতে ব্যর্থ হতে পারে এবং ফলস্বরূপ ক্র্যাশ করার সম্ভাবনা থাকে।

প্রক্রিয়া পর্যবেক্ষণ

মেমরি লিমিটার ডিফল্টরূপে অ্যাপ প্রসেসগুলোকে (UID >= 10000) মনিটর করে। কোর সিস্টেমের স্থিতিশীলতা যাচাই করার সুবিধার্থে সিস্টেম প্রসেসগুলোকে সাধারণত এর আওতামুক্ত রাখা হয়।

মেমরি লিমিটার প্রসেসের অবস্থার উপর ভিত্তি করে মেমরির সীমা নির্ধারণ করে:

  • দৃশ্যমান প্রসেসগুলো ব্যবহারকারীর কাছে বোধগম্য হয়, যেমন ফোরগ্রাউন্ড অ্যাক্টিভিটি, ফোরগ্রাউন্ড সার্ভিস বা অন্যান্য জ্যাঙ্ক-বোধগম্য অবস্থা।

  • অদৃশ্য প্রসেস হলো এমন ব্যাকগ্রাউন্ড প্রসেস যা ব্যবহারকারীর সাথে কোনো মিথস্ক্রিয়া করে না বা ব্যবহারকারীর কাছে দৃশ্যমান নয়।

নিম্নলিখিত সারণীটি নির্দিষ্ট প্রসেস অবস্থাগুলোকে মেমরি সীমার সাথে সংযুক্ত করে:

প্রক্রিয়া অবস্থা মেমরি সীমা
PERSISTENT অবাধ
PERSISTENT_UI অবাধ
TOP দৃশ্যমান
BOUND_TOP দৃশ্যমান
FOREGROUND_SERVICE দৃশ্যমান নয়
BOUND_FOREGROUND_SERVICE দৃশ্যমান নয়
IMPORTANT_FOREGROUND দৃশ্যমান
IMPORTANT_BACKGROUND দৃশ্যমান নয়
TRANSIENT_BACKGROUND দৃশ্যমান নয়
BACKUP দৃশ্যমান নয়
SERVICE দৃশ্যমান নয়
RECEIVER দৃশ্যমান নয়
TOP_SLEEPING দৃশ্যমান
HEAVY_WEIGHT দৃশ্যমান নয়
HOME দৃশ্যমান নয়
LAST_ACTIVITY দৃশ্যমান নয়
CACHED_ACTIVITY ক্যাশ করা হয়েছে
CACHED_ACTIVITY_CLIENT ক্যাশ করা হয়েছে
CACHED_RECENT ক্যাশ করা হয়েছে
CACHED_EMPTY ক্যাশ করা হয়েছে

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

যখন কোনো প্রসেস তার জন্য নির্ধারিত memory.high সীমা অতিক্রম করে, তখন মেমরি লিমিটার ঘটনাটি শনাক্ত করে এবং ডিবাগিং কার্যক্রম শুরু করতে পারে, যেমন মেমরি প্রোফাইল ক্যাপচার করা বা statsd এ কোনো অস্বাভাবিকতা লগ করা।

কনফিগারেশন

vendor পার্টিশনে অবস্থিত একটি XML ফাইল ব্যবহার করে মেমরি লিমিটারটি কনফিগার করুন। এই কনফিগারেশন আপনাকে ডিভাইসের নির্দিষ্ট মেমরি সীমাবদ্ধতার উপর ভিত্তি করে পরম মেমরি সীমা নির্ধারণ করতে দেয়।

  • ফাইলের পথ: /vendor/etc/memory-limiter-config.xml

  • ডিফল্ট কনফিগারেশন: যদি কনফিগারেশন ফাইলটি খুঁজে না পাওয়া যায়, অথবা যদি এটি অপাঠ্য বা অবৈধ হয়, তাহলে মেমরি লিমিটার নিষ্ক্রিয় থাকে।

XML ফরম্যাট

কনফিগারেশন ফাইলটি memory-limiter-config.xsd এ সংজ্ঞায়িত স্কিমা অনুসরণ করে। এই ফাইলটি আপনাকে একাধিক লিমিট সেট নির্ধারণ করার সুযোগ দেয়; সার্ভিসটি ডিভাইসের উপলব্ধ র‍্যামের উপর ভিত্তি করে সেরা মিলটি বেছে নেয়। সমস্ত মেমরি ভ্যালু মেবিবাইট (MiB) এককে সংজ্ঞায়িত করা হয়।

<MemoryLimiterConfig>
  <version>1</version>
  <configList>
    <limitSet>
      <!-- Limits for a phone with at least 14G of ram: 8G/4G/4G/4G -->
      <minimumRequiredMemTotal>14336</minimumRequiredMemTotal>
      <memVisible>8192</memVisible>
      <memNotVisible>4096</memNotVisible>
      <swapVisible>4096</swapVisible>
      <swapNotVisible>4096</swapNotVisible>
    </limitSet>
  </configList>
</MemoryLimiterConfig>
version
কনফিগারেশন সংস্করণ শনাক্তকারী একটি ধনাত্মক পূর্ণসংখ্যা। এটি অবশ্যই ১ হতে হবে।
minimumRequiredMemTotal
এই সীমা নির্ধারণটি বৈধ হওয়ার জন্য ন্যূনতম প্রয়োজনীয় সিস্টেম মেমরি।
memVisible
মেমরি সীমা ( memory.high ) দৃশ্যমান প্রসেসগুলোর জন্য অনুমতি দিয়েছে।
memNotVisible
মেমোরি লিমিটের ( memory.high ) কারণে প্রসেসগুলো দৃশ্যমান ছিল না।
swapVisible
দৃশ্যমান প্রসেসগুলোর জন্য অনুমোদিত সোয়াপ সীমা ( memory.swap.max )।
swapNotVisible
সোয়াপ সীমা ( memory.swap.max ) অদৃশ্য প্রসেসগুলোর জন্য অনুমোদিত ছিল।

কনফিগারেশন পরিবর্তন করুন

সিস্টেম-ব্যাপী সীমা পরিবর্তন করতে, এই ধাপগুলো অনুসরণ করুন:

  1. /vendor/etc/memory-limiter-config.xml পরিবর্তন করুন।
  2. পরিবর্তনগুলি কার্যকর করার জন্য ডিভাইসটি রিবুট করুন অথবা system_server রিস্টার্ট করুন।

শেল কমান্ড

am memory-limiter কমান্ডটি আপনাকে এবং ডেভেলপারদেরকে ডেভেলপমেন্ট ও টেস্টিংয়ের জন্য রান টাইমে সার্ভিসটির সাথে ইন্টারঅ্যাক্ট করার সুযোগ দেয়:

am memory-limiter <SUB-COMMAND>

অবস্থা

status সাব-কমান্ডটি মেমরি লিমিটারের কার্যক্ষম অবস্থা প্রতিবেদন করে:

adb shell am memory-limiter status

উদাহরণ আউটপুট:

Memory limiter
  enabled                  monitoring=true          ignored=none
  visibleMem=1948MB        visibleSwap=974MB
  notVisibleMem=974MB      notVisibleSwap=487MB
  started=36               watched=36               watch-failed=0
  events=0                 processes=36             process-hwm=36

আউটপুটের প্রধান ফিল্ডগুলো হলো:

monitoring
লিমিটারটি সক্রিয়ভাবে প্রসেসগুলো পর্যবেক্ষণ করছে কিনা তা নির্দেশ করে।
visibleMem এবং notVisibleMem
প্রতিটি স্টেটের জন্য গণনাকৃত পরম মেমরি সীমা নির্দেশ করুন।
events
একটি প্রক্রিয়া যতবার তার সীমা অতিক্রম করেছে তার সংখ্যা।
processes
পর্যবেক্ষণাধীন প্রসেসগুলোর সংখ্যা।

উপেক্ষা করুন

' ignore ' সাব-কমান্ডটি সাময়িকভাবে একটি UID বা সমস্ত প্রসেসকে সীমাবদ্ধতার আওতা থেকে বাদ দেয়। এই পদক্ষেপটি পারফরম্যান্স পরীক্ষার জন্য অথবা কোনো নির্দিষ্ট অ্যাপকে তার সীমা অতিক্রম করার অনুমতি দেওয়ার ক্ষেত্রে উপযোগী।

adb shell am memory-limiter ignore 10087  // Ignore a specific UID
adb shell am memory-limiter ignore all    // Ignore all processes (effectively disables limiting)
adb shell am memory-limiter ignore none   // Resume normal operation

ম্যানুয়াল

manual সাব-কমান্ডটি একটি নির্দিষ্ট প্রসেসের (প্রসেস আইডি বা পিআইডি দ্বারা) জন্য গণনাকৃত সীমাগুলোকে মেগাবাইটে (MB) একটি কাস্টম পরম মান দ্বারা ওভাররাইড করে:

adb shell am memory-limiter manual 1234 1024   // Set a 1024 MB limit for PID 1234
adb shell am memory-limiter manual 1234 none // Remove the manual override for PID 1234

ম্যানুয়াল ওভাররাইড শুধুমাত্র প্রসেসের জীবনচক্রের ক্ষেত্রে প্রযোজ্য। প্রসেসটি পুনরায় চালু হলে, এটি তার অবস্থার উপর ভিত্তি করে ডিফল্ট সীমাতে ফিরে আসে।