কার্নেল কনফিগারেশন

একটি Android কার্নেল কনফিগারেশনের জন্য একটি বেস হিসাবে নিম্নলিখিত কনফিগারেশন সেটিংস ব্যবহার করুন৷ android-base , android-base- ARCH , এবং android-recommended -এর জন্য সেটিংস .cfg ফাইলগুলিতে সংগঠিত হয়:

  • android-base বিকল্পগুলি মূল অ্যান্ড্রয়েড বৈশিষ্ট্যগুলিকে সক্ষম করে এবং সমস্ত ডিভাইসের দ্বারা নির্দিষ্ট করা হিসাবে কনফিগার করা উচিত৷
  • android-base- ARCH বিকল্পগুলি মূল Android বৈশিষ্ট্যগুলিকে সক্ষম করে এবং আর্কিটেকচার ARCH এর সমস্ত ডিভাইস দ্বারা নির্দিষ্ট করা হিসাবে কনফিগার করা উচিত৷ সমস্ত আর্কিটেকচারে আর্কিটেকচার-নির্দিষ্ট প্রয়োজনীয় বিকল্পগুলির একটি সংশ্লিষ্ট ফাইল নেই। আপনার আর্কিটেকচারে যদি কোনো ফাইল না থাকে, তাহলে এতে Android-এর জন্য অতিরিক্ত আর্কিটেকচার-নির্দিষ্ট কার্নেল কনফিগারেশনের প্রয়োজনীয়তা নেই।
  • android-recommended । এই বিকল্পগুলি উন্নত Android বৈশিষ্ট্যগুলি সক্ষম করে এবং ডিভাইসগুলির জন্য ঐচ্ছিক৷

এই কনফিগারেশন ফাইলগুলি kernel/configs রেপোতে অবস্থিত। কনফিগারেশন ফাইলের সেট ব্যবহার করুন যা আপনার ব্যবহার করা কার্নেলের সংস্করণের সাথে মিলে যায়।

আপনার ডিভাইসে কার্নেলকে শক্তিশালী করার জন্য ইতিমধ্যে গৃহীত নিয়ন্ত্রণগুলির বিশদ বিবরণের জন্য, সিস্টেম এবং কার্নেল নিরাপত্তা দেখুন। প্রয়োজনীয় সেটিংসের বিশদ বিবরণের জন্য, অ্যান্ড্রয়েড সামঞ্জস্যপূর্ণ সংজ্ঞা নথি (CDD) দেখুন।

কার্নেল কনফিগারেশন তৈরি করুন

ন্যূনতম defconfig বিন্যাস আছে এমন ডিভাইসগুলির জন্য, বিকল্পগুলি সক্রিয় করতে কার্নেল ট্রিতে merge_config.sh স্ক্রিপ্ট ব্যবহার করুন:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

এটি একটি .config ফাইল তৈরি করে যা আপনি একটি নতুন defconfig ফাইল সংরক্ষণ করতে বা অ্যান্ড্রয়েড বৈশিষ্ট্যগুলি সক্ষম করে একটি নতুন কার্নেল কম্পাইল করতে ব্যবহার করতে পারেন।

অতিরিক্ত কার্নেল কনফিগারেশন প্রয়োজনীয়তা

কিছু ক্ষেত্রে, প্ল্যাটফর্ম রক্ষণাবেক্ষণকারী একটি অ্যান্ড্রয়েড নির্ভরতা সন্তুষ্ট করতে একাধিক কার্নেল বৈশিষ্ট্য থেকে বেছে নিতে পারে। এই ধরনের নির্ভরতা কার্নেল কনফিগারেশন ফ্র্যাগমেন্ট ফাইলে প্রকাশ করা যায় না (উপরে বর্ণিত) কারণ এই ফাইলগুলির বিন্যাস লজিক্যাল এক্সপ্রেশন সমর্থন করে না। অ্যান্ড্রয়েড 9 এবং উচ্চতর, সামঞ্জস্য পরীক্ষা স্যুট (CTS) এবং ভেন্ডর টেস্ট স্যুট (VTS) যাচাই করে যে নিম্নলিখিত প্রয়োজনীয়তাগুলি সন্তুষ্ট:

  • CONFIG_OF=y বা CONFIG_ACPI=y
  • 4.4 এবং 4.9 কার্নেলের CONFIG_ANDROID_LOW_MEMORY_KILLER=y বা CONFIG_MEMCG=y এবং CONFIG_MEMCG_SWAP=y উভয়ই আছে
  • CONFIG_DEBUG_RODATA=y বা CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y বা CONFIG_STRICT_MODULE_RWX=y
  • শুধুমাত্র ARM64 এর জন্য: CONFIG_ARM64_SW_TTBR0_PAN=y বা CONFIG_ARM64_PAN=y

এছাড়াও, CONFIG_INET_UDP_DIAG বিকল্পটি Android 9 এবং উচ্চতর 4.9 কার্নেলের জন্য y তে সেট করা আবশ্যক৷

USB হোস্ট মোড বিকল্পগুলি সক্ষম করুন৷

USB হোস্ট মোড অডিওর জন্য, নিম্নলিখিত বিকল্পগুলি সক্ষম করুন:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

USB হোস্ট মোড MIDI-এর জন্য, নিম্নলিখিত বিকল্পটি সক্ষম করুন:

CONFIG_SND_USB_MIDI=y

TSYNC সহ Seccomp BPF

সিকিউর কম্পিউটিং বার্কলে প্যাকেট ফিল্টার (Seccomp BPF) হল একটি কার্নেল নিরাপত্তা প্রযুক্তি যা স্যান্ডবক্স তৈরি করতে সক্ষম করে যা প্রেক্ষাপটকে সংজ্ঞায়িত করে যেখানে একটি প্রক্রিয়া সিস্টেম কল করতে পারে। থ্রেড সিঙ্ক্রোনাইজেশন (TSYNC) বৈশিষ্ট্যটি মাল্টিথ্রেডেড প্রোগ্রাম থেকে Seccomp BPF ব্যবহার করতে সক্ষম করে। এই ক্ষমতাটি সীমাবদ্ধ আর্কিটেকচারের মধ্যে যেখানে Seccomp সমর্থন আপস্ট্রিম (ARM, ARM64, x86, এবং x86_64) আছে।

অ্যান্ড্রয়েড লাইভ-লক ডেমন

অ্যান্ড্রয়েড 10 এ অ্যান্ড্রয়েড লাইভ-লক ডেমন ( llkd ) অন্তর্ভুক্ত রয়েছে, যা কার্নেল অচলাবস্থাকে ধরা এবং প্রশমিত করার জন্য ডিজাইন করা হয়েছে। llkd ব্যবহার সম্পর্কে বিস্তারিত জানার জন্য, Android লাইভ-লক ডেমন দেখুন।

ARM64 এ vDSO32

ভার্চুয়াল ডাইনামিক শেয়ার্ড অবজেক্ট (vDSO) হল সিস্টেম কলের একটি বিকল্প যা সঠিকভাবে ব্যবহার করা এবং কনফিগার করা হলে, চক্রের খরচ কমাতে পারে। Android 10 64-বিট কার্নেলে vDSO32 এর জন্য সমর্থন যোগ করে (Android ইতিমধ্যে 64-বিট কার্নেলে vDSO64 এবং 32-বিট কার্নেলে vDSO32 সমর্থন করে)। ARM64 আর্কিটেকচারে vDSO32 ( CONFIG_VDSO_COMPAT ) ব্যবহার করা ব্যাটারি লাইফ এবং অন্যান্য কর্মক্ষমতা উন্নতিতে 0.4 শতাংশ বৃদ্ধি প্রদান করে।

লিনাক্স সম্প্রদায় সক্রিয়ভাবে স্থাপত্য জুড়ে vDSO গুলিকে একীভূত করার জন্য কাজ করছে। আপনি CONFIG_COMPAT এর সাথে vDSO32 এবং arm32 কম্পাইলার ট্রিপলেট সহ CONFIG_CROSS_COMPILE_COMPAT_VDSO সক্রিয় করে আপনার লিনাক্স কার্নেলে vDSO সেট আপ করতে পারেন। অ্যান্ড্রয়েড কার্নেল টিম পিক্সেল ডিভাইসগুলিতে vDSO প্যাচ সিরিজের পুরানো সংস্করণগুলি ব্যাকপোর্ট করেছে, যাতে আপনি পিক্সেল কার্নেল বিল্ডগুলিতে উদাহরণগুলি খুঁজে পেতে পারেন ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN পাথ, CROSS_COMPILE_ARM32 রেফারেন্স, এবং CONSOSPILE_ARM32 রেফারেন্স এবং CONFIG_CROSS_COMPILE_ARM32 )।

কম RAM কনফিগারেশন

সরাসরি পুনরুদ্ধার কমাতে কার্নেল এবং অ্যাক্টিভিটি ম্যানেজার টিউন করুন

সরাসরি পুনরুদ্ধার ঘটে যখন একটি প্রক্রিয়া বা কার্নেল মেমরির একটি পৃষ্ঠা বরাদ্দ করার চেষ্টা করে (হয় সরাসরি বা একটি নতুন পৃষ্ঠায় ত্রুটির কারণে) এবং কার্নেল উপলব্ধ সমস্ত বিনামূল্যের মেমরি ব্যবহার করে। এর জন্য কার্নেলকে একটি পৃষ্ঠা মুক্ত করার সময় বরাদ্দ ব্লক করতে হবে। এর ফলে প্রায়ই একটি নোংরা ফাইল-ব্যাকড পৃষ্ঠা ফ্লাশ করার জন্য ডিস্ক I/O প্রয়োজন হয় বা একটি প্রক্রিয়া বন্ধ করার জন্য lowmemorykiller জন্য অপেক্ষা করতে হয়। এর ফলে UI থ্রেড সহ যেকোনো থ্রেডে অতিরিক্ত I/O হতে পারে।

সরাসরি পুনরুদ্ধার এড়াতে, কার্নেলে ওয়াটারমার্ক রয়েছে যা kswapd বা ব্যাকগ্রাউন্ড পুনরুদ্ধারকে ট্রিগার করে। এটি একটি থ্রেড যা পৃষ্ঠাগুলিকে মুক্ত করার চেষ্টা করে যাতে পরের বার একটি বাস্তব থ্রেড বরাদ্দ করা হলে, এটি দ্রুত সফল হতে পারে।

ব্যাকগ্রাউন্ড পুনরুদ্ধার ট্রিগার করার ডিফল্ট থ্রেশহোল্ড মোটামুটি কম, একটি 2 GB ডিভাইসে প্রায় 2 MB এবং একটি 512 MB ডিভাইসে 636 KB। কার্নেল ব্যাকগ্রাউন্ড পুনরুদ্ধারে মাত্র কয়েক মেগাবাইট মেমরি পুনরুদ্ধার করে। এর মানে হল যে কোনও প্রক্রিয়া যা দ্রুত কয়েক মেগাবাইটের বেশি বরাদ্দ করে তা দ্রুত সরাসরি পুনরুদ্ধারে আঘাত করতে চলেছে।

একটি কার্নেল টিউনেবলের জন্য সমর্থন প্যাচ 92189d47f66c67e5fd92eafaa287e153197a454f ("অতিরিক্ত বিনামূল্যে kbytes টিউনযোগ্য যোগ করুন") হিসাবে Android-3.4 কার্নেল শাখায় যোগ করা হয়েছে। এই প্যাচটিকে একটি ডিভাইসের কার্নেলে চেরি-পিক করা ActivityManager কার্নেলকে তিনটি পূর্ণ-স্ক্রীন 32 bpp বাফার মেমরি মুক্ত রাখার চেষ্টা করতে বলে দেয়।

These thresholds can be configured with the config.xml framework.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value increases the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value increases the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller টিউন করুন

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

ফাইল-ব্যাকড পৃষ্ঠাগুলির জন্য খুব বেশি মেমরি সংরক্ষিত হলে থ্রেশহোল্ডগুলি হ্রাস করা যেতে পারে, যাতে ক্যাশে খুব ছোট হওয়ার কারণে ডিস্ক থ্র্যাশিং ঘটতে পারে এমন অনেক আগেই ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি বন্ধ হয়ে যায়।

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value keeps more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value causes the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value
keeps more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>
,

একটি Android কার্নেল কনফিগারেশনের জন্য একটি বেস হিসাবে নিম্নলিখিত কনফিগারেশন সেটিংস ব্যবহার করুন৷ android-base , android-base- ARCH , এবং android-recommended -এর জন্য সেটিংস .cfg ফাইলগুলিতে সংগঠিত হয়:

  • android-base বিকল্পগুলি মূল অ্যান্ড্রয়েড বৈশিষ্ট্যগুলিকে সক্ষম করে এবং সমস্ত ডিভাইসের দ্বারা নির্দিষ্ট করা হিসাবে কনফিগার করা উচিত৷
  • android-base- ARCH বিকল্পগুলি মূল Android বৈশিষ্ট্যগুলিকে সক্ষম করে এবং আর্কিটেকচার ARCH এর সমস্ত ডিভাইস দ্বারা নির্দিষ্ট করা হিসাবে কনফিগার করা উচিত৷ সমস্ত আর্কিটেকচারে আর্কিটেকচার-নির্দিষ্ট প্রয়োজনীয় বিকল্পগুলির একটি সংশ্লিষ্ট ফাইল নেই। আপনার আর্কিটেকচারে যদি কোনো ফাইল না থাকে, তাহলে এতে Android-এর জন্য অতিরিক্ত আর্কিটেকচার-নির্দিষ্ট কার্নেল কনফিগারেশনের প্রয়োজনীয়তা নেই।
  • android-recommended । এই বিকল্পগুলি উন্নত Android বৈশিষ্ট্যগুলি সক্ষম করে এবং ডিভাইসগুলির জন্য ঐচ্ছিক৷

These configuration files are located in the kernel/configs repo. কনফিগারেশন ফাইলের সেট ব্যবহার করুন যা আপনার ব্যবহার করা কার্নেলের সংস্করণের সাথে মিলে যায়।

আপনার ডিভাইসে কার্নেলকে শক্তিশালী করার জন্য ইতিমধ্যে গৃহীত নিয়ন্ত্রণগুলির বিশদ বিবরণের জন্য, সিস্টেম এবং কার্নেল নিরাপত্তা দেখুন। প্রয়োজনীয় সেটিংসের বিশদ বিবরণের জন্য, অ্যান্ড্রয়েড সামঞ্জস্যপূর্ণ সংজ্ঞা নথি (CDD) দেখুন।

কার্নেল কনফিগারেশন তৈরি করুন

ন্যূনতম defconfig বিন্যাস আছে এমন ডিভাইসগুলির জন্য, বিকল্পগুলি সক্রিয় করতে কার্নেল ট্রিতে merge_config.sh স্ক্রিপ্ট ব্যবহার করুন:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

এটি একটি .config ফাইল তৈরি করে যা আপনি একটি নতুন defconfig ফাইল সংরক্ষণ করতে বা অ্যান্ড্রয়েড বৈশিষ্ট্যগুলি সক্ষম করে একটি নতুন কার্নেল কম্পাইল করতে ব্যবহার করতে পারেন।

অতিরিক্ত কার্নেল কনফিগারেশন প্রয়োজনীয়তা

কিছু ক্ষেত্রে, প্ল্যাটফর্ম রক্ষণাবেক্ষণকারী একটি অ্যান্ড্রয়েড নির্ভরতা সন্তুষ্ট করতে একাধিক কার্নেল বৈশিষ্ট্য থেকে বেছে নিতে পারে। এই ধরনের নির্ভরতা কার্নেল কনফিগারেশন ফ্র্যাগমেন্ট ফাইলে প্রকাশ করা যায় না (উপরে বর্ণিত) কারণ এই ফাইলগুলির বিন্যাস লজিক্যাল এক্সপ্রেশন সমর্থন করে না। অ্যান্ড্রয়েড 9 এবং উচ্চতর, সামঞ্জস্য পরীক্ষা স্যুট (CTS) এবং ভেন্ডর টেস্ট স্যুট (VTS) যাচাই করে যে নিম্নলিখিত প্রয়োজনীয়তাগুলি সন্তুষ্ট:

  • CONFIG_OF=y বা CONFIG_ACPI=y
  • 4.4 এবং 4.9 কার্নেলের CONFIG_ANDROID_LOW_MEMORY_KILLER=y বা CONFIG_MEMCG=y এবং CONFIG_MEMCG_SWAP=y উভয়ই আছে
  • CONFIG_DEBUG_RODATA=y বা CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y বা CONFIG_STRICT_MODULE_RWX=y
  • শুধুমাত্র ARM64 এর জন্য: CONFIG_ARM64_SW_TTBR0_PAN=y বা CONFIG_ARM64_PAN=y

এছাড়াও, CONFIG_INET_UDP_DIAG বিকল্পটি Android 9 এবং উচ্চতর 4.9 কার্নেলের জন্য y তে সেট করা আবশ্যক৷

USB হোস্ট মোড বিকল্পগুলি সক্ষম করুন৷

USB হোস্ট মোড অডিওর জন্য, নিম্নলিখিত বিকল্পগুলি সক্ষম করুন:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

USB হোস্ট মোড MIDI-এর জন্য, নিম্নলিখিত বিকল্পটি সক্ষম করুন:

CONFIG_SND_USB_MIDI=y

TSYNC সহ Seccomp BPF

সিকিউর কম্পিউটিং বার্কলে প্যাকেট ফিল্টার (Seccomp BPF) হল একটি কার্নেল নিরাপত্তা প্রযুক্তি যা স্যান্ডবক্স তৈরি করতে সক্ষম করে যা প্রেক্ষাপটকে সংজ্ঞায়িত করে যেখানে একটি প্রক্রিয়া সিস্টেম কল করতে পারে। থ্রেড সিঙ্ক্রোনাইজেশন (TSYNC) বৈশিষ্ট্যটি মাল্টিথ্রেডেড প্রোগ্রাম থেকে Seccomp BPF ব্যবহার করতে সক্ষম করে। এই ক্ষমতাটি সীমাবদ্ধ আর্কিটেকচারের মধ্যে যেখানে Seccomp সমর্থন আপস্ট্রিম (ARM, ARM64, x86, এবং x86_64) আছে।

অ্যান্ড্রয়েড লাইভ-লক ডেমন

অ্যান্ড্রয়েড 10 এ অ্যান্ড্রয়েড লাইভ-লক ডেমন ( llkd ) অন্তর্ভুক্ত রয়েছে, যা কার্নেল অচলাবস্থাকে ধরা এবং প্রশমিত করার জন্য ডিজাইন করা হয়েছে। llkd ব্যবহার সম্পর্কে বিস্তারিত জানার জন্য, Android লাইভ-লক ডেমন দেখুন।

ARM64 এ vDSO32

ভার্চুয়াল ডাইনামিক শেয়ার্ড অবজেক্ট (vDSO) হল সিস্টেম কলের একটি বিকল্প যা সঠিকভাবে ব্যবহার করা এবং কনফিগার করা হলে, চক্রের খরচ কমাতে পারে। Android 10 64-বিট কার্নেলে vDSO32 এর জন্য সমর্থন যোগ করে (Android ইতিমধ্যে 64-বিট কার্নেলে vDSO64 এবং 32-বিট কার্নেলে vDSO32 সমর্থন করে)। ARM64 আর্কিটেকচারে vDSO32 ( CONFIG_VDSO_COMPAT ) ব্যবহার করা ব্যাটারি লাইফ এবং অন্যান্য কর্মক্ষমতা উন্নতিতে 0.4 শতাংশ বৃদ্ধি প্রদান করে।

লিনাক্স সম্প্রদায় সক্রিয়ভাবে স্থাপত্য জুড়ে vDSO গুলিকে একীভূত করার জন্য কাজ করছে। আপনি CONFIG_COMPAT এর সাথে vDSO32 এবং arm32 কম্পাইলার ট্রিপলেট সহ CONFIG_CROSS_COMPILE_COMPAT_VDSO সক্রিয় করে আপনার লিনাক্স কার্নেলে vDSO সেট আপ করতে পারেন। অ্যান্ড্রয়েড কার্নেল টিম পিক্সেল ডিভাইসগুলিতে vDSO প্যাচ সিরিজের পুরানো সংস্করণগুলি ব্যাকপোর্ট করেছে, যাতে আপনি পিক্সেল কার্নেল বিল্ডগুলিতে উদাহরণগুলি খুঁজে পেতে পারেন ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN পাথ, CROSS_COMPILE_ARM32 রেফারেন্স, এবং CONSOSPILE_ARM32 রেফারেন্স এবং CONFIG_CROSS_COMPILE_ARM32 )।

কম RAM কনফিগারেশন

সরাসরি পুনরুদ্ধার কমাতে কার্নেল এবং অ্যাক্টিভিটি ম্যানেজার টিউন করুন

সরাসরি পুনরুদ্ধার ঘটে যখন একটি প্রক্রিয়া বা কার্নেল মেমরির একটি পৃষ্ঠা বরাদ্দ করার চেষ্টা করে (হয় সরাসরি বা একটি নতুন পৃষ্ঠায় ত্রুটির কারণে) এবং কার্নেল উপলব্ধ সমস্ত বিনামূল্যের মেমরি ব্যবহার করে। এর জন্য কার্নেলকে একটি পৃষ্ঠা মুক্ত করার সময় বরাদ্দ ব্লক করতে হবে। এর ফলে প্রায়ই একটি নোংরা ফাইল-ব্যাকড পৃষ্ঠা ফ্লাশ করার জন্য ডিস্ক I/O প্রয়োজন হয় বা একটি প্রক্রিয়া বন্ধ করার জন্য lowmemorykiller জন্য অপেক্ষা করতে হয়। এর ফলে UI থ্রেড সহ যেকোনো থ্রেডে অতিরিক্ত I/O হতে পারে।

সরাসরি পুনরুদ্ধার এড়াতে, কার্নেলে ওয়াটারমার্ক রয়েছে যা kswapd বা ব্যাকগ্রাউন্ড পুনরুদ্ধারকে ট্রিগার করে। এটি একটি থ্রেড যা পৃষ্ঠাগুলিকে মুক্ত করার চেষ্টা করে যাতে পরের বার একটি বাস্তব থ্রেড বরাদ্দ করা হলে, এটি দ্রুত সফল হতে পারে।

ব্যাকগ্রাউন্ড পুনরুদ্ধার ট্রিগার করার ডিফল্ট থ্রেশহোল্ড মোটামুটি কম, একটি 2 GB ডিভাইসে প্রায় 2 MB এবং একটি 512 MB ডিভাইসে 636 KB। কার্নেল ব্যাকগ্রাউন্ড পুনরুদ্ধারে মাত্র কয়েক মেগাবাইট মেমরি পুনরুদ্ধার করে। এর মানে হল যে কোনও প্রক্রিয়া যা দ্রুত কয়েক মেগাবাইটের বেশি বরাদ্দ করে তা দ্রুত সরাসরি পুনরুদ্ধারে আঘাত করতে চলেছে।

একটি কার্নেল টিউনেবলের জন্য সমর্থন প্যাচ 92189d47f66c67e5fd92eafaa287e153197a454f ("অতিরিক্ত বিনামূল্যে kbytes টিউনযোগ্য যোগ করুন") হিসাবে Android-3.4 কার্নেল শাখায় যোগ করা হয়েছে। এই প্যাচটিকে একটি ডিভাইসের কার্নেলে চেরি-পিক করা ActivityManager কার্নেলকে তিনটি পূর্ণ-স্ক্রীন 32 bpp বাফার মেমরি মুক্ত রাখার চেষ্টা করতে বলে দেয়।

এই থ্রেশহোল্ডগুলি config.xml ফ্রেমওয়ার্কের সাথে কনফিগার করা যেতে পারে।

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value increases the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value increases the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller টিউন করুন

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

ফাইল-ব্যাকড পৃষ্ঠাগুলির জন্য খুব বেশি মেমরি সংরক্ষিত হলে থ্রেশহোল্ডগুলি হ্রাস করা যেতে পারে, যাতে ক্যাশে খুব ছোট হওয়ার কারণে ডিস্ক থ্র্যাশিং ঘটতে পারে এমন অনেক আগেই ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি বন্ধ হয়ে যায়।

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value keeps more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value causes the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value
keeps more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>