ดีมอนนักฆ่าที่มีหน่วยความจำต่ำ

กระบวนการ 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