এই পৃষ্ঠায় অ্যান্ড্রয়েডে kswapd এবং lmkd এর পারস্পরিক ক্রিয়া নিয়ে আলোচনা করা হয়েছে, যেখানে দেখানো হয়েছে কীভাবে তারা একসাথে মেমরি প্রেসার পরিচালনা করে।
পটভূমি
সিস্টেমের মেমরি কমে গেলে তা পুনরুদ্ধার করার জন্য অ্যান্ড্রয়েড দুটি প্রধান পদ্ধতি ব্যবহার করে:
-
kswapd: একটি স্ট্যান্ডার্ড লিনাক্স কার্নেল ডেমন যা ক্লিন ফাইল-ব্যাকড পেজগুলোকে ইভিক্ট করে অথবা অ্যানোনিমাস পেজগুলোকে ZRAM-এ সোয়াপ করার মাধ্যমে পেজ পুনরুদ্ধার করে। -
lmkd: অ্যান্ড্রয়েডের ইউজারস্পেস লো মেমোরি কিলার ডেমন। যখনkswapdমেমোরির চাহিদা মেটাতে পারে না এবং সিস্টেমের উপর চাপ বেড়ে যায় (যা PSI দ্বারা নির্দেশিত হয়), তখনlmkdবড় আকারের মেমোরি খালি করার জন্য প্রসেস কিল করতে এগিয়ে আসে।
kswapd এবং lmkd হলো দুটি পরিপূরক মেমরি পুনরুদ্ধার ব্যবস্থা। তারা একই লক্ষ্য (ফ্রি মেমরি তৈরি করা) অর্জনের জন্য কাজ করে, কিন্তু ভিন্ন উপায়ে। তুলনা ও বৈসাদৃশ্য করতে গেলে:
- পুনরুদ্ধারযোগ্য বনাম ধ্বংসাত্মক :
kswapdসেইসব মেমরি পেজ মুছে ফেলে যা স্টোরেজ থেকে পুনরায় পড়া যায়, অথবা মেমরি পেজগুলোকে অন্য মেমরি পার্টিশন বা স্টোরেজে স্থানান্তর করে যা প্রয়োজনে পুনরায় পড়া যায়।lmkdপ্রসেস বন্ধ করে দেয়, যা নন-ভোলাটাইল স্টেট নষ্ট করে দেয়। - ব্যান্ডউইথ পুনরুদ্ধার : একটি নির্দিষ্ট পরিমাণ খালি মেমরি পুনরুদ্ধার করতে
lmkdচেয়েkswapdবেশি সিপিইউ ব্যবহার করে এবং উক্ত মেমরি পুনরুদ্ধার করতে বেশি সময় নেয়।lmkdতুলনামূলকভাবে কম পরিশ্রমে অল্প সময়ের মধ্যে প্রচুর পরিমাণে মেমরি পুনরুদ্ধার করতে পারে। মনে রাখবেন যে মোবাইল ডিভাইসে, সিপিইউ-এর এই প্রচেষ্টা কেবল ল্যাটেন্সির কারণই হয় না, বরং ব্যাটারির শক্তিও খরচ করে।
OOM স্কোর বাকেট
অ্যান্ড্রয়েড ব্যবহারকারীর কাছে প্রসেসগুলোর গুরুত্বের উপর ভিত্তি করে একটি আউট-অফ-মেমরি (OOM) স্কোর অ্যাডজাস্টমেন্ট ( oom_score_adj ) নির্ধারণ করে। উচ্চ স্কোরযুক্ত প্রসেসগুলোকে প্রথমে বন্ধ করে দেওয়া হয়।
সাধারণ বালতিগুলির মধ্যে রয়েছে:
- ক্যাশ করা (স্কোর >= ৯০০): বর্তমানে অপ্রয়োজনীয় প্রসেসগুলো দ্রুত রিস্টার্টের জন্য রাখা হয়েছে।
- পরিষেবা (স্কোর ৫০০): চালু হওয়া পরিষেবাগুলি হোস্ট করার প্রসেস।
- ফোরগ্রাউন্ড সার্ভিস (স্কোর ২০০): ফোরগ্রাউন্ড সার্ভিস হোস্টকারী প্রসেসসমূহ।
- ফোরগ্রাউন্ড (স্কোর ০): যে অ্যাপটির সাথে ব্যবহারকারী বর্তমানে ইন্টারঅ্যাক্ট করছেন।
গভীর বিশ্লেষণ: পিএসআই এবং এলএমকেডি ট্রিগারিং
পিএসআই (PSI) কী?
প্রেসার স্টল ইনফরমেশন (PSI) হলো লিনাক্স কার্নেলের একটি বৈশিষ্ট্য যা রিসোর্সের ঘাটতি পরিমাপ করার একটি নির্ভরযোগ্য উপায় প্রদান করে। এটি সিপিইউ, মেমরি এবং আই/ও-এর ঘাটতির কারণে টাস্কগুলো কতক্ষণ বিলম্বিত হয়, সেই সময়টুকু ট্র্যাক করে।
মেমোরি পিএসআই: 'কিছুটা' বনাম 'পূর্ণ'
মেমরি পিএসআই বিশেষভাবে মেমরির ঘাটতির কারণে সৃষ্ট বিলম্ব ট্র্যাক করে (যেমন, পেজ রিক্লেইম বা রিফল্টের জন্য অপেক্ষা করা)। এটি দুটি মেট্রিক প্রদান করে:
-
some: সেই সময়ের শতাংশ, যে সময়ে অন্তত একটি কাজ মেমোরিতে আটকে ছিল। এটি নির্দেশ করে যে মেমোরির স্বল্পতা কর্মক্ষমতাকে প্রভাবিত করছে, কিন্তু কিছু কাজ তখনও এগিয়ে চলেছে। -
full: সময়ের সেই শতাংশ, যে সময়ে সমস্ত সক্রিয় কাজ একই সাথে থেমে ছিল। এটি একটি সংকটজনক অবস্থা নির্দেশ করে, যেখানে সিস্টেমটি মেমরির জন্য অপেক্ষা করতে গিয়ে সম্পূর্ণরূপে অবরুদ্ধ হয়ে যায়।
কীভাবে PSI LMKD-কে সক্রিয় করে
ইউজারস্পেস lmkd ডেমনটি PSI থ্রেশহোল্ড অতিক্রম করলে নোটিফিকেশন পাওয়ার জন্য কার্নেলের সাথে রেজিস্টার করে ( /proc/pressure/memory মনিটর করার মাধ্যমে করা হয়)। যখন সিস্টেমে উচ্চ মেমোরি প্রেসার তৈরি হয় (যেমন, কনফিগার করা সময়সীমা অতিক্রম করে full স্টল), তখন কার্নেল lmkd জাগিয়ে তোলে। এরপর lmkd সিস্টেমের অবস্থা মূল্যায়ন করে এবং প্রসেসগুলোর OOM স্কোর ও আকারের উপর ভিত্তি করে সিদ্ধান্ত নেয় যে সেগুলোকে কিল করা হবে কি না এবং কোনগুলোকে করা হবে।
এলএমকেডি টিউনিং
সিস্টেম প্রোপার্টি ব্যবহার করে LMKD-এর আচরণ নিয়ন্ত্রণ করা যায়।
একটি ডিভাইসে টিউনিং মান খুঁজে বের করা
নিম্নলিখিত কমান্ডটি চালিয়ে আপনি সংযুক্ত ডিভাইসে বর্তমান LMKD টিউনিং মানগুলি খুঁজে পেতে পারেন:
adb shell getprop | grep lmk
LMKD-এর সাধারণ বৈশিষ্ট্য
LMKD টিউন করতে ব্যবহৃত কিছু গুরুত্বপূর্ণ প্রপার্টি নিচে দেওয়া হলো (সম্পূর্ণ তালিকার জন্য অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন):
-
ro.lmk.use_psi: মেমরি প্রেসার ডিটেকশনের জন্য PSI মনিটর ব্যবহার করতে এটিকেtrueতে সেট করুন (Android 10+ এ ডিফল্ট)। -
ro.lmk.psi_partial_stall_ms: কিল ট্রিগার করার জন্যsome(আংশিক) স্টল সময়কালের থ্রেশহোল্ড (মিলিসেকেন্ডে) (সাধারণ ডিভাইসে ডিফল্ট ৭০ms, কম-র্যাম ডিভাইসে ২০০ms)। -
ro.lmk.psi_complete_stall_ms: কিল ট্রিগার করার জন্যfullস্টল সময়কালের থ্রেশহোল্ড (মিলিসেকেন্ডে) (ডিফল্ট ৭০০ms)। -
ro.lmk.kill_heaviest_task: যদিtrue, LMKD একই OOM বাকেটের অন্তর্ভুক্ত প্রসেসগুলোর মধ্যে সবচেয়ে বেশি মেমরি ব্যবহারকারী প্রসেসটিকে বন্ধ করে দেয়।
পরীক্ষাধীন ডিভাইসে (গুগল পিক্সেল ৮ প্রো) প্রাসঙ্গিক টিউনিং মান
(দ্রষ্টব্য: অ্যান্ড্রয়েড ১৫ চালিত উচ্চমানের ডিভাইসগুলোর জন্য এটি সাধারণ ডিফল্ট সেটিংস)
-
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 স্কোর ৯০০)
২. স্মৃতিতে চাপ সৃষ্টি করা
অ্যাপটি স্বয়ংক্রিয়ভাবে মূল প্রসেসে মেমরি বরাদ্দ করা শুরু করবে। উচ্চ-র্যাম ডিভাইসগুলিতে পরীক্ষাটি কার্যকর করার জন্য, অ্যাপটি সাব-প্রসেসগুলিকেও মেমরি বরাদ্দ করার নির্দেশ দেয় (যেমন, প্রতিটি ৫০০ মেগাবাইট), যাতে সেগুলোকে LMKD-এর জন্য আরও ভালো টার্গেট হিসেবে তৈরি করা যায়।
নমুনা অ্যাপটি কার্যরত অবস্থায়
প্রায় ১২ জিবি মোট র্যামযুক্ত একটি গুগল পিক্সেল ৮ প্রো-তে অ্যাপটি পরীক্ষা করার পর এর একটি স্ক্রিনশট এখানে দেওয়া হলো।

পারফেট্টো ট্রেস বিশ্লেষণ
ইন্টারঅ্যাকশনটি ক্যাপচার করতে, শিডিউলিং, মেমরি কাউন্টার, LMK কিল এবং প্রেসার স্টল ইনফরমেশন (PSI) ক্যাপচার করার জন্য নিম্নলিখিত পারফেটটো কনফিগারেশনটি ব্যবহার করুন।
পারফেট্টো কনফিগারেশন
শিডিউলিং, মেমরি কাউন্টার, LMK কিল এবং প্রেসার স্টল ইনফরমেশন (PSI) সহ পারফেটটো চালিয়ে ইন্টারঅ্যাকশনটি রেকর্ড করুন:
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 (সবচেয়ে কম সহজে কিলযোগ্য) প্রসেসটি কিল হওয়া পর্যন্ত সময়কাল দেখাচ্ছে।

আপনি দেখতে পাচ্ছেন যে MemFree ইতিমধ্যেই বেশ কম এবং ক্রমাগত চাপের মধ্যে রয়েছে। kswapd অবিরাম কাজ করে চলেছে এবং সমস্ত kswapdlmkdlab প্রসেস (প্রধান প্রসেস এবং সাব-প্রসেসগুলো) থেকে mem.rss.file পেজগুলো ড্রপ করে ও mem.rss.anon mem.swap এ সরিয়ে দিয়ে চাপ কমাচ্ছে, এবং সম্ভবত এই স্ক্রিনশটে দেখানো হয়নি এমন অন্যান্য প্রসেস থেকেও একই কাজ করছে। একই সময়ে, kswapdlmkdlab অ্যাপটি মেমরি বরাদ্দ করে চলেছে, যা kswapd পুনরুদ্ধারের চেয়ে দ্রুত চাপ বাড়িয়ে দিচ্ছে।
যখন চাপ খুব বেশি হয়ে যায়, যেমনটা psi.mem যথেষ্ট সময় ধরে বেশি থাকলে দেখা যায়, তখন lmkd জেগে ওঠে এবং কিছু প্রসেস বন্ধ করে দেয়। আপনি দেখতে পারেন যে lmkd OOM স্কোরকে সম্মান করে, প্রথমে kswapdlmkdlab:cached , তারপর :service , এবং সবশেষে :foreground বন্ধ করে দেয়।
ঘটনাক্রম পর্যালোচনা করুন এবং নিম্নলিখিত বিষয়গুলো নিয়ে চিন্তা করুন:
-
kswapdএবংlmkdযেভাবে একে অপরের পরিপূরক: মেমরির চাপেkswapdসবার আগে সাড়া দেয়, কিন্তু যখনkswapdএর রিক্লেইম ব্যান্ডউইথ অ্যালোকেশনের চাহিদা মেটাতে পারে না, তখনlmkdসাহায্য করে। - মেমরি মুক্ত হওয়ার হার:
kswapdএ ব্যয়িত সিপিইউ সময় এবংmem.rss.fileড্রপ করে বাmem.rss.anonকেmem.swapএ সোয়াপ করে পুনরুদ্ধার করা মেমরি পর্যবেক্ষণ করুন। এর সাথেlmkdএর কার্যকলাপের স্বল্পস্থায়ী বিস্ফোরণের তুলনা করুন, যার ফলে বিপুল পরিমাণ প্রসেস প্রাইভেট মেমরি মুক্ত হয়।
প্রশ্ন
আপনার ট্রেস থেকে ডেটা বের করতে পারফেটটো 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;
নমুনা আউটপুট:
| টিএস | দুর | রাজ্য |
|---|---|---|
| ৩০৩১৭৬৩৩০৫২৯৬৯ | ১৫৯১৮০ | দৌড়ানো |
| ৩০৩১৭৬৩৩৩৯৮৩৪৭ | ৩৯৯৯১৮৬ | দৌড়ানো |
| ৩০৩১৭৬৩৮৪৪৮১১১ | ১৮৪৭৯৪১ | দৌড়ানো |
| ৩০৩১৭৬৪১৪৫৫৩৫৪ | ১০৩১০৬ | দৌড়ানো |
| ৩০৩১৭৬৪৩২৭২৬১৫ | ৮৮৮৩৮৭ | দৌড়ানো |
২. এলএমকেডি হত্যা করে
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: কিল করার সময় পেজ থ্র্যাশিংয়ের সর্বোচ্চ শতাংশ।
নমুনা আউটপুট:
| টিএস | নাম |
|---|---|
| ৩০৩২৬১৪৮৬৭৯৯৬৭ | lmk,2308,3,900,201,0 |
| ৩০৩৩০৪৩৯৭৬৩৭১০ | lmk,2309,3,500,201,0 |
| ৩০৩৩৪৯৮৫৯৯৯৮৩৭ | lmk,2310,2,200,0,307 |
ভিজ্যুয়ালাইজেশন
ডেটা ভিজ্যুয়ালাইজ করার জন্য, আপনি একটি একক টাইম সিরিজে সিস্টেম ফ্রি মেমরি, kswapd অ্যাক্টিভিটি, lmkd কিলস এবং PSI প্লট করতে নিম্নলিখিত gnuplot স্ক্রিপ্টটি ব্যবহার করতে পারেন। স্ক্রিপ্টটি ধরে নেয় যে এটি অ্যান্ড্রয়েড বিল্ড টপ ডিরেক্টরি থেকে চালানো হচ্ছে।
নমুনা আউটপুট প্লট
উপরের স্ক্রিপ্টটি ব্যবহার করে পরীক্ষামূলক চালনার প্রতিনিধিত্বকারী নমুনা ডেটা দিয়ে নিম্নলিখিত প্লটটি তৈরি করা হয়েছে।

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