লো মেমরি কিলার ডেমন

Android low memory killer daemon (lmkd) প্রসেস, চালু থাকা Android সিস্টেমের মেমরি স্ট্যাটাস মনিটর করে এবং বেশি মেমরি প্রেসার হলে, সিস্টেমকে গ্রহণযোগ্য লেভেলে পারফর্ম করার জন্য সবচেয়ে কম প্রয়োজনীয় প্রসেস কিল করে প্রতিক্রিয়া জানায়।

মেমরি প্রেসার সম্পর্কে

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

ঐতিহাসিকভাবে, Android, ইন-কার্নেল লো মেমরি কিলার (LMK) ড্রাইভার ব্যবহার করে সিস্টেম মেমরি প্রেসার মনিটর করে, এটি একটি কঠোর মেকানিজম যা হার্ড-কোডেড ভ্যালুর উপর নির্ভর করে। কার্নেল 4.12 থেকে, LMK ড্রাইভারকে আপস্ট্রিম কার্নেল থেকে সরিয়ে দেওয়া হয়েছে এবং ব্যবহারকারী স্পেস lmkd মেমরি মনিটর করা ও প্রসেস কিল করা টাস্ক পারফর্ম করে।

প্রেশার স্টল সংক্রান্ত তথ্য

Android 10 ও তার পরবর্তী যেকোনও ভার্সনে নতুন lmkd মোড কাজ করে যা মেমরি প্রেসার শনাক্ত করার জন্য কার্নেল প্রেসার স্টল সংক্রান্ত তথ্য (PSI) মনিটর ব্যবহার করে। আপস্ট্রিম কার্নেলে PSI প্যাচসেট (৪.৯ এবং ৪.১৪ কার্নেলে ব্যাকপোর্ট করা) পরিমাপ করে যে টাস্কগুলি কতক্ষণ বিলম্বিত হয় তার পরিমাণ মেমরি ঘাটতির ফলে। এই বিলম্ব সরাসরি ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে বলে, মেমরি প্রেসারের তীব্রতা নির্ধারণের জন্য এগুলি একটি সুবিধাজনক মেট্রিক হিসেবে কাজ করে। আপস্ট্রিম কার্নেলে PSI মনিটরও থাকে যা বিশেষ সুবিধা প্রাপ্ত ইউজারস্পেস প্রসেসকে (যেমন lmkd) এই বিলম্বের জন্য থ্রেশহোল্ড নির্দিষ্ট করতে এবং থ্রেশহোল্ড অতিক্রম করা হলে কার্নেল থেকে ইভেন্টে সাবস্ক্রাইব করতে দেয়।

PSI মনিটর বনাম vmpressure সিগন্যাল

কারণ, vmpressure সিগন্যালে (মেমরি প্রেশার শনাক্তকরণের জন্য কার্নেল দ্বারা তৈরি এবং lmkd দ্বারা ব্যবহৃত) প্রায়শই অসংখ্য ফলস পজিটিভ থাকে, lmkd মেমরি প্রকৃত প্রেশারে আছে কিনা তা নির্ধারণ করতে ফিল্টারিং করতে হবে। এর ফলে অপ্রয়োজনীয় lmkd ওয়েক-আপ হয় এবং অতিরিক্ত কম্পিউটেশনাল রিসোর্স ব্যবহার হয়। PSI মনিটর ব্যবহার করলে, মেমরি প্রেশার আরও নিখুঁতভাবে শনাক্ত করা যায় এবং ফিল্টারিং ওভারহেড কমে যায়।

PSI মনিটর ব্যবহার করা

vmpressure ইভেন্টের পরিবর্তে PSI মনিটর ব্যবহার করতে, ro.lmk.use_psi প্রপার্টি কনফিগার করুন। ডিফল্ট হল true, যা lmkd-এর জন্য মেমরি প্রেসার শনাক্তকরণের ডিফল্ট মেকানিজম হিসেবে PSI মনিটরকে তৈরি করে। PSI মনিটর করার জন্য কার্নেল সাপোর্ট প্রয়োজন, তাই কার্নেলে PSI ব্যাকপোর্ট প্যাচ থাকতে হবে এবং PSI সাপোর্ট চালু (CONFIG_PSI=y) করে কম্পাইল করতে হবে।

ইন-কার্নেল LMK ড্রাইভারের অসুবিধা

Android, LMK ড্রাইভারকে বাতিল করে দেয় কারণ এর মধ্যে নিম্নলিখিত সমস্যাগুলি সহ আরও অনেক সমস্যা রয়েছে:

  • কম-RAM ডিভাইসে আগ্রাসীভাবে টিউন করতে হয় এবং তারপরেও বড় ফাইল-ব্যাকড অ্যাক্টিভ পেজক্যাশে সহ ওয়ার্কলোডে খারাপ পারফর্ম করে। খারাপ পারফর্ম্যান্সের ফলে কোনও কিল না পেয়ে তাকে পরাজিত হতে হয়।
  • LMK কার্নেল ড্রাইভার ফ্রি-মেমরি সীমার উপর নির্ভর করে, মেমরি প্রেসারের উপর ভিত্তি করে কোনও স্কেলিং করা হয় না।
  • ডিজাইনের অনমনীয়তার কারণে, পার্টনাররা প্রায়শই ড্রাইভার কাস্টমাইজ করে যাতে এটি তাদের ডিভাইসে কাজ করে।
  • LMK ড্রাইভারটি স্ল্যাব শ্রিন্কার API-এর সাথে হুক করা আছে, যা টার্গেট খোঁজা ও সেগুলিকে কিল করার মতো ভারী অপারেশনের জন্য ডিজাইন করা হয়নি। এর ফলে vmscan প্রসেসটি ধীর হয়ে গেছে।

Userspace lmkd

ইউজারস্পেস lmkd ইন-কার্নেল ড্রাইভারের মতো একই ফাংশনালিটি প্রয়োগ করে কিন্তু মেমরি প্রেসার শনাক্ত ও অনুমান করার জন্য আগে থেকে থাকা কার্নেল মেকানিজম ব্যবহার করে। এই ধরনের মেকানিজমের মধ্যে রয়েছে কার্নেল-জেনারেটেড vmpressure ইভেন্ট বা মেমরি প্রেসার লেভেল সম্পর্কে বিজ্ঞপ্তি পেতে প্রেসার স্টল ইনফরমেশন (PSI) মনিটর ব্যবহার করা এবং প্রসেসের গুরুত্বের উপর ভিত্তি করে প্রতিটি প্রসেসে বরাদ্দ মেমরি রিসোর্স সীমিত করতে মেমরি cgroup ফিচার ব্যবহার করা।

Android 10-এ ইউজারস্পেস lmkd ব্যবহার করুন

Android 9 ও তার পরবর্তী ভার্সনে, ইন-কার্নেল LMK ড্রাইভার শনাক্ত করা না গেলে, ইউজারস্পেস lmkd অ্যাক্টিভেট হয়। যেহেতু ব্যবহারকারীর স্পেস lmkd-এর জন্য মেমরি cgroups-এর কার্নেল সাপোর্ট প্রয়োজন, তাই কার্নেলকে অবশ্যই নিম্নলিখিত কনফিগারেশন সেটিংসের সাথে কম্পাইল করতে হবে:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

কিল স্ট্র্যাটেজি

ইউজারস্পেস lmkd vmpressure ইভেন্ট বা PSI মনিটর, তাদের তীব্রতা এবং সোয়াপ ইউটিলাইজেশনের মতো অন্যান্য ইঙ্গিত ভিত্তিক কিল স্ট্র্যাটেজি সমর্থন করে। কম মেমরি ও হাই-পারফর্ম্যান্স ডিভাইসের মধ্যে কিল করার কৌশল আলাদা হয়:

  • কম মেমরি থাকা ডিভাইসে, সিস্টেমকে স্বাভাবিক মোড হিসেবে বেশি মেমরি প্রেসার সহ্য করতে হবে।
  • হাই-পারফর্ম্যান্স ডিভাইসে, মেমরি প্রেসারকে একটি অস্বাভাবিক পরিস্থিতি হিসেবে দেখা উচিত এবং সামগ্রিক পারফর্ম্যান্সকে প্রভাবিত করার আগে এটি সমাধান করা উচিত।

আপনি ro.config.low_ram প্রপার্টি ব্যবহার করে কিল স্ট্র্যাটেজি কনফিগার করতে পারবেন।

এছাড়াও, Userspace lmkd একটি লিগ্যাসি মোডে কাজ করে যেখানে এটি কার্নেল LMK ড্রাইভারের মতো একই কৌশল ব্যবহার করে প্রসেস বন্ধ করার সিদ্ধান্ত নেয় (অর্থাৎ, ফ্রি মেমরি এবং ফাইল ক্যাশে থ্রেশহোল্ড)। লিগ্যাসি মোড চালু করতে, ro.lmk.use_minfree_levels প্রপার্টিকে true হিসেবে সেট করুন।

lmkd কনফিগার করা

নিম্নলিখিত প্রপার্টি ব্যবহার করে নির্দিষ্ট ডিভাইসের জন্য lmkd কনফিগার করুন।

প্রপার্টি ব্যবহার করুন ডিফল্ট
ro.config.low_ram ডিভাইসটি কম RAM বা হাই-পারফর্ম্যান্স ডিভাইস কিনা তা উল্লেখ করুন। false
ro.lmk.use_psi PSI মনিটর ব্যবহার করুন (vmpressure ইভেন্টের পরিবর্তে)। 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

Android 11-এ Userspace lmkd

Android 11 নতুন কিলিং স্ট্র্যাটেজি যোগ করে lmkd উন্নত করে। কিলিং স্ট্র্যাটেজি মেমরি প্রেসার শনাক্তকরণের জন্য PSI মেকানিজম ব্যবহার করে যা Android 10-এ চালু করা হয়েছে। lmkd-এ Android 11 মেমরি রিসোর্স ব্যবহারের লেভেল ও থ্র্যাশিংয়ের জন্য দায়ী, যাতে মেমরি স্টারভেশন ও পারফর্ম্যান্সের অবনতি আটকানো যায়। এই কিলিং স্ট্র্যাটেজি আগের স্ট্র্যাটেজিকে প্রতিস্থাপন করে এবং এটি হাই-পারফর্ম্যান্স ও কম RAM (Android Go) ডিভাইস, দু'টিতেই ব্যবহার করা যেতে পারে।

কার্নেল সংক্রান্ত প্রয়োজনীয়তা

Android 11 ডিভাইসের জন্য, lmkd-এর নিম্নলিখিত কার্নেল ফিচার প্রয়োজন:

  • PSI প্যাচ অন্তর্ভুক্ত করুন এবং PSI চালু করুন (ব্যাকপোর্ট Android কমন কার্নেল 4.9, 4.14 এবং 4.19-এ উপলভ্য)।
  • PIDFD সাপোর্ট প্যাচ যোগ করুন (Android common kernels 4.9, 4.14 ও 4.19-এ ব্যাকপোর্ট উপলভ্য)।
  • কম RAM-এর ডিভাইসের জন্য, মেমরি cgroups অন্তর্ভুক্ত করুন।

নিম্নলিখিত কনফিগারেশন সেটিংস সহ কার্নেল কম্পাইল করতে হবে:

CONFIG_PSI=y

Android 11-এ lmkd কনফিগার করুন

Android 11-এ মেমরি কিলিং স্ট্র্যাটেজি নিচে তালিকাভুক্ত টিউনিং নব ও ডিফল্টকে সাপোর্ট করে। এইসব ফিচার হাই-পারফর্ম্যান্স ও কম র‌্যাম দুটি ডিভাইসেই কাজ করে।

প্রপার্টি ব্যবহার করুন ডিফল্ট
হাই পারফর্ম্যান্স কম RAM
ro.lmk.psi_partial_stall_ms কম মেমরি বিজ্ঞপ্তি ট্রিগার করার জন্য আংশিক PSI স্টল থ্রেশহোল্ড, মিলিসেকেন্ডে। ডিভাইসটি যদি খুব দেরিতে মেমরি প্রেসার বিজ্ঞপ্তি পায়, তাহলে আরও আগে বিজ্ঞপ্তি ট্রিগার করতে এই মানটি কমিয়ে দিন। মেমরি প্রেশার সংক্রান্ত বিজ্ঞপ্তি অযথা ট্রিগার হলে, এই ভ্যালু বাড়িয়ে ডিভাইসটিকে নয়েজের প্রতি কম সংবেদনশীল করে তুলুন। 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

নিম্নলিখিত পুরনো টিউনিং নবও নতুন কিলিং স্ট্র্যাটেজির সাথে কাজ করে।

প্রপার্টি ব্যবহার করুন ডিফল্ট
হাই পারফর্ম্যান্স কম RAM
ro.lmk.swap_free_low_percentage মোট সয়াপ স্পেসের শতাংশ হিসেবে ফ্রি সয়াপের লেভেল। `lmkd` কখন সিস্টেমকে সোয়াপ স্পেসের অভাবযুক্ত হিসেবে বিবেচনা করতে হবে তার থ্রেশহোল্ড হিসেবে এই ভ্যালু ব্যবহার করে। যদি `lmkd` সোয়াপে অনেক জায়গা থাকা সত্ত্বেও কিল করে, তাহলে শতকরা হার কমান। `lmkd` কিল যদি খুব দেরিতে হয়, তাহলে OOM কিল হওয়ার সম্ভাবনা থাকে, তাই শতাংশের হার বাড়িয়ে দিন। 20 10
ro.lmk.debug এটি `lmkd` ডিবাগ লগ চালু করে। টিউন করার সময় ডিবাগ করার সুবিধা চালু করুন। false