กระบวนการ Daemon ที่กำจัดหน่วยความจำต่ำ (lmkd
) ของ Android จะตรวจสอบหน่วยความจำ
ของระบบ Android ที่ทำงานอยู่ และตอบสนองต่อการใช้หน่วยความจำสูงโดยหยุดการทำงาน
กระบวนการที่จำเป็นน้อยที่สุดในการทำให้ระบบทำงานได้ในระดับที่ยอมรับได้
ระดับต่างๆ
เกี่ยวกับแรงกดของหน่วยความจำ
อาจต้องพบกับระบบ Android ที่ใช้หลายกระบวนการพร้อมกัน ถ้าใช้หน่วยความจำของระบบจนหมด และกระบวนการที่ต้องใช้ หน่วยความจำจะล่าช้าอย่างเห็นได้ชัด ความดันหน่วยความจำ ซึ่งเป็นสถานะที่ ระบบใช้หน่วยความจำไม่เพียงพอ ต้องใช้ Android เพื่อเพิ่มหน่วยความจำ แรงกดดัน) โดยการควบคุมหรือยุติกระบวนการที่ไม่สำคัญ ร้องขอ กระบวนการเพื่อเพิ่มพื้นที่ว่างสำหรับทรัพยากรที่แคชไว้ที่ไม่สำคัญ และอื่นๆ
ก่อนหน้านี้ Android ตรวจสอบความดันหน่วยความจำของระบบโดยใช้ในเคอร์เนล
ไดรเวอร์ลดหน่วยความจำ (LMK) ระดับต่ำ กลไกที่แข็งและอาศัยการฮาร์ดโค้ด
สำหรับเคอร์เนล 4.12 ระบบจะนำไดรเวอร์ LMK ออกจากอัปสตรีม
เคอร์เนลและพื้นที่ผู้ใช้ lmkd
ดำเนินการตรวจสอบหน่วยความจำและหยุดทำงานของกระบวนการ
งาน
ข้อมูลหยุดอัดแรงดัน
Android 10 ขึ้นไปรองรับโหมด lmkd
ใหม่ที่
ใช้การตรวจสอบข้อมูลความดันเคอร์เนล (PSI) สำหรับความดันหน่วยความจำ
การตรวจจับ แพตช์ PSI ในเคอร์เนลอัปสตรีม (ย้อนกลับไปยัง 4.9 และ 4.14
เคอร์เนล) วัดระยะเวลาที่งานล่าช้าเนื่องจาก
หน่วยความจำไม่เพียงพอ เนื่องจากความล่าช้าเหล่านี้ส่งผลต่อประสบการณ์ของผู้ใช้โดยตรง
แสดงเมตริกที่สะดวกในการระบุความรุนแรงของแรงดันหน่วยความจำ
เคอร์เนลอัปสตรีมยังมีการตรวจสอบ PSI ที่อนุญาตพื้นที่ผู้ใช้ที่ได้รับสิทธิ์
(เช่น lmkd
) เพื่อระบุเกณฑ์สำหรับความล่าช้าเหล่านี้และเพื่อ
สมัครรับเหตุการณ์จากเคอร์เนลเมื่อมีการละเมิดเกณฑ์
การตรวจสอบ PSI กับสัญญาณ vmpressure
เนื่องจากสัญญาณ vmpressure
(สร้างโดยเคอร์เนลสำหรับหน่วยความจำ
การตรวจจับความดันและใช้โดย lmkd
) มักจะรวมถึงผลบวกลวงจำนวนมาก
lmkd
ต้องทำการกรองเพื่อระบุว่าหน่วยความจำมีแรงกดดันจริงหรือไม่
ซึ่งทำให้เกิดการปลุกระบบ lmkd
โดยไม่จำเป็นและใช้
เพื่อใช้คำนวณทรัพยากรเหล่านี้ การใช้ PSI ตรวจสอบจะช่วยให้ได้หน่วยความจำที่แม่นยำมากขึ้น
การตรวจจับแรงดันและลดค่าใช้จ่ายในการกรอง
ใช้จอภาพ PSI
หากต้องการใช้การตรวจสอบ PSI แทนเหตุการณ์ vmpressure
ให้กำหนดค่า
พร็อพเพอร์ตี้ ro.lmk.use_psi
ค่าเริ่มต้นคือ true
ซึ่งทำให้ PSI ตรวจสอบ
กลไกเริ่มต้นของการตรวจจับความดันหน่วยความจำสำหรับ lmkd
เนื่องจาก PSI ตรวจสอบ
ต้องการการสนับสนุนเคอร์เนล เคอร์เนลต้องมีแพตช์แบ็คพอร์ต PSI และ
คอมไพล์ที่เปิดใช้การสนับสนุน PSI แล้ว (CONFIG_PSI=y
)
ข้อเสียของไดรเวอร์ในเคอร์เนล LMK
Android เลิกใช้งานไดรเวอร์ LMK เนื่องจากปัญหาหลายประการ ได้แก่
- อุปกรณ์แบบ RAM ต่ำต้องได้รับการปรับแต่งในเชิงรุก จากนั้นจึง ทำงานได้ไม่ดีในภาระงานที่มี Pagecache ที่ใช้งานอยู่ซึ่งมีขนาดใหญ่สำรอง ประสิทธิภาพที่ต่ำทำให้เกิดการหวาดเสียวและไม่มีการฆ่า
- ไดรเวอร์เคอร์เนล LMK ใช้ขีดจำกัดหน่วยความจำว่าง โดยไม่มีการปรับเพิ่มสเกล ต่อแรงกดดันหน่วยความจำ
- เนื่องจากการออกแบบที่แข็งแกร่ง พาร์ทเนอร์มักจะปรับแต่งไดรเวอร์ เพื่อให้ทำงานกับอุปกรณ์ของตนได้
- คนขับ LMK ติด Slab Slaber API ซึ่งไม่ใช่
ซึ่งออกแบบมาสำหรับปฏิบัติการหนัก เช่น การค้นหาเป้าหมายและการสังหาร
ซึ่งทำให้กระบวนการ
vmscan
ช้าลง
พื้นที่ผู้ใช้ lmkd
userspace lmkd
ใช้ฟังก์ชันการทำงานเดียวกันกับไดรเวอร์ในเคอร์เนล
แต่ใช้กลไกเคอร์เนลที่มีอยู่เพื่อตรวจหาและประเมินความดันของหน่วยความจำ เช่น
รวมถึงการใช้เหตุการณ์ vmpressure
ที่สร้างขึ้นด้วยเคอร์เนลหรือช่วงที่ใช้แรงดัน
(PSI) เพื่อรับการแจ้งเตือนเกี่ยวกับระดับความดันหน่วยความจำ
และใช้ฟีเจอร์กลุ่มหน่วยความจำเพื่อจำกัดทรัพยากรหน่วยความจำที่จัดสรรให้
ตามความสำคัญของกระบวนการ
ใช้พื้นที่ผู้ใช้ lmkd ใน Android 10
ใน Android 9 ขึ้นไป Userspace lmkd
จะเปิดใช้งานหาก
ตรวจไม่พบไดรเวอร์ในเคอร์เนล LMK เนื่องจากพื้นที่ผู้ใช้ lmkd
ต้องสนับสนุนเคอร์เนลสำหรับกลุ่มหน่วยความจำ เคอร์เนลต้องคอมไพล์ด้วย
การตั้งค่าการกำหนดค่าต่อไปนี้
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
กลยุทธ์การฆ่า
Userspace lmkd
รองรับกลยุทธ์การฆ่าตาม vmpressure
เหตุการณ์หรือ PSI
การตรวจสอบ ความรุนแรง และคำแนะนำอื่นๆ เช่น การใช้งานการสลับ ปิด
กลยุทธ์ที่ต่างกันระหว่างอุปกรณ์ที่มีหน่วยความจำต่ำกับอุปกรณ์ประสิทธิภาพสูง
- ในอุปกรณ์ที่มีหน่วยความจำต่ำ ระบบควรทนต่อความดันของหน่วยความจำที่สูงขึ้นในฐานะ โหมดการทำงานปกติ
- ควรมองว่าความดันของหน่วยความจำเป็นสิ่งผิดปกติในอุปกรณ์ที่มีประสิทธิภาพสูง ปัญหาและแก้ไขก่อนที่จะมีผลต่อประสิทธิภาพโดยรวม
คุณกำหนดค่ากลยุทธ์การหยุดทำงานได้โดยใช้พร็อพเพอร์ตี้ ro.config.low_ram
สำหรับ
โปรดดูรายละเอียดที่หัวข้อ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
|
คะแนนขั้นต่ำ oom_adj สำหรับกระบวนการที่มีสิทธิ์
เสียชีวิตที่ระดับ vmpressure ต่ำสุด
|
1001 (ปิดใช้) |
ro.lmk.medium
|
คะแนนขั้นต่ำ oom_adj สำหรับกระบวนการที่มีสิทธิ์
เสียชีวิตที่ระดับ vmpressure ปานกลาง
|
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
|
ปิดงานที่มีสิทธิ์ซึ่งดำเนินการมากที่สุด (การตัดสินใจที่ดีที่สุด) เทียบกับงานที่มีสิทธิ์ (การตัดสินใจอย่างรวดเร็ว) | true
|
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
Userspace lmkd ใน Android 11
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 ทั่วไป เคอร์เนล 4.9, 4.14 และ 4.19)
- สำหรับอุปกรณ์ที่มี RAM ต่ำ ให้ใส่กลุ่มหน่วยความจำ
เคอร์เนลต้องคอมไพล์ด้วยการตั้งค่าการกำหนดค่าต่อไปนี้
CONFIG_PSI=y
กำหนดค่า lmkd ใน Android 11
รองรับกลยุทธ์การหยุดหน่วยความจำใน Android 11 ปุ่มปรับแต่งและค่าเริ่มต้นที่แสดงด้านล่าง ฟีเจอร์เหล่านี้ใช้ได้กับทั้ง อุปกรณ์ประสิทธิภาพสูงและ RAM ต่ำ
พร็อพเพอร์ตี้ | ใช้ | ค่าเริ่มต้น | |
---|---|---|---|
ประสิทธิภาพสูง | RAM ต่ำ | ||
ro.lmk.psi_partial_stall_ms |
เกณฑ์การหยุดทำงานของ PSI บางส่วนในหน่วยมิลลิวินาทีสำหรับทริกเกอร์ระดับต่ำ การแจ้งเตือนหน่วยความจำ หากอุปกรณ์ได้รับการแจ้งเตือนการใช้หน่วยความจำ ช้าเกินไป โปรดลดค่านี้ลงเพื่อให้การแจ้งเตือนก่อนหน้านี้แสดง หากความทรงจำ การแจ้งเตือนแรงกดดันจะทริกเกอร์โดยไม่จำเป็น เพิ่มค่านี้เพื่อให้ อุปกรณ์มีความไวต่อเสียงรบกวนน้อยลง | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
เกณฑ์หยุดทำงานของ PSI ที่สมบูรณ์ในหน่วยมิลลิวินาทีสำหรับทริกเกอร์ การแจ้งเตือนหน่วยความจำที่สำคัญ หากอุปกรณ์ได้รับหน่วยความจำวิกฤต การแจ้งเตือนแรงกดดันล่าช้าเกินไป ลดค่านี้เพื่อให้ทริกเกอร์ก่อนหน้านี้ การแจ้งเตือน หากมีการทริกเกอร์การแจ้งเตือนเมื่อกดหน่วยความจำที่สำคัญ เพิ่มค่านี้โดยไม่จำเป็นเพื่อให้อุปกรณ์มีความไวต่อ เสียงรบกวน | 700 |
|
ro.lmk.thrashing_limit |
จำนวนสูงสุดของข้อผิดพลาด Workset คิดเป็นเปอร์เซ็นต์ของจำนวนรวม ขนาด Pagecache ที่สำรองไฟล์ ค่าที่ผิดพลาดของชุดการทำงานที่สูงกว่าค่าเฉลี่ยนี้ ที่ถือว่าระบบใช้ Pagecache ถาวร หาก ประสิทธิภาพของอุปกรณ์จะได้รับผลกระทบขณะมีการใช้หน่วยความจำ ลดลง ค่าเพื่อจำกัดการข้าม หากประสิทธิภาพการทำงานของอุปกรณ์หยุดทำงาน โดยไม่จำเป็นด้วยเหตุผลของการทับซ้อนกัน เพิ่มค่าเพื่อให้มี การ Thrash | 100 |
30 |
ro.lmk.thrashing_limit_decay |
การลดลงของเกณฑ์แบบ Thrash ซึ่งแสดงเป็นเปอร์เซ็นต์ของ เกณฑ์เดิมที่ใช้เพื่อลดเกณฑ์ในกรณีที่ระบบไม่ได้ใช้ ฟื้นคืนชีพ แม้จะถูกฆ่าก็ตาม หากการ Thrash อย่างต่อเนื่องทำให้เกิดความไม่จำเป็น หยุดทำงาน ลดค่าลง หากการตอบสนองต่อการข้ามแบบต่อเนื่องหลังจาก การกำจัดช้าเกินไป ให้เพิ่มค่า | 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 |