অ্যান্ড্রয়েড লো মেমোরি কিলার ডেমন ( lmkd ) প্রসেসটি একটি চলমান অ্যান্ড্রয়েড সিস্টেমের মেমোরির অবস্থা পর্যবেক্ষণ করে এবং উচ্চ মেমোরি চাপের প্রতিক্রিয়ায় সবচেয়ে কম প্রয়োজনীয় প্রসেসগুলোকে বন্ধ করে দেয়, যাতে সিস্টেম গ্রহণযোগ্য মাত্রায় সচল থাকে।
স্মৃতিশক্তির চাপ সম্পর্কে
সমান্তরালভাবে একাধিক প্রসেস চালিত একটি অ্যান্ড্রয়েড সিস্টেমে এমন পরিস্থিতি তৈরি হতে পারে যখন সিস্টেম মেমরি শেষ হয়ে যায় এবং যে প্রসেসগুলোর বেশি মেমরির প্রয়োজন হয়, সেগুলোতে লক্ষণীয় বিলম্ব ঘটে। মেমরি প্রেসার হলো এমন একটি অবস্থা যেখানে সিস্টেমে মেমরির ঘাটতি দেখা দেয়। এই চাপ কমানোর জন্য অ্যান্ড্রয়েডকে অপ্রয়োজনীয় প্রসেসগুলোর গতি কমিয়ে বা বন্ধ করে দিয়ে, প্রসেসগুলোকে অ-গুরুত্বপূর্ণ ক্যাশ করা রিসোর্স মুক্ত করার অনুরোধ জানিয়ে, ইত্যাদি বিভিন্ন উপায়ে মেমরি খালি করতে হয়।
ঐতিহাসিকভাবে, অ্যান্ড্রয়েড একটি ইন-কার্নেল লো মেমোরি কিলার (LMK) ড্রাইভার ব্যবহার করে সিস্টেম মেমোরির চাপ পর্যবেক্ষণ করত, যা ছিল একটি অনমনীয় ব্যবস্থা এবং হার্ড-কোডেড মানের উপর নির্ভরশীল। কার্নেল ৪.১২ থেকে, LMK ড্রাইভারটি আপস্ট্রিম কার্নেল থেকে সরিয়ে দেওয়া হয়েছে এবং ইউজারস্পেস lmkd মেমোরি পর্যবেক্ষণ ও প্রসেস কিলিংয়ের কাজগুলো সম্পাদন করে।
চাপ স্টল তথ্য
অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলোতে একটি নতুন lmkd মোড রয়েছে, যা মেমোরি প্রেসার শনাক্তকরণের জন্য কার্নেল প্রেসার স্টল ইনফরমেশন (PSI) মনিটর ব্যবহার করে। আপস্ট্রিম কার্নেলের PSI প্যাচসেট (যা ৪.৯ এবং ৪.১৪ কার্নেলে ব্যাকপোর্ট করা হয়েছে) মেমোরির ঘাটতির কারণে টাস্কগুলো কতক্ষণ বিলম্বিত হচ্ছে, তা পরিমাপ করে। যেহেতু এই বিলম্বগুলো সরাসরি ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে, তাই এগুলো মেমোরি প্রেসারের তীব্রতা নির্ধারণের জন্য একটি সুবিধাজনক পরিমাপক হিসেবে কাজ করে। আপস্ট্রিম কার্নেলে এমন PSI মনিটরও রয়েছে যা প্রিভিলেজড ইউজারস্পেস প্রসেসগুলোকে (যেমন lmkd ) এই বিলম্বের জন্য একটি নির্দিষ্ট সীমা নির্ধারণ করতে এবং সেই সীমা অতিক্রম করলে কার্নেল থেকে আসা ইভেন্টগুলোতে সাবস্ক্রাইব করার সুযোগ দেয়।
PSI মনিটর বনাম vmpressure সংকেত
যেহেতু vmpressure সিগন্যালগুলোতে (যা মেমরি প্রেসার শনাক্তকরণের জন্য কার্নেল দ্বারা তৈরি এবং lmkd ব্যবহার করে) প্রায়শই অসংখ্য ফলস পজিটিভ থাকে, তাই মেমরিটি প্রকৃত চাপে আছে কিনা তা নির্ধারণ করতে lmkd ফিল্টারিং করতে হয়। এর ফলে অপ্রয়োজনীয়ভাবে lmkd জেগে ওঠে এবং অতিরিক্ত কম্পিউটেশনাল রিসোর্স ব্যবহৃত হয়। PSI মনিটর ব্যবহার করলে আরও নির্ভুলভাবে মেমরি প্রেসার শনাক্ত করা যায় এবং ফিল্টারিং ওভারহেড কমে আসে।
পিএসআই মনিটর ব্যবহার করুন
vmpressure ইভেন্টের পরিবর্তে PSI মনিটর ব্যবহার করতে, ro.lmk.use_psi প্রপার্টিটি কনফিগার করুন। এর ডিফল্ট মান হলো true , যা lmkd জন্য মেমরি প্রেসার ডিটেকশনের ডিফল্ট মেকানিজম হিসেবে PSI মনিটরকে সেট করে। যেহেতু PSI মনিটরের জন্য কার্নেল সাপোর্টের প্রয়োজন হয়, তাই কার্নেলে অবশ্যই PSI ব্যাকপোর্ট প্যাচগুলো অন্তর্ভুক্ত থাকতে হবে এবং PSI সাপোর্ট এনাবল করে ( CONFIG_PSI=y ) কম্পাইল করতে হবে।
ইন-কার্নেল এলএমকে ড্রাইভারের অসুবিধাগুলো
অ্যান্ড্রয়েড বিভিন্ন সমস্যার কারণে LMK ড্রাইভারটিকে অপ্রচলিত ঘোষণা করেছে, যার মধ্যে রয়েছে:
- কম র্যামের ডিভাইসগুলোকে কঠোরভাবে টিউন করতে হতো, এবং তারপরেও বড় ফাইল-সমর্থিত সক্রিয় পেজক্যাশযুক্ত ওয়ার্কলোডগুলোতে সেগুলোর পারফরম্যান্স খারাপ হতো। এই দুর্বল পারফরম্যান্সের ফলে থ্র্যাশিং হতো এবং কোনো কিল হতো না।
- LMK কার্নেল ড্রাইভারটি ফ্রি-মেমরি সীমার উপর নির্ভর করত এবং মেমরির চাপের উপর ভিত্তি করে এর কোনো স্কেলিং হতো না।
- ডিজাইনের অনমনীয়তার কারণে, অংশীদাররা প্রায়শই ড্রাইভারটিকে নিজেদের ডিভাইসে কাজ করার জন্য কাস্টমাইজ করে নিত।
- LMK ড্রাইভারটি স্ল্যাব শ্রিংকার API-এর সাথে সংযুক্ত ছিল, যা টার্গেট খোঁজা এবং সেগুলোকে কিল করার মতো ভারী অপারেশনের জন্য ডিজাইন করা হয়নি, ফলে
vmscanপ্রসেসটি ধীর হয়ে গিয়েছিল।
ব্যবহারকারী স্থান lmkd
ইউজারস্পেস lmkd ইন-কার্নেল ড্রাইভারের মতোই কার্যকারিতা প্রয়োগ করে, তবে এটি মেমরি প্রেসার শনাক্ত ও অনুমান করার জন্য বিদ্যমান কার্নেল মেকানিজম ব্যবহার করে। এই ধরনের মেকানিজমগুলোর মধ্যে রয়েছে মেমরি প্রেসারের মাত্রা সম্পর্কে নোটিফিকেশন পাওয়ার জন্য কার্নেল-জেনারেটেড vmpressure ইভেন্ট বা প্রেসার স্টল ইনফরমেশন (PSI) মনিটর ব্যবহার করা, এবং প্রসেসের গুরুত্বের উপর ভিত্তি করে প্রতিটি প্রসেসের জন্য বরাদ্দকৃত মেমরি রিসোর্স সীমিত করতে মেমরি cgroup ফিচার ব্যবহার করা।
অ্যান্ড্রয়েড ১০-এ ইউজারস্পেস lmkd ব্যবহার করুন
অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলোতে, যদি কোনো ইন-কার্নেল LMK ড্রাইভার শনাক্ত না হয়, তাহলে ইউজারস্পেস lmkd সক্রিয় হয়। যেহেতু ইউজারস্পেস lmkd এর জন্য মেমরি cgroups-এর কার্নেল সাপোর্টের প্রয়োজন হয়, তাই কার্নেলটিকে অবশ্যই নিম্নলিখিত কনফিগারেশন সেটিংস সহ কম্পাইল করতে হবে:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
হত্যার কৌশল
ইউজারস্পেস lmkd vmpressure ইভেন্ট বা PSI মনিটর, সেগুলোর তীব্রতা এবং সোয়াপ ইউটিলাইজেশনের মতো অন্যান্য ইঙ্গিতের উপর ভিত্তি করে কিল স্ট্র্যাটেজি সমর্থন করে। কম-মেমরি এবং উচ্চ-পারফরম্যান্স ডিভাইসের ক্ষেত্রে কিল স্ট্র্যাটেজি ভিন্ন হয়:
- কম মেমোরির ডিভাইসগুলিতে, সিস্টেমটিকে স্বাভাবিক কার্যপ্রণালী হিসেবে উচ্চতর মেমোরি চাপ সহ্য করতে সক্ষম হওয়া উচিত।
- উচ্চ-ক্ষমতাসম্পন্ন ডিভাইসগুলিতে, মেমরির উপর চাপকে একটি অস্বাভাবিক পরিস্থিতি হিসেবে দেখা উচিত এবং এটি সামগ্রিক কর্মক্ষমতাকে প্রভাবিত করার আগেই এর সমাধান করা উচিত।
আপনি ro.config.low_ram প্রপার্টি ব্যবহার করে কিল স্ট্র্যাটেজি কনফিগার করতে পারেন।
ইউজারস্পেস lmkd একটি লিগ্যাসি মোডও সমর্থন করে, যেখানে এটি ইন-কার্নেল LMK ড্রাইভারের মতোই কৌশল (অর্থাৎ, ফ্রি মেমরি এবং ফাইল ক্যাশ থ্রেশহোল্ড) ব্যবহার করে কিল করার সিদ্ধান্ত নেয়। লিগ্যাসি মোড সক্রিয় করতে, ro.lmk.use_minfree_levels প্রপার্টিটি true তে সেট করুন।
lmkd কনফিগার করুন
নিম্নলিখিত প্রোপার্টিগুলো ব্যবহার করে একটি নির্দিষ্ট ডিভাইসের জন্য lmkd কনফিগার করুন।
| সম্পত্তি | ব্যবহার | ডিফল্ট |
|---|---|---|
ro.config.low_ram | ডিভাইসটি কম-র্যাম নাকি উচ্চ-কর্মক্ষমতাসম্পন্ন তা নির্দিষ্ট করুন। | false |
ro.lmk.use_psi | vmpressure ইভেন্টের পরিবর্তে PSI মনিটর ব্যবহার করুন। | true |
ro.lmk.use_minfree_levels | প্রসেস কিল করার সিদ্ধান্ত নেওয়ার জন্য ফ্রি মেমোরি এবং ফাইল ক্যাশ থ্রেশহোল্ড ব্যবহার করুন (অর্থাৎ, ইন-কার্নেল LMK ড্রাইভারের কার্যকারিতার সাথে সামঞ্জস্য রাখুন)। | false |
ro.lmk.low | কম vmpressure লেভেলে কিল করার যোগ্য প্রসেসগুলোর জন্য সর্বনিম্ন oom_adj স্কোর। | 1001(প্রতিবন্ধী) |
ro.lmk.medium | মাঝারি vmpressure লেভেলে কিল করার যোগ্য প্রসেসগুলোর জন্য সর্বনিম্ন oom_adj স্কোর। | 800(ক্যাশযুক্ত বা অনাবশ্যক পরিষেবা) |
ro.lmk.critical | ক্রিটিক্যাল vmpressure লেভেলে কিল করার যোগ্য প্রসেসগুলোর জন্য সর্বনিম্ন oom_adj স্কোর। | 0(যেকোনো প্রক্রিয়া) |
ro.lmk.critical_upgrade | ক্রিটিক্যাল লেভেলে আপগ্রেড সক্ষম করুন। | false |
ro.lmk.upgrade_pressure | সর্বোচ্চ mem_pressure যেটিতে সিস্টেম অতিরিক্ত সোয়াপিং করার কারণে লেভেল আপগ্রেড করা হয়। | 100(প্রতিবন্ধী) |
ro.lmk.downgrade_pressure | সর্বনিম্ন mem_pressure যেখানে একটি vmpressure ইভেন্ট উপেক্ষা করা হয়, কারণ তখনও পর্যাপ্ত খালি মেমরি উপলব্ধ থাকে। | 100(প্রতিবন্ধী) |
ro.lmk.kill_heaviest_task | যেকোনো যোগ্য কাজের (দ্রুত সিদ্ধান্ত) পরিবর্তে সবচেয়ে কঠিন যোগ্য কাজটি বাতিল করা (সেরা সিদ্ধান্ত)। | false |
ro.lmk.kill_timeout_ms | একটি কিল করার পর কতক্ষণ (মিলিসেকেন্ডে) অতিরিক্ত কোনো কিল করা হবে না। | 0(প্রতিবন্ধী) |
ro.lmk.debug | lmkd ডিবাগ লগ সক্রিয় করুন। | false |
ডিভাইসের কনফিগারেশনের উদাহরণ:
PRODUCT_PROPERTY_OVERRIDES += \
ro.lmk.low=1001 \
ro.lmk.medium=800 \
ro.lmk.critical=0 \
ro.lmk.critical_upgrade=false \
ro.lmk.upgrade_pressure=100 \
ro.lmk.downgrade_pressure=100 \
ro.lmk.kill_heaviest_task=true
অ্যান্ড্রয়েড ১১-এ ইউজারস্পেস lmkd
অ্যান্ড্রয়েড ১১ একটি নতুন কিলিং স্ট্র্যাটেজি চালু করার মাধ্যমে lmkd কে উন্নত করেছে। এই কিলিং স্ট্র্যাটেজিটি অ্যান্ড্রয়েড ১০-এ প্রবর্তিত মেমরি প্রেসার শনাক্তকরণের জন্য একটি PSI মেকানিজম ব্যবহার করে। অ্যান্ড্রয়েড ১১-এর lmkd মেমরি স্টারভেশন এবং পারফরম্যান্সের অবনতি রোধ করতে মেমরি রিসোর্স ব্যবহারের মাত্রা এবং থ্র্যাশিং বিবেচনা করে। এই কিলিং স্ট্র্যাটেজিটি পূর্ববর্তী স্ট্র্যাটেজিগুলোকে প্রতিস্থাপন করে এবং এটি উচ্চ-পারফরম্যান্স ও কম-র্যামের (অ্যান্ড্রয়েড গো) উভয় ডিভাইসেই ব্যবহার করা যায়।
কার্নেলের প্রয়োজনীয়তা
অ্যান্ড্রয়েড ১১ ডিভাইসগুলোর জন্য lmkd নিম্নলিখিত কার্নেল বৈশিষ্ট্যগুলো প্রয়োজন:
- PSI প্যাচগুলো অন্তর্ভুক্ত করুন এবং PSI সক্রিয় করুন (ব্যাকপোর্টগুলো অ্যান্ড্রয়েড কমন কার্নেল ৪.৯, ৪.১৪, এবং ৪.১৯-এ উপলব্ধ)।
- PIDFD সাপোর্ট প্যাচগুলো অন্তর্ভুক্ত করুন (ব্যাকপোর্টগুলো অ্যান্ড্রয়েড কমন কার্নেল ৪.৯, ৪.১৪, এবং ৪.১৯-এ উপলব্ধ)।
- কম র্যামের ডিভাইসগুলোর জন্য মেমরি সি-গ্রুপ অন্তর্ভুক্ত করুন।
কার্নেলটি অবশ্যই নিম্নলিখিত কনফিগারেশন সেটিংস সহ কম্পাইল করতে হবে:
CONFIG_PSI=y
অ্যান্ড্রয়েড ১১-এ lmkd কনফিগার করুন
অ্যান্ড্রয়েড ১১-এর মেমোরি কিলিং স্ট্র্যাটেজি নিচে তালিকাভুক্ত টিউনিং নব এবং ডিফল্টগুলো সমর্থন করে। এই ফিচারগুলো উচ্চ-ক্ষমতাসম্পন্ন এবং কম র্যামের ডিভাইস উভয় ক্ষেত্রেই কাজ করে।
| সম্পত্তি | ব্যবহার | ডিফল্ট | |
|---|---|---|---|
| উচ্চ কর্মক্ষমতা | কম র্যাম | ||
ro.lmk.psi_partial_stall_ms | লো মেমরি নোটিফিকেশন ট্রিগার করার জন্য পার্শিয়াল পিএসআই স্টল থ্রেশহোল্ড (মিলিসেকেন্ডে)। যদি ডিভাইসটি খুব দেরিতে মেমরি প্রেসার নোটিফিকেশন পায়, তাহলে আগে নোটিফিকেশন ট্রিগার করার জন্য এই মানটি কমান। যদি অপ্রয়োজনে মেমরি প্রেসার নোটিফিকেশন ট্রিগার হয়, তাহলে ডিভাইসটিকে নয়েজের প্রতি কম সংবেদনশীল করতে এই মানটি বাড়ান। | 70 | 200 |
ro.lmk.psi_complete_stall_ms | গুরুত্বপূর্ণ মেমরি নোটিফিকেশন চালু করার জন্য সম্পূর্ণ PSI স্টল থ্রেশহোল্ড, মিলিসেকেন্ডে। যদি ডিভাইসটি খুব দেরিতে গুরুত্বপূর্ণ মেমরি চাপের নোটিফিকেশন পায়, তাহলে আগে নোটিফিকেশন চালু করার জন্য এই মানটি কমিয়ে দিন। যদি অপ্রয়োজনে গুরুত্বপূর্ণ মেমরি চাপের নোটিফিকেশন চালু হয়, তাহলে ডিভাইসটিকে নয়েজের প্রতি কম সংবেদনশীল করতে এই মানটি বাড়িয়ে দিন। | 700 | |
ro.lmk.thrashing_limit | মোট ফাইল-ব্যাকড পেজক্যাশ আকারের শতাংশ হিসাবে ওয়ার্কিংসেট রিফল্টের সর্বোচ্চ পরিমাণ। এই মানের উপরে ওয়ার্কিংসেট রিফল্টের অর্থ হলো, সিস্টেমটি তার পেজক্যাশ থ্র্যাশিং করছে বলে ধরে নেওয়া হয়। মেমরি চাপের সময় যদি ডিভাইসের পারফরম্যান্স প্রভাবিত হয়, তবে থ্র্যাশিং সীমিত করতে মানটি হ্রাস করুন। যদি থ্র্যাশিংয়ের কারণে ডিভাইসের পারফরম্যান্স অপ্রয়োজনে নষ্ট হয়ে যায়, তবে আরও বেশি থ্র্যাশিংয়ের সুযোগ দিতে মানটি বৃদ্ধি করুন। | 100 | 30 |
ro.lmk.thrashing_limit_decay | থ্র্যাশিং থ্রেশহোল্ডের হ্রাসকে মূল থ্রেশহোল্ডের শতাংশ হিসাবে প্রকাশ করা হয়, যা সিস্টেম কিল হওয়ার পরেও পুনরুদ্ধার করতে না পারলে থ্রেশহোল্ড কমানোর জন্য ব্যবহৃত হয়। যদি ক্রমাগত থ্র্যাশিংয়ের ফলে অপ্রয়োজনীয় কিল হয়, তবে মানটি হ্রাস করুন। যদি কিল হওয়ার পর ক্রমাগত থ্র্যাশিংয়ের প্রতিক্রিয়া খুব ধীর হয়, তবে মানটি বৃদ্ধি করুন। | 10 | 50 |
ro.lmk.swap_util_max | মোট সোয়াপযোগ্য মেমরির শতাংশ হিসাবে সোয়াপ করা মেমরির সর্বোচ্চ পরিমাণ। যখন সোয়াপ করা মেমরি এই সীমা অতিক্রম করে, তার মানে হলো সিস্টেম তার বেশিরভাগ সোয়াপযোগ্য মেমরি সোয়াপ করে ফেলেছে এবং এখনও চাপের মধ্যে আছে। এটি তখন ঘটতে পারে যখন নন-সোয়াপযোগ্য অ্যালোকেশনগুলো মেমরি প্রেসার তৈরি করে, যা সোয়াপিংয়ের মাধ্যমে কমানো যায় না, কারণ বেশিরভাগ সোয়াপযোগ্য মেমরি ইতিমধ্যেই সোয়াপ আউট হয়ে গেছে। ডিফল্ট মান হলো ১০০, যা কার্যকরভাবে এই চেকটিকে নিষ্ক্রিয় করে দেয়। যদি মেমরি প্রেসারের সময় ডিভাইসের পারফরম্যান্স প্রভাবিত হয়, যখন সোয়াপ ইউটিলাইজেশন বেশি থাকে এবং ফ্রি সোয়াপ লেভেল ro.lmk.swap_free_low_percentage এ নেমে না আসে, তাহলে সোয়াপ ইউটিলাইজেশন সীমিত করতে মানটি কমিয়ে দিন। | 100 | 100 |
নিম্নলিখিত পুরানো টিউনিং নবগুলোও নতুন কিলিং স্ট্র্যাটেজির সাথে কাজ করে।
| সম্পত্তি | ব্যবহার | ডিফল্ট | |
|---|---|---|---|
| উচ্চ কর্মক্ষমতা | কম র্যাম | ||
ro.lmk.swap_free_low_percentage | মোট সোয়াপ স্পেসের শতাংশ হিসাবে খালি সোয়াপের পরিমাণ। `lmkd` এই মানটিকে একটি থ্রেশহোল্ড হিসাবে ব্যবহার করে, যার মাধ্যমে সিস্টেমটিকে সোয়াপ স্পেসের অভাবে ভুগছে বলে বিবেচনা করা হয়। যদি সোয়াপে খুব বেশি জায়গা থাকা অবস্থায় `lmkd` কিল করে, তাহলে শতাংশটি কমিয়ে দিন। যদি `lmkd` খুব দেরিতে কিল করে, যার ফলে OOM কিল হওয়ার সুযোগ তৈরি হয়, তাহলে শতাংশটি বাড়িয়ে দিন। | 20 | 10 |
ro.lmk.debug | এটি `lmkd` ডিবাগ লগ চালু করে। টিউনিং করার সময় ডিবাগ চালু রাখুন। | false | |