অ্যান্ড্রয়েড লো মেমরি কিলার ডেমন ( lmkd
) প্রসেস একটি চলমান অ্যান্ড্রয়েড সিস্টেমের মেমরি স্টেট নিরীক্ষণ করে এবং সিস্টেমটিকে গ্রহণযোগ্য মাত্রায় পারফর্ম করতে ন্যূনতম প্রয়োজনীয় প্রক্রিয়াগুলিকে মেরে উচ্চ মেমরির চাপে প্রতিক্রিয়া দেখায়।
স্মৃতির চাপ সম্পর্কে
সমান্তরালভাবে একাধিক প্রক্রিয়া চলমান একটি অ্যান্ড্রয়েড সিস্টেম এমন পরিস্থিতির সম্মুখীন হতে পারে যখন সিস্টেম মেমরি শেষ হয়ে যায় এবং প্রসেসগুলির জন্য আরও মেমরির অভিজ্ঞতার প্রয়োজন হয় লক্ষণীয় বিলম্ব। মেমরির চাপ , এমন একটি অবস্থা যেখানে সিস্টেমের মেমরির অভাব রয়েছে, এর জন্য Android-এর প্রয়োজন মেমরি মুক্ত করার জন্য (চাপ কমানোর জন্য) গুরুত্বহীন প্রক্রিয়াগুলিকে থ্রটলিং বা হত্যা করে, প্রক্রিয়াগুলিকে ননক্রিটিক্যাল ক্যাশেড রিসোর্স মুক্ত করার জন্য অনুরোধ করা ইত্যাদি।
ঐতিহাসিকভাবে, অ্যান্ড্রয়েড একটি ইন-কারনেল লো মেমরি কিলার (LMK) ড্রাইভার ব্যবহার করে সিস্টেম মেমরির চাপ নিরীক্ষণ করে, একটি কঠোর প্রক্রিয়া যা হার্ড-কোডেড মানগুলির উপর নির্ভর করে। কার্নেল 4.12 অনুযায়ী, আপস্ট্রিম কার্নেল থেকে LMK ড্রাইভার অপসারণ করা হয়েছে এবং userspace lmkd
মেমরি পর্যবেক্ষণ ও প্রক্রিয়া হত্যার কাজ সম্পাদন করে।
চাপ স্টল তথ্য
Android 10 এবং উচ্চতর একটি নতুন lmkd
মোড সমর্থন করে যা মেমরি চাপ সনাক্তকরণের জন্য কার্নেল চাপ স্টল তথ্য (PSI) মনিটর ব্যবহার করে। আপস্ট্রিম কার্নেলের PSI প্যাচসেট (4.9 এবং 4.14 কার্নেলে ব্যাকপোর্ট করা হয়েছে) মেমরির স্বল্পতার ফলে কাজগুলি কতটা বিলম্বিত হয় তা পরিমাপ করে। যেহেতু এই বিলম্বগুলি সরাসরি ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে, তারা মেমরির চাপের তীব্রতা নির্ধারণের জন্য একটি সুবিধাজনক মেট্রিক উপস্থাপন করে। আপস্ট্রিম কার্নেলের মধ্যে PSI মনিটরও রয়েছে যা বিশেষ সুবিধাপ্রাপ্ত ইউজারস্পেস প্রসেসগুলিকে (যেমন lmkd
) এই বিলম্বের জন্য থ্রেশহোল্ড নির্দিষ্ট করতে এবং থ্রেশহোল্ড লঙ্ঘন হলে কার্নেল থেকে ইভেন্টগুলিতে সাবস্ক্রাইব করার অনুমতি দেয়।
PSI মনিটর বনাম vmpressure সংকেত
যেহেতু vmpressure
সংকেতগুলি (মেমরির চাপ সনাক্তকরণের জন্য কার্নেল দ্বারা উত্পন্ন এবং lmkd
দ্বারা ব্যবহৃত) প্রায়শই অনেকগুলি মিথ্যা পজিটিভ অন্তর্ভুক্ত করে, lmkd
অবশ্যই মেমরিটি প্রকৃত চাপের অধীনে রয়েছে কিনা তা নির্ধারণ করতে ফিল্টারিং করতে হবে। এর ফলে অপ্রয়োজনীয় lmkd
ওয়েকআপ এবং অতিরিক্ত কম্পিউটেশনাল রিসোর্স ব্যবহার করা হয়। PSI মনিটর ব্যবহার করার ফলে আরও সঠিক মেমরির চাপ সনাক্ত করা যায় এবং ওভারহেড ফিল্টারিং কমিয়ে দেয়।
PSI মনিটর ব্যবহার করুন
vmpressure
ইভেন্টের পরিবর্তে PSI মনিটর ব্যবহার করতে, ro.lmk.use_psi
বৈশিষ্ট্য কনফিগার করুন। ডিফল্ট true
, PSI lmkd
জন্য মেমরির চাপ সনাক্তকরণের ডিফল্ট প্রক্রিয়া নিরীক্ষণ করে। যেহেতু PSI মনিটরগুলির জন্য কার্নেল সমর্থন প্রয়োজন, কার্নেলে অবশ্যই PSI ব্যাকপোর্ট প্যাচগুলি অন্তর্ভুক্ত করতে হবে এবং PSI সমর্থন সক্রিয় ( CONFIG_PSI=y
) দিয়ে কম্পাইল করতে হবে।
ইন-কারনেল LMK ড্রাইভারের ত্রুটি
Android অনেক সমস্যার কারণে LMK ড্রাইভারকে অবমূল্যায়ন করে, যার মধ্যে রয়েছে:
- লো-র্যাম ডিভাইসগুলিকে আক্রমনাত্মকভাবে টিউন করতে হয়েছিল, এবং তারপরেও বড় ফাইল-ব্যাকড সক্রিয় পেজক্যাশে ওয়ার্কলোডগুলিতে খারাপভাবে কাজ করবে। খারাপ পারফরম্যান্সের ফলে মারধর এবং কোনো হত্যাকাণ্ড ঘটেনি।
- LMK কার্নেল ড্রাইভার ফ্রি-মেমরি সীমার উপর নির্ভর করে, মেমরির চাপের উপর ভিত্তি করে কোন স্কেলিং ছাড়াই।
- ডিজাইনের অনমনীয়তার কারণে, অংশীদাররা প্রায়ই ড্রাইভারকে কাস্টমাইজ করে যাতে এটি তাদের ডিভাইসে কাজ করে।
- LMK ড্রাইভার স্ল্যাব সংকোচনকারী API এর সাথে যুক্ত ছিল, যা লক্ষ্যবস্তু অনুসন্ধান এবং তাদের হত্যা করার মতো ভারী অপারেশনের জন্য ডিজাইন করা হয়নি, যা
vmscan
প্রক্রিয়াটিকে ধীর করে দেয়।
ইউজারস্পেস lmkd
userpace lmkd
ইন-কারনেল ড্রাইভারের মতো একই কার্যকারিতা প্রয়োগ করে কিন্তু মেমরির চাপ সনাক্ত ও অনুমান করার জন্য বিদ্যমান কার্নেল প্রক্রিয়া ব্যবহার করে। মেমরির চাপের মাত্রা সম্পর্কে বিজ্ঞপ্তি পেতে কার্নেল-জেনারেটেড vmpressure
ইভেন্ট বা প্রেসার স্টল ইনফরমেশন (PSI) মনিটর ব্যবহার করা এবং প্রক্রিয়া গুরুত্বের উপর ভিত্তি করে প্রতিটি প্রক্রিয়ার জন্য বরাদ্দ করা মেমরি সংস্থানগুলিকে সীমিত করার জন্য মেমরি cgroup বৈশিষ্ট্যগুলি ব্যবহার করা অন্তর্ভুক্ত।
Android 10 এ userpace lmkd ব্যবহার করুন
অ্যান্ড্রয়েড 9 এবং উচ্চতর তে, ইন-কার্নেল LMK ড্রাইভার সনাক্ত না হলে ইউজারস্পেস lmkd
সক্রিয় হয়। যেহেতু userpace 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 | ন্যূনতম oom_adj স্কোর গুরুত্বপূর্ণ vmpressure স্তরে মারা যাওয়ার যোগ্য প্রসেসের জন্য। | 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
অ্যান্ড্রয়েড 11 এ ইউজারস্পেস lmkd
অ্যান্ড্রয়েড 11 একটি নতুন হত্যা কৌশল প্রবর্তন করে lmkd
কে উন্নত করে। হত্যার কৌশলটি অ্যান্ড্রয়েড 10-এ প্রবর্তিত মেমরির চাপ সনাক্তকরণের জন্য একটি PSI প্রক্রিয়া ব্যবহার করে। Android 11-এ lmkd
মেমরি রিসোর্স ব্যবহারের মাত্রা এবং মেমরির অনাহার এবং কর্মক্ষমতা হ্রাস রোধ করার জন্য থ্র্যাশিং অ্যাকাউন্ট। এই হত্যার কৌশলটি পূর্ববর্তী কৌশলগুলিকে প্রতিস্থাপন করে এবং উচ্চ-কর্মক্ষমতা এবং কম-র্যাম (Android Go) উভয় ডিভাইসেই ব্যবহার করা যেতে পারে।
কার্নেলের প্রয়োজনীয়তা
Android 11 ডিভাইসের জন্য, lmkd
নিম্নলিখিত কার্নেল বৈশিষ্ট্যগুলির প্রয়োজন:
- PSI প্যাচগুলি অন্তর্ভুক্ত করুন এবং PSI সক্ষম করুন (অ্যান্ড্রয়েড সাধারণ কার্নেল 4.9, 4.14 এবং 4.19 এ উপলব্ধ ব্যাকপোর্ট)।
- পিআইডিএফডি সমর্থন প্যাচগুলি অন্তর্ভুক্ত করুন (অ্যান্ড্রয়েড সাধারণ কার্নেল 4.9, 4.14 এবং 4.19 এ উপলব্ধ ব্যাকপোর্ট)।
- কম RAM ডিভাইসের জন্য, মেমরি cgroups অন্তর্ভুক্ত করুন।
কার্নেল অবশ্যই নিম্নলিখিত কনফিগারেশন সেটিংসের সাথে কম্পাইল করা উচিত:
CONFIG_PSI=y
Android 11 এ lmkd কনফিগার করুন
অ্যান্ড্রয়েড 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 | মোট অদলবদলযোগ্য মেমরির শতাংশ হিসাবে অদলবদল করা মেমরির সর্বাধিক পরিমাণ। যখন অদলবদল করা মেমরি এই সীমার উপরে বৃদ্ধি পায়, এর মানে হল যে সিস্টেমটি তার বেশিরভাগ অদলবদলযোগ্য মেমরি অদলবদল করেছে এবং এখনও চাপের মধ্যে রয়েছে। এটি ঘটতে পারে যখন অ-অদলবদলযোগ্য বরাদ্দগুলি মেমরির চাপ তৈরি করে যা অদলবদল করে উপশম করা যায় না কারণ বেশিরভাগ অদলবদলযোগ্য মেমরি ইতিমধ্যেই অদলবদল হয়ে গেছে। ডিফল্ট মান হল 100, যা কার্যকরভাবে এই চেকটিকে নিষ্ক্রিয় করে। যদি মেমরির চাপের সময় ডিভাইসের কর্মক্ষমতা প্রভাবিত হয় যখন সোয়াপ ব্যবহার বেশি হয় এবং বিনামূল্যের সোয়াপ স্তর 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 |