kswapd ও lmkd ইন্টার‍্যাকশন

এই পৃষ্ঠায় Android-এ kswapd ও lmkd-এর মধ্যে ইন্টার‍্যাকশন সম্পর্কে বলা হয়েছে, মেমরি প্রেসার ম্যানেজ করতে তারা কীভাবে একসাথে কাজ করে তা দেখানো হয়েছে।

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

সিস্টেমে মেমোরি কম থাকলে, মেমোরি রিক্লেম করার জন্য Android দুটি প্রাথমিক মেকানিজম ব্যবহার করে:

  1. kswapd: একটি স্ট্যান্ডার্ড Linux কার্নেল ডেমন যা ক্লিন ফাইল-ব্যাকড পৃষ্ঠাগুলি খালি করে বা ZRAM-এ বেনামী পৃষ্ঠাগুলি অদলবদল করে পৃষ্ঠাগুলি পুনরুদ্ধার করে।
  2. lmkd: Android-এর ইউজারস্পেস লো মেমরি কিলার ডেমন। kswapd মেমরির চাহিদা পূরণ করতে না পারলে এবং সিস্টেমের উপর চাপ বাড়লে (PSI-এর মাধ্যমে সিগন্যাল দেওয়া হয়), lmkd মেমরির বড় অংশ খালি করার জন্য প্রসেস বন্ধ করার পদক্ষেপ নেয়।

kswapd এবং lmkd হল দুটি পরিপূরক মেমরি রিক্লেম সিস্টেম। তারা একই লক্ষ্য (ফ্রি মেমরি তৈরি করা) অর্জন করতে কাজ করে তবে বিভিন্ন উপায়ে। তুলনা ও পার্থক্য করতে:

  • রিকভার করা যায় বনাম ধ্বংসাত্মক: kswapd মেমরি পেজ ড্রপ করে যা স্টোরেজ থেকে আবার পড়া যায় অথবা মেমরি পেজ অন্য মেমরি পার্টিশন বা স্টোরেজে সোয়্যাপ করে যা প্রয়োজন হলে আবার পড়া যায়। lmkd প্রসেস বন্ধ করে দেয়, যা নন-ভোলাটাইল স্টেট নষ্ট করে।
  • ব্যান্ডউইথ রিক্লেম করা: kswapd, lmkd-এর তুলনায় ফ্রি মেমরির নির্দিষ্ট পরিমাণ রিক্লেম করতে আরও বেশি সিপিইউ ব্যবহার করে এবং এই মেমরি রিক্লেম করতে আরও বেশি সময় নেয়। lmkd অল্প সময়ের জন্য তুলনামূলকভাবে কম প্রচেষ্টায় অনেক বেশি মেমরি রিক্লেম করতে পারে। মনে রাখবেন যে মোবাইল ডিভাইসে, CPU-এর প্রচেষ্টা শুধু লেটেন্সি নয়, ব্যাটারির পাওয়ারও খরচ করে।

OOM স্কোর বাকেট

ব্যবহারকারীর কাছে কতটা গুরুত্বপূর্ণ তার উপর ভিত্তি করে Android প্রসেসগুলিতে আউট-অফ-মেমরি (OOM) স্কোর অ্যাডজাস্টমেন্ট (oom_score_adj) অ্যাসাইন করে। বেশি স্কোর থাকা প্রসেস প্রথমে বন্ধ করা হয়।

সাধারণ বাকেটের মধ্যে এগুলি পড়ে:

  • ক্যাশে করা (স্কোর >= ৯০০): বর্তমানে প্রয়োজন নেই এমন প্রসেস, দ্রুত রিস্টার্ট করার জন্য রাখা হয়েছে।
  • পরিষেবা (স্কোর ৫০০): হোস্টিং শুরু করা পরিষেবা প্রসেস করে।
  • ফোরগ্রাউন্ড সার্ভিস (স্কোর ২০০): ফোরগ্রাউন্ড সার্ভিস হোস্ট করার প্রসেস।
  • ফোরগ্রাউন্ড (স্কোর ০): ব্যবহারকারী বর্তমানে যে অ্যাপের সাথে ইন্টার‍্যাক্ট করছেন।

আরও বিশদে জানুন: PSI ও LMKD ট্রিগার করা

PSI কী?

প্রেসার স্টল ইনফরমেশন (PSI) হল Linux কার্নেল ফিচার যা রিসোর্সের ঘাটতি পরিমাপ করার জন্য একটি ক্যানোনিকাল উপায় প্রদান করে। CPU, মেমরি ও I/O-এর ঘাটতির কারণে টাস্ক সম্পূর্ণ করতে কতটা দেরি হয়েছে তা এটি ট্র্যাক করে।

মেমরি PSI: "কিছু" বনাম "সম্পূর্ণ"

মেমরি PSI বিশেষভাবে মেমরির ঘাটতির কারণে হওয়া বিলম্ব ট্র্যাক করে (যেমন, পৃষ্ঠা রিক্লেম বা রিফল্টের জন্য অপেক্ষা করা)। এটি দুটি মেট্রিক প্রদান করে:

  • some: সময়ের শতাংশ যার মধ্যে অন্তত একটি টাস্ক মেমরিতে স্টল করা হয়েছে। এটি থেকে বোঝা যায় যে মেমোরি কম থাকার কারণে পারফর্ম্যান্স প্রভাবিত হচ্ছে, তবে কিছু কাজ এখনও চলছে।
  • full: সময়ের শতকরা হার যার মধ্যে সব নন-আইডল টাস্ক একসাথে স্টল করা হয়েছে। এটি এমন একটি জটিল অবস্থা নির্দেশ করে যেখানে সিস্টেমটি মেমরির জন্য অপেক্ষা করার কারণে সম্পূর্ণভাবে ব্লক হয়ে যায়।

PSI কীভাবে LMKD ট্রিগার করে

PSI থ্রেশহোল্ড অতিক্রম করলে (/proc/pressure/memory মনিটর করার মাধ্যমে) বিজ্ঞপ্তি পেতে ইউজারস্পেস lmkd ডেমন কার্নেলের সাথে রেজিস্টার করে। সিস্টেম যখন হাই মেমরি প্রেসার অনুভব করে (যেমন, কনফিগার করা সময়সীমার বেশি full স্টল), কার্নেল lmkd-কে জাগিয়ে তোলে। lmkd তারপর সিস্টেমের অবস্থা মূল্যায়ন করে এবং OOM স্কোর এবং সাইজের উপর ভিত্তি করে প্রসেস বন্ধ করা হবে কিনা এবং কোনগুলি বন্ধ করা হবে তা সিদ্ধান্ত নেয়।

LMKD টিউনিং

সিস্টেম প্রপার্টি ব্যবহার করে LMKD-এর আচরণ টিউন করা যেতে পারে।

ডিভাইসে টিউনিং ভ্যালু খোঁজা হচ্ছে

আপনি কানেক্ট করা ডিভাইসে বর্তমান LMKD টিউনিং ভ্যালু খুঁজে পেতে পারেন, এটি রান করে:

adb shell getprop | grep lmk

সাধারণ LMKD প্রপার্টি

LMKD টিউন করার জন্য ব্যবহৃত কিছু মূল প্রপার্টি এখানে দেওয়া হল (সম্পূর্ণ তালিকার জন্য Android ডকুমেন্টেশন দেখুন):

  • ro.lmk.use_psi: মেমরি প্রেসার শনাক্তকরণের জন্য PSI মনিটর ব্যবহার করতে true-এ সেট করুন (Android 10+ ভার্সনে ডিফল্ট)।
  • ro.lmk.psi_partial_stall_ms: some (আংশিক) স্টল মিলিসেকেন্ডে সময়কাল একটি কিল ট্রিগার করতে (সাধারণ ডিভাইসে ডিফল্ট ৭০ms, কম-র‍্যাম ডিভাইসে ২০০ms)।
  • ro.lmk.psi_complete_stall_ms: কিল ট্রিগার করার জন্য মিলি সেকেন্ডে full স্টল সময়সীমার থ্রেশহোল্ড (ডিফল্ট ৭০০ মিলি সেকেন্ড)।
  • ro.lmk.kill_heaviest_task: true হলে, LMKD একই OOM বাকেটে থাকা ক্যান্ডিডেটদের মধ্যে সবচেয়ে বেশি মেমরি ব্যবহার করা প্রসেস বন্ধ করে দেয়।

টেস্ট ডিভাইসে (Google Pixel 8 Pro) প্রাসঙ্গিক টিউনিং ভ্যালু

(মনে রাখবেন: Android 15-এ চলা হাই-এন্ড ডিভাইসের জন্য সাধারণ ডিফল্ট)

  • ro.lmk.use_psi: true
  • ro.lmk.psi_partial_stall_ms: 70 (স্বাভাবিক)
  • ro.lmk.psi_complete_stall_ms: 700 (স্বাভাবিক)
  • ro.lmk.kill_heaviest_task: true

ZRAM ও সোয়াপ যাচাইকরণ

ZRAM-এর ক্যাপাসিটি, কত দ্রুত সোয়াপ ভর্তি হয়ে যায় এবং LMKD কিল ট্রিগার করে, তার উপর গভীর প্রভাব ফেলে। আপনি এইসব কমান্ড ব্যবহার করে ডিভাইসে ZRAM এবং সোয়াপ স্ট্যাটাস চেক করতে পারবেন:

# Check ZRAM sizing and usage
adb shell free -m

# Check swap partition details
adb shell cat /proc/swaps

প্র্যাক্টিক্যাল এক্সারসাইজ: kswapd ও lmkd ট্রিগার করা

এই অনুশীলনে, আপনি KswapdLmkdLab স্যাম্পেল অ্যাপ ব্যবহার করে বিভিন্ন OOM বাকেটে প্রসেস তৈরি করবেন এবং তারপরে kswapd ও lmkd ট্রিগার করতে মূল প্রসেসে মেমরি ব্যবহার করবেন।

অ্যাপটি সাবপ্রসেস অটোমেটিক স্পন করতে এবং মেমরি বরাদ্দ করতে কনফিগার করা হয়েছে যাতে সেগুলি LMKD-এর জন্য আকর্ষণীয় টার্গেট হয়ে ওঠে।

১. সাবপ্রসেস তৈরি করুন

অ্যাপটি চালু হওয়ার পরে অটোমেটিক নিম্নলিখিত সাবপ্রসেস তৈরি করে:

  • ক্যাশে করা প্রসেস (oom_score_adj >= 900)
  • পরিষেবা প্রসেস (oom_score_adj 500)
  • ফোরগ্রাউন্ড সার্ভিস প্রসেস (oom_score_adj 200)

ADB ব্যবহার করে প্রসেস এবং সেগুলির OOM স্কোর যাচাই করুন:

adb shell dumpsys activity processes | grep com.android.kswapdlmkdlab

স্যাম্পেল আউটপুট স্নিপেট:

    Proc #  0: fg       T/A/TOP  LCMNFUATI  t: 0 18959:com.android.kswapdlmkdlab/u0a358 (top-activity)
    Proc #  1: prcp     b/ /FGS  -------TI  t: 0 19050:com.android.kswapdlmkdlab:foreground/u0a358 (fg-service)
    Proc #  2: svc      b/ /SVC  -------TI  t: 0 19077:com.android.kswapdlmkdlab:service/u0a358 (started-services)
    Proc #  3: cch      b/ /CACC -------TI  t: 0 19014:com.android.kswapdlmkdlab:cached/u0a358 (cch-client-act)

প্রসেস স্টেট অ্যাব্রিভিয়েশন এগুলির সাথে সম্পর্কিত:

  • fg: ফোরগ্রাউন্ড (OOM স্কোর ০)
  • prcp: অনুমেয় (ফোরগ্রাউন্ড সার্ভিস, OOM স্কোর ২০০)
  • svc: পরিষেবা শুরু হয়েছে (OOM স্কোর ৫০০)
  • cch: ক্যাশে করা প্রসেস (OOM স্কোর ৯০০)

২. মেমরি প্রেসার ট্রিগার করুন

অ্যাপটি মূল প্রসেসে অটোমেটিক মেমরি বরাদ্দ করা শুরু করবে। বেশি RAM-এর ডিভাইসে পরীক্ষা কার্যকর করতে, অ্যাপটি সাবপ্রসেসকেও নির্দেশ দেয় যাতে মেমরি বরাদ্দ করা যায় (যেমন, প্রতিটি ৫০০ এমবি) যাতে LMKD-এর জন্য সেগুলি আরও ভালো টার্গেট হয়।

সাবপ্রসেস বন্ধ করা মনিটর করুন

অ্যাপটি IBinder.linkToDeath মেকানিজম ব্যবহার করে এই সাবপ্রসেসগুলির মৃত্যু মনিটর করে:

  1. মূল প্রসেসটি bindService ব্যবহার করে টার্গেট প্রসেসের একটি পরিষেবার সাথে বাইন্ড করে।
  2. কানেকশন হওয়ার পরে, এটি পরিষেবাকে উপস্থাপনকারী IBinder অবজেক্ট পায়।
  3. এটি বাইন্ডারে linkToDeath কল করার মাধ্যমে IBinder.DeathRecipient ইমপ্লিমেন্টেশন রেজিস্টার করে।
  4. টার্গেট প্রসেস বন্ধ হয়ে গেলে (যেমন, LMKD-এর মাধ্যমে বন্ধ করা হলে), সিস্টেম binderDied() মেথড কল করে, যার ফলে অ্যাপটি অ্যাসিঙ্ক্রোনাসভাবে বন্ধ হওয়ার ঘটনা রেকর্ড করতে পারে।

এই বাইন্ডিং যাতে টার্গেট প্রসেসের অগ্রাধিকার বাড়াতে না পারে (যা এই অনুশীলনের উদ্দেশ্যকে ব্যর্থ করবে), তার জন্য অ্যাপটি Context.BIND_WAIVE_PRIORITY ফ্ল্যাগ ব্যবহার করে।

স্যাম্পেল অ্যাপের অ্যাকশন

Google Pixel 8 Pro-তে (যার মোট RAM প্রায় ১২ জিবি) টেস্ট রান সম্পূর্ণ হওয়ার পরে অ্যাপের স্ক্রিনশট এখানে দেওয়া হল।

টেস্ট রান সম্পূর্ণ হওয়ার পরে স্যাম্পেল অ্যাপের স্ক্রিনশট।
ছবি ১. Pixel 8 Pro-তে টেস্ট রান সম্পূর্ণ হওয়ার পরে স্যাম্পেল অ্যাপ।

Perfetto ট্রেস বিশ্লেষণ

ইন্টার‍্যাকশন ক্যাপচার করতে, শিডিউলিং, মেমরি কাউন্টার, LMK কিল ও প্রেসার স্টল ইনফরমেশন (PSI) ক্যাপচার করার জন্য নিম্নলিখিত Perfetto কনফিগারেশন ব্যবহার করুন।

Perfetto কনফিগারেশন

শিডিউলিং, মেমরি কাউন্টার, LMK কিল এবং প্রেসার স্টল ইনফরমেশন (PSI) সহ Perfetto রান করে ইন্টার‍্যাকশন ক্যাপচার করুন:

adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/kswapd_lmkd.perfetto-trace <<EOF
buffers: { size_kb: 131072 }
data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "lowmemorykiller/lowmemory_kill"
            ftrace_events: "vmscan/mm_vmscan_kswapd_wake"
            ftrace_events: "vmscan/mm_vmscan_kswapd_sleep"
            ftrace_events: "psi/psi_event"
        }
    }
}
duration_ms: 180000
EOF

ট্রেস পর্যালোচনা করুন

নিম্নলিখিত স্ক্রিনশটটি একটি ট্রেস থেকে নেওয়া হয়েছে যা :cached (সবচেয়ে বেশি কিল করা যায়) প্রসেসটি কিল করার ঠিক আগে থেকে শুরু করে :foreground (সবচেয়ে কম কিল করা যায়) প্রসেসটি কিল করা পর্যন্ত সময়কাল দেখায়।

Perfetto UI স্ক্রিনশট kswapd এবং lmkd অ্যাক্টিভিটি দেখাচ্ছে।
ছবি ২. Perfetto ট্রেস kswapd রিক্লেম এবং lmkd কিল দেখাচ্ছে।

আপনি দেখতে পাচ্ছেন যে MemFree ইতিমধ্যেই বেশ কম এবং ক্রমাগত চাপের মধ্যে রয়েছে। kswapd ক্রমাগত কাজ করে চলেছে এবং mem.rss.file পৃষ্ঠা ড্রপ করে এবং mem.rss.anon-কে mem.swap-এ সরিয়ে দিয়ে সমস্ত kswapdlmkdlab প্রসেস (প্রধান প্রসেস এবং সাবপ্রসেস) থেকে চাপ কমায় এবং সম্ভবত অন্যান্য প্রসেস থেকে যা এই স্ক্রিনশটে দেখানো হয়নি। একই সময়ে, kswapdlmkdlab অ্যাপ মেমরি বরাদ্দ করা চালিয়ে যায়, kswapd যত দ্রুত মেমরি রিক্লেম করতে পারে তার চেয়ে দ্রুত চাপ বৃদ্ধি করে।

চাপ খুব বেশি হয়ে গেলে, যেমন psi.mem যথেষ্ট সময় ধরে বেশি থাকলে, lmkd জেগে ওঠে এবং কিছু প্রসেস বন্ধ করে দেয়। আপনি দেখতে পাবেন যে lmkd OOM স্কোরকে সম্মান করে, প্রথমে kswapdlmkdlab:cached, তারপর :service, তারপর :foreground বন্ধ করে।

ইভেন্টের টাইমলাইন পর্যালোচনা করুন এবং নিম্নলিখিত বিষয়গুলি নিয়ে ভাবুন:

  • kswapd এবং lmkd কীভাবে একে অপরের পরিপূরক: মেমরি প্রেসারে kswapd প্রথমে প্রতিক্রিয়া জানায়, কিন্তু lmkd সাহায্য করে যখন kswapd-এর রিক্লেম ব্যান্ডউইথ বরাদ্দ চাহিদা পূরণ করছে না।
  • মেমরি খালি হওয়ার হার: kswapd-এ ব্যয় করা সিপিইউ টাইম এবং mem.rss.file ড্রপ করে বা mem.rss.anon-কে mem.swap-এ সোয়্যাপ করে মেমরি রিক্লেম করার হার লক্ষ্য করুন। lmkd-এ অল্প সময়ের জন্য হওয়া অ্যাক্টিভিটির সাথে এটি তুলনা করুন, যার ফলে প্রসেস প্রাইভেট মেমরির বিপুল পরিমাণ রিলিজ হয়।

কোয়েরি

আপনার ট্রেস থেকে ডেটা এক্সট্র্যাক্ট করতে Perfetto UI (Query SQL)-তে এইসব কোয়েরি রান করুন।

১. kswapd অ্যাক্টিভিটি

কার্নেলের সোয়াপ ডেমন কখন অ্যাক্টিভ ছিল এবং চলছিল তা জানতে, এটি এক্সিকিউট করুন:

SELECT ts, dur, state
FROM thread_state
JOIN thread USING (utid)
WHERE thread.name LIKE 'kswapd%'
  AND state = 'Running'
LIMIT 5;

স্যাম্পেল আউটপুট:

ts dur রাজ্য
30317633052969 159180 চলছে
30317633398347 3999186 চলছে
30317638448111 1847941 চলছে
30317641455354 1031006 চলছে
30317643272615 888387 চলছে

২. LMKD কিল

LMKD instant টেবিলে লো-মেমরি কিল লেখে। সব LMKD কিল কোয়েরি করতে:

SELECT ts, name
FROM instant
WHERE name LIKE 'lmk,%'
ORDER BY ts ASC;

ইভেন্টের নামের ফর্ম্যাট হল: lmk,<pid>,<kill_reason>,<oom_score_adj>,<min_oom_score>,<max_thrashing>.

  • kill_reason: lmkd কেন প্রসেস বন্ধ করার সিদ্ধান্ত নিয়েছে তা বোঝাতে একটি পূর্ণসংখ্যা (system/memory/lmkd/statslog.h-এ সংজ্ঞায়িত):
    • 0: PRESSURE_AFTER_KILL
    • 1: NOT_RESPONDING
    • 2: LOW_SWAP_AND_THRASHING (ZRAM সোয়াপ স্পেস অত্যন্ত কম এবং থ্র্যাশিং হয়েছে)
    • 3: LOW_MEM_AND_SWAP (সিস্টেমে ফ্রি মেমরি ও ZRAM সোয়াপ, দুটিরই পরিমাণ কম)
    • 4: LOW_MEM_AND_THRASHING
    • 5: DIRECT_RECL_AND_THRASHING
    • 6: LOW_MEM_AND_SWAP_UTIL
    • 7: LOW_FILECACHE_AFTER_THRASHING
    • 8: LOW_MEM
    • 9: DIRECT_RECL_STUCK
  • max_thrashing: কিল করার সময় সর্বাধিক পেজ থ্র্যাশিংয়ের শতাংশ।

স্যাম্পেল আউটপুট:

ts নাম
30326148679967 lmk,2308,3,900,201,0
30330439763710 lmk,2309,3,500,201,0
30334985999837 lmk,2310,2,200,0,307

ভিজুয়ালাইজেশন

ডেটা ভিজ্যুয়ালাইজ করতে, আপনি নিম্নলিখিত gnuplot স্ক্রিপ্ট ব্যবহার করে সিস্টেমের ফ্রি মেমরি, kswapd অ্যাক্টিভিটি, lmkd কিল এবং PSI একটি টাইম সিরিজে প্লট করতে পারেন। স্ক্রিপ্টটি ধরে নেয় যে এটি Android বিল্ড টপ ডিরেক্টরি থেকে রান করা হয়েছে।

স্যাম্পেল আউটপুট প্লট

টেস্ট রানের প্রতিনিধিত্বকারী স্যাম্পেল ডেটা সহ পূর্ববর্তী স্ক্রিপ্ট ব্যবহার করে নিম্নলিখিত প্লটটি তৈরি করা হয়েছে।

ফ্রি মেমরি, kswapd অ্যাক্টিভিটি, PSI ও lmkd কিলের প্লট।
ছবি ৩. মেমরি প্রেসার প্লট ফ্রি মেমরি, kswapd, PSI এবং lmkd কিল দেখায়।

প্লটের ব্যাখ্যা:

এই প্লটটি স্ট্রেস টেস্টের সময় বিভিন্ন মেমরি ম্যানেজমেন্ট কম্পোনেন্টের মধ্যে ডাইনামিক ইন্টারঅ্যাকশনকে ব্যাখ্যা করে:

  1. ফ্রি মেমরি ড্রপ: মূল অ্যাপ মেমরি বরাদ্দ করার সাথে সাথে সিস্টেমের ফ্রি মেমরি (বেগুনি লাইন) ক্রমাগত কমতে থাকে।
  2. kswapd অ্যাক্টিভেশন: ফ্রি মেমরি নির্দিষ্ট ওয়াটারমার্কের নিচে নেমে গেলে, ZRAM-এ সোয়াপ করে মেমরি রিক্লেম করার জন্য kswapd জেগে ওঠে (নীল ইমপালস)। এটি মাঝে মাঝে স্পাইক হিসেবে দেখা যায়।
  3. PSI স্পাইক: kswapd যখন অ্যালোকেশনের উচ্চ হারের সাথে তাল মিলিয়ে চলতে পারে না, তখন থ্রেড মেমরি অ্যালোকেশনে স্টল করতে শুরু করে, যার ফলে PSI (প্রেসার স্টল ইনফরমেশন) (সবুজ লাইন) স্পাইক করে।
  4. LMKD কিল: PSI যখন ক্রিটিক্যাল লেভেলে পৌঁছায় (যেমন, ro.lmk.psi_complete_stall_ms থ্রেশহোল্ড ধারণাগতভাবে অতিক্রম করে) এবং ফ্রি মেমরি অত্যন্ত কম থাকে, তখন lmkd কম-অগ্রাধিকারের প্রসেস (৩০ এবং ৪৫ সময়ে কমলা ইমপালস) কিল করে হস্তক্ষেপ করে যাতে মেমরির বড় অংশ ফ্রি করা যায়। লক্ষ্য করুন যে প্রসেস বন্ধ করার সাথে সাথেই ফ্রি মেমরি বেড়ে যায় এবং PSI কমে যায়, যা চাপ কমানোর ক্ষেত্রে প্রসেস বন্ধ করার কার্যকারিতা দেখায়। ________________________________________________________________________________

← মেমরি রিক্লেম: এভিকশন ও সোয়্যাপ | ↑ উপরে | OS-এ মেমরি পেজ ফিরিয়ে দিন →