Daemon การจัดการหน่วยความจำ

Android 17 ขึ้นไปรองรับ Memory Management Daemon (mmd) ซึ่งเป็น Daemon ของระบบที่จัดการการกำหนดค่า Daemon, พารามิเตอร์ที่ปรับได้ และงานการบำรุงรักษา Swap หรือ ZRAM ที่กำลังดำเนินการ

ฉากหลัง

ก่อนที่จะเปิดตัว mmd การกำหนดค่า ZRAM ของ Android กระจัดกระจายและมีการปรับแต่งที่จำกัด mmd แก้ปัญหานี้ด้วยการ รวมการจัดการ ZRAM ไว้ที่ส่วนกลาง ซึ่งจะช่วยให้ตรรกะการกำหนดค่ามีความซับซ้อนมากขึ้น และทำให้การเพิ่มฟีเจอร์ใหม่และการปรับปรุงสถาปัตยกรรมง่ายขึ้น mmd ยังช่วยแยกความกังวลระหว่างกระบวนการที่ใช้ Java system_server กับการสลับหรือการจัดการหน่วยความจำระดับเคอร์เนลได้อย่างชัดเจนด้วย

สถาปัตยกรรมและการจัดการ ZRAM

เมื่อการบูตเสร็จสมบูรณ์ (กล่าวคือ เมื่อ sys.boot_completed=1) mmd_setup จะพยายาม กำหนดค่า ZRAM ด้วยพารามิเตอร์ที่ระบุ หลังจากตั้งค่า ZRAM เสร็จแล้ว ระบบจะเปิดใช้บริการ mmd ซึ่งจะจัดการงานบำรุงรักษาที่กำลังดำเนินการอยู่

ในโปรเจ็กต์ mmd การดำเนินการบำรุงรักษาจะเริ่มต้นจาก system_server โดยการส่งคำขอ Binder ไปยัง mmd โดยใช้อินเทอร์เฟซ IMmd mmd จะจัดการงานบำรุงรักษาในการดำเนินการเขียนกลับ ZRAM การบีบอัดซ้ำ และการเขียนกลับต่อกระบวนการตามนโยบายภายในของ เครื่องมือของตัวเอง ทั้งการตั้งเวลาจาก ActivityManagerService และนโยบายการบำรุงรักษา ZRAM สามารถกำหนดค่าได้โดยใช้พร็อพเพอร์ตี้ของระบบ

การผสานรวมเซิร์ฟเวอร์ระบบ (system_server)

กระบวนการ system_server ที่ใช้ Java จะกำหนดเวลาเรียกใช้ mmd กระบวนการนี้จะแยกการล้างข้อมูลเพื่อการบำรุงรักษาส่วนกลางจากการเพิ่มประสิทธิภาพหน่วยความจำต่อแอปที่กำหนดเป้าหมาย

การบำรุงรักษาหลังการประมวลผลตามปกติ

การบำรุงรักษา ZRAM ทั่วโลกขับเคลื่อนโดย ActivityManagerService โดยใช้ com.android.server.memory.ZramMaintenance

zram-maintenance

รูปที่ 1 ลำดับการกำหนดเวลาการบำรุงรักษา ZRAM

  • เครื่องมือจัดตารางเวลา: ZramMaintenance ลงทะเบียนงานพื้นหลังเป็นระยะ กับ JobScheduler ของ Android
  • ข้อจำกัดของงาน: เพื่อป้องกันไม่ให้ UI เบื้องหน้าเกิดการกระตุกแบบข้ามเฟรมหรือ CPU ทำงานหนักเกินไป งานจะได้รับการกำหนดค่าอย่างชัดเจนด้วย setRequiresDeviceIdle(true) และ setRequiresBatteryNotLow(true)
  • การทริกเกอร์ Binder: เมื่อตัวกำหนดเวลากระตุ้น onStartJob(), system_server จะเรียกใช้ mmd.doZramMaintenanceAsync() นี่คือการเรียก Binder แบบอะซิงโครนัสทางเดียว system_server ไม่ได้บล็อกการรอให้การสแกนการบำรุงรักษาเสร็จสิ้น mmd จะจัดคิวนี้ไปยังเธรดของ Worker ในเบื้องหลัง เพื่อทำการบีบอัดซ้ำและเขียนกลับตามลำดับ

การเขียนกลับต่อกระบวนการ

ActivityManagerService จะจัดการการนำหน่วยความจำต่อกระบวนการที่กำหนดเป้าหมายออกโดยใช้ com.android.server.am.CachedAppOptimizer

mmd-writeback

รูปที่ 2 โฟลว์การเขียนกลับต่อกระบวนการของ mmd

เมื่อกระบวนการเปลี่ยนไปเป็นสถานะแคชในเบื้องหลัง ActivityManager จะทำการบีบอัดหน่วยความจำ หากผู้ใช้จะเห็นการหยุดทำงานเนื่องจากหน่วยความจำไม่เพียงพอของกระบวนการ นั่นคือ กระบวนการโฮสต์กิจกรรม และหากการเขียนกลับต่อกระบวนการของ ZRAM จะทำให้หน่วยความจำที่ใช้ของกระบวนการเข้าใกล้ 0 ระบบจะทำตามขั้นตอนต่อไปนี้

  1. หลังจากทำการบีบอัดแล้ว CachedAppOptimizer จะโพสต์ข้อความที่ล่าช้า (ZRAM_WRITEBACK_MSG) ไปยังตัวแฮนเดิลการบีบอัดภายใน (ล่าช้าโดย mZramWritebackWaitSeconds)
  2. เมื่อระยะเวลาหน่วงหมดอายุ ActivityManager จะเปิดตัวอธิบายไฟล์กระบวนการที่ปลอดภัย pidfd
  3. เซิร์ฟเวอร์ระบบจะเรียกใช้ mmd.asyncWritebackProcessZramMemory(pfd, callback)
  4. mmd จะเรียกใช้ ioctl ของการเขียนกลับต่อกระบวนการและรายงานกลับโดยใช้ IMmdProcessWritebackCallback หากสำเร็จ ActivityManager จะตั้งค่าสถานะบันทึกกระบวนการ (setIsZramWrittenBack(app, true)) เพื่อเพิ่ม oom_score_adj ของกระบวนการและบันทึกเมตริกลงใน FrameworkStatsLog.ZRAM_WRITEBACK_EVENT

การดึงข้อมูลล่วงหน้าระดับกระบวนการ

เมื่อผู้ใช้เปิดแอปที่แคชไว้ก่อนหน้านี้อีกครั้ง (เลิกตรึงเนื่องจาก UNFREEZE_REASON_ACTIVITY) ActivityManager จะลดเวลาในการตอบสนองของการเริ่มต้นแอป ที่เกิดจากข้อผิดพลาดของหน้าเว็บที่สำคัญจากพื้นที่เก็บข้อมูลสำรอง

  1. CachedAppOptimizer จะสกัดกั้นเหตุการณ์การเลิกตรึงและเรียกใช้ prefetchZram(app)
  2. เซิร์ฟเวอร์ระบบจะส่ง pidfd ของแอปผ่าน Binder โดยใช้ mmd.asyncPrefetchProcessZramMemory(pfd) mmd จะออกคำสั่ง ZRAM_ANDROID_IOC_PROCESS_PREFETCH ioctl เพื่อสั่งให้เคอร์เนล ดึงข้อมูลล่วงหน้าแบบไม่พร้อมกันสำหรับหน้าที่สลับกลับไปไว้ใน RAM ขณะที่เทรด UI หลักของแอป กำลังเริ่มต้น

ภาพรวมของงานบำรุงรักษาและงานหลังการประมวลผล

ส่วนนี้อธิบายการดำเนินการบำรุงรักษาเบื้องหลังและงานหลังการประมวลผลที่ mmd เรียกใช้เพื่อเพิ่มประสิทธิภาพพื้นที่สวอปและหน่วยความจำของระบบ

การบำรุงรักษาใน mmd

ใน mmd การบำรุงรักษาหมายถึงการกวาดล้างการบำรุงรักษาในเบื้องหลังที่กำหนดเวลาไว้ ซึ่งจะเพิ่มประสิทธิภาพการใช้พื้นที่สวอปและหน่วยความจำจริงโดยไม่ส่งผลกระทบต่อ ประสิทธิภาพในเบื้องหน้าของผู้ใช้ที่ใช้งานอยู่ การบำรุงรักษาจะดำเนินการแบบไม่พร้อมกันแทนที่จะเป็นการกวาดแบบพร้อมกันอย่างต่อเนื่อง (ซึ่งจะทำให้ CPU ทำงานหนักและ UI กระตุก) ดังนี้

  1. system_server จะเริ่มทำงานเป็นระยะๆ doZramMaintenanceAsync() ใน Binder

  2. mmd จะวางคำขอในคิวงานเบื้องหลัง LowPrioWorkItem::ZramMaintenance

  3. มี Worker เธรดเดียวใน mmd ที่จัดการทั้งคิวที่มีลำดับความสำคัญสูงและคิวที่มีลำดับความสำคัญต่ำ ระบบจะประมวลผลรายการงานที่มีลำดับความสำคัญสูง (เช่น การดึงข้อมูลล่วงหน้าระดับกระบวนการ) ก่อน และสามารถขัดจังหวะรายการงานที่มีลำดับความสำคัญต่ำได้ การบำรุงรักษาและการเขียนกลับต่อกระบวนการจะทำงานเป็นรายการงานที่มีลำดับความสำคัญต่ำ เมื่อป๊อปอัปขึ้นมา เทรดผู้ปฏิบัติงานจะดำเนินการบำรุงรักษาหลัก 2 รายการตามลำดับ ดังนี้

    • การบีบอัด ZRAM อีกครั้ง: สแกนหน้าสวอปที่มีอยู่และ บีบอัดหน้าว่างอีกครั้งโดยใช้อัลกอริทึมการบีบอัดรองที่มีอัตราส่วนสูงกว่า เช่น zstd

    • การเขียนกลับของ ZRAM: สแกนหน้าเว็บที่ไม่มีการใช้งานและนำออกจาก RAM ทั้งหมดไปยังพื้นที่เก็บข้อมูลแฟลชสำรองซึ่งเป็นอุปกรณ์วนซ้ำจากไฟล์ใน /data

งานหลังการประมวลผลใน ZRAM

ในโมดูล ZRAM ของเคอร์เนล Linux และสถาปัตยกรรม mmd งานหลังการประมวลผล คือการแปลงแบบไม่พร้อมกันที่ใช้กับหน้าหน่วยความจำหลังจาก ที่เคอร์เนลได้สลับออกไปแล้วตามเส้นทางการเรียกคืนมาตรฐานของเคอร์เนล (kswapd หรือการบีบอัด)

เมื่อมีการสลับหน้าเว็บออกในตอนแรก ระบบจะจัดลำดับความสำคัญของความเร็ว โดยจะใช้อัลกอริทึมการบีบอัดหลักที่รวดเร็ว (เช่น lz4) และจัดเก็บหน้าเว็บที่บีบอัดไว้ใน RAM อย่างไรก็ตาม เมื่อเวลาผ่านไป หน้าที่สลับหลายหน้าจะกลายเป็นไม่ได้ใช้งานหรือไม่ได้ใช้งาน เช่น แอปที่แคชไว้ในเบื้องหลังซึ่งไม่ได้กลับมาใช้งานเป็นเวลาหลายชั่วโมง การปล่อยให้หน้าเว็บที่ไม่ได้ใช้งานอยู่ใน ZRAM ที่บีบอัดเล็กน้อยอย่างรวดเร็วเป็นเรื่องที่ไม่มีประสิทธิภาพ

ไปป์ไลน์หลังการประมวลผล

mmd ใช้ขั้นตอนการประมวลผลภายหลังแบบหลายระดับเพื่อเพิ่มประสิทธิภาพหน้าเว็บต่อไปนี้

mmd-page-lifecycle

รูปที่ 3 mmdวงจรการใช้งานหน้าเว็บ

  1. ระยะที่ 1: การสลับออกครั้งแรก (การบีบอัดอย่างรวดเร็ว): ระบบจะเรียกคืนหน่วยความจำก่อน ผ่าน kswapd หรือการบีบอัดแอป โดยปกติแล้ว การเรียกคืนครั้งแรกนี้จะดำเนินการ โดยใช้อัลกอริทึมการบีบอัดที่รวดเร็ว เช่น lz4 และเนื้อหาจะจัดเก็บไว้ใน RAM

  2. ขั้นตอนที่ 2: การทำเครื่องหมายว่าไม่ได้ใช้งาน (การกำหนดอายุและการติดตาม): mmd การติดตามการไม่ได้ใช้งานจะเข้าถึง การติดตามหน่วยความจำเคอร์เนล (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) หรือใช้ เครื่องหมายการไม่ได้ใช้งานของซอฟต์แวร์เพื่อติดตามระยะเวลาที่หน้าเว็บยังคงไม่มีการแตะต้อง

  3. ระยะที่ 3: การประมวลผลภายหลัง 1 - การบีบอัดซ้ำ (การเรียกคืนในหน่วยความจำ) หน้าเว็บที่มีอายุการไม่ได้ใช้งานของการบีบอัดซ้ำ (min_idle_seconds ถึง max_idle_seconds) จะได้รับการบีบอัดซ้ำ mmd เขียนถึง /sys/block/zram0/recompress เพื่อสั่งให้เคอร์เนลคลายการบีบอัดหน้า lz4 และบีบอัดอีกครั้งโดยใช้ zstd ซึ่งจะเรียกคืน RAM จริง โดยไม่ทำให้เกิดการสึกหรอจากการเขียนแฟลช

  4. ขั้นตอนที่ 4: การประมวลผลภายหลัง 2 - การเขียนกลับ (การนำออกจากหน่วยความจำไปยังที่เก็บข้อมูลแฟลช): หากแรงดันหน่วยความจำยังคงอยู่และหน้าต่างๆ มีอายุการเขียนกลับที่ไม่มีการใช้งาน (โดยปกติคือ 20 ชั่วโมงขึ้นไป) mmd จะทริกเกอร์การเขียนกลับ mmd เขียนไปยัง /sys/block/zram0/idleและ /sys/block/zram0/writeback เพื่อนำ หน้าเว็บที่บีบอัดออกจาก RAM ไปยังพื้นที่เก็บข้อมูลแฟลชสำรองทั้งหมด

การกำหนดค่าการตั้งค่า ZRAM

mmd จะโหลดและประมวลผลพร็อพเพอร์ตี้การตั้งค่า ZRAM ต่อไปนี้

พร็อพเพอร์ตี้ ใช้ ค่าเริ่มต้น
mmd.zram.enabled เปิดใช้mmdการตั้งค่า ZRAM หรือไม่ false
mmd.zram.num_devices จำนวนอุปกรณ์ ZRAM ที่จะกำหนดค่า สำหรับหมายเลข N อุปกรณ์ zram0 ถึง zram<N-1> ต้อง พร้อมใช้งานก่อนที่ระบบจะตั้งค่า sys.boot_completed=1 คุณกำหนดค่าพร็อพเพอร์ตี้ในรายการอุปกรณ์ต่อ ZRAM ได้ทีละอุปกรณ์ 1
mmd.zram.device_priority ค่าลำดับความสำคัญที่จะส่งเมื่อเรียกใช้ swapon ไม่ได้ตั้งค่า
mmd.zram.comp_algorithm อัลกอริทึมการบีบอัด ZRAM หากไม่ได้ระบุ ระบบจะใช้อัลกอริทึมการบีบอัดเริ่มต้นของเคอร์เนล ไม่ได้ตั้งค่า
mmd.zram.size ขนาดอุปกรณ์ ZRAM เป็นไบต์ หรือเปอร์เซ็นต์ของขนาด RAM ของอุปกรณ์ เช่น 75% 50%
mmd.zram.writeback.enabled จะเปิดใช้การเขียนกลับ ZRAM หรือไม่ false
mmd.zram.writeback.device_size ขนาดของอุปกรณ์เขียนกลับในหน่วยไบต์หรือเปอร์เซ็นต์ของพาร์ติชันข้อมูล คุณปรับขนาดอุปกรณ์จริงได้ตามพื้นที่ว่างในพาร์ติชันข้อมูล 1073741824 (1 GiB)
mmd.zram.writeback.min_free_space_mib พื้นที่ว่างขั้นต่ำใน MiB ที่ต้องพร้อมใช้งานหลังจากตั้งค่าอุปกรณ์ การเขียนกลับ 1536 (1.5 GiB)
mmd.zram.writeback.use_nr_tags_prop เมื่อ true ใช้ค่าใน mmd.zram.writeback.nr_tags เพื่อกำหนดค่าความลึกของคิวของ การเขียนกลับ ZRAM ที่สำรองข้อมูลอุปกรณ์ลูป นี่เป็นวิธีแก้ปัญหาชั่วคราวสำหรับ กรณีที่กำหนดค่านโยบาย SELinux ของผู้ให้บริการไม่ได้เพื่ออนุญาตให้ mmd อ่าน nr_tags ของบล็อก อุปกรณ์ที่สำรองข้อมูล /data โดยตรง false
mmd.zram.writeback.nr_tags โปรดอ่านmmd.zram.writeback.use_nr_tags_prop ไม่ได้ตั้งค่า
mmd.zram.recompression.enabled ว่าจะเปิดใช้ฟีเจอร์การบีบอัด ZRAM อีกครั้งหรือไม่ false
mmd.zram.recompression.algorithm อัลกอริทึมการบีบอัด ZRAM รอง zstd

พร็อพเพอร์ตี้อุปกรณ์ต่อ ZRAM

เมื่อ mmd.zram.num_devices มากกว่า 1 คุณสามารถกำหนดค่าพร็อพเพอร์ตี้ที่เฉพาะเจาะจงในอุปกรณ์ ZRAM แต่ละเครื่องได้โดยไม่บังคับโดยตั้งค่าพร็อพเพอร์ตี้เป็นค่าที่คั่นด้วยคอมมาซึ่งมีองค์ประกอบ mmd.zram.num_devices อย่างแน่นอน พร็อพเพอร์ตี้เหล่านี้ ได้แก่

  • mmd.zram.size
  • mmd.zram.comp_algorithm
  • mmd.zram.device_priority
  • mmd.zram.recompression.enabled
  • mmd.zram.recompression.huge_idle.enabled
  • mmd.zram.recompression.idle.enabled
  • mmd.zram.recompression.huge.enabled
  • mmd.zram.recompression.threshold_bytes
  • mmd.zram.recompression.algorithm
  • mmd.zram.writeback.device_size
  • mmd.zram.writeback.huge_idle.enabled
  • mmd.zram.writeback.idle.enabled
  • mmd.zram.writeback.huge.enabled

การเลิกใช้งานการตั้งค่า ZRAM ที่มีอยู่

แม้ว่า swapon_all จะยังคงพร้อมใช้งานใน Android เพื่อตั้งค่า ZRAM และพื้นที่สวอปที่อิงตามดิสก์ แต่ mmd เป็นแนวทางที่แนะนำสำหรับการจัดการ ZRAM เพื่อให้กำหนดค่าได้ง่ายขึ้น และมีฟีเจอร์ขั้นสูง เช่น การบีบอัด ZRAM อีกครั้ง

เมื่อ mmdmmd.zram.enabled เปิดใช้การตั้งค่า ZRAM

  • การตั้งค่า ZRAM ในการติดตั้งใช้งาน swapon_all จะไม่มีผล
  • ระบบจะละเว้นการกำหนดค่า ZRAM ที่มีอยู่ เช่น config_zramWriteback ในไฟล์การซ้อนทับ config.xml และพร็อพเพอร์ตี้ของระบบ ro.zram.* writeback

พารามิเตอร์ที่ปรับได้สำหรับการบำรุงรักษา ZRAM

การบำรุงรักษา ZRAM ควรทำงานได้ทันที และคุณสามารถปรับแต่งเพิ่มเติมได้ โดยใช้พร็อพเพอร์ตี้ของระบบในส่วนนี้

การกำหนดเวลาการบำรุงรักษา ZRAM

พร็อพเพอร์ตี้เหล่านี้จะควบคุมวิธีและเวลาที่ system_server กำหนดเวลาของงานบำรุงรักษา ZRAM

พร็อพเพอร์ตี้ ใช้ ค่าเริ่มต้น
mm.zram.maintenance.first_delay_seconds การหน่วงเวลาก่อนที่จะเริ่มการบำรุงรักษา ZRAM ครั้งแรก 3600 (1 ชั่วโมง)
mm.zram.maintenance.periodic_delay_seconds ความล่าช้าระหว่างการกำหนดเวลาการบำรุงรักษา ZRAM ครั้งต่อๆ ไป 3600 (1 ชั่วโมง)
mm.zram.maintenance.require_device_idle ว่าจะเริ่มการบำรุงรักษา ZRAM เมื่ออุปกรณ์ไม่มีการใช้งานเท่านั้นหรือไม่ true
mm.zram.maintenance.require_battery_not_low จะกำหนดให้แบตเตอรี่ไม่เหลือน้อยก่อนเริ่มการบำรุงรักษา ZRAM หรือไม่ true

นโยบายการเขียนกลับของ ZRAM

พารามิเตอร์ต่อไปนี้จะควบคุมเวลาและประเภทของหน่วยความจำที่จะเขียน ไปยังอุปกรณ์สำรอง

พร็อพเพอร์ตี้ ใช้ ค่าเริ่มต้น
mmd.zram.writeback.backoff_seconds เวลา Backoff นับตั้งแต่การดำเนินการเขียนกลับครั้งล่าสุด 600 (10 นาที)
mmd.zram.writeback.min_idle_seconds รวมกับ mmd.zram.writeback.max_idle_seconds เพื่อคำนวณ อายุที่ไม่มีการใช้งานของหน้าเพื่อให้มีสิทธิ์เขียนกลับตามเศษส่วนการใช้หน่วยความจำ อายุที่ไม่ได้ใช้งานที่คำนวณได้จะได้รับการประมาณค่าแบบเอ็กซ์โปเนนเชียล ระหว่างพารามิเตอร์ 2 รายการเพื่อลดภาระงานขณะที่ไม่ได้อยู่ภายใต้แรงกดดันด้านหน่วยความจำ 72000 (20 ชั่วโมง)
mmd.zram.writeback.max_idle_seconds จำนวนวินาทีสูงสุดที่ใช้ในการคำนวณอายุของหน้าเว็บที่ไม่มีการใช้งานแบบไดนามิกตาม การใช้หน่วยความจำ 90000 (25 ชั่วโมง)
mmd.zram.writeback.huge.enabled จะเปิดใช้HUGEการเขียนกลับของหน้าหรือไม่ false
mmd.zram.writeback.idle.enabled จะเปิดใช้IDLEการเขียนกลับของหน้าหรือไม่ true
mmd.zram.writeback.huge_idle.enabled จะเปิดใช้HUGE_IDLEการเขียนกลับของหน้าหรือไม่ true
mmd.zram.writeback.min_bytes จำนวนไบต์ขั้นต่ำที่จะเขียนกลับในรอบการเขียนกลับขณะไม่มีการใช้งาน 1 รอบ 5242880 (5 MiB)
mmd.zram.writeback.max_bytes จำนวนไบต์สูงสุดที่จะเขียนกลับในการเขียนกลับขณะไม่มีการใช้งานรอบเดียว 314572800 (300 MiB)
mmd.zram.writeback.max_bytes_per_day จำนวนไบต์สูงสุดที่จะเขียนกลับในระยะเวลา 24 ชั่วโมง 25769803776 (24 GiB)
mmd.zram.writeback.limit.enabled ว่าจะเปิดใช้การบัญชีวงเงินงบประมาณการเขียนกลับรายวันหรือไม่ true

นโยบายการบีบอัด ZRAM อีกครั้ง

พารามิเตอร์ต่อไปนี้จะควบคุมเวลาและประเภทของหน่วยความจำที่จะ บีบอัดซ้ำ

พร็อพเพอร์ตี้ ใช้ ค่าเริ่มต้น
mmd.zram.recompression.backoff_seconds เวลาหน่วงนับตั้งแต่การบีบอัดซ้ำครั้งล่าสุด 1800 (30 นาที)
mmd.zram.recompression.min_idle_seconds ใช้ร่วมกับ mmd.zram.recompression.max_idle_seconds เพื่อ คำนวณอายุที่ไม่มีการใช้งานของหน้าเพื่อให้มีสิทธิ์ในการบีบอัดซ้ำตาม เศษส่วนการใช้หน่วยความจำ อายุที่ไม่มีการใช้งานที่คำนวณได้จะได้รับการประมาณค่าแบบเอ็กซ์โปเนนเชียล ระหว่างพารามิเตอร์ทั้ง 2 เพื่อลดภาระงานขณะที่ไม่ได้อยู่ภายใต้ แรงกดดันด้านหน่วยความจำ 7200 (2 ชั่วโมง)
mmd.zram.recompression.max_idle_seconds จำนวนวินาทีสูงสุดที่ใช้ในการคำนวณอายุหน้าเว็บที่ไม่มีการใช้งานแบบไดนามิก 14400 (4 ชั่วโมง)
mmd.zram.recompression.threshold_bytes ขนาดขั้นต่ำในหน่วยไบต์ของหน้า ZRAM ที่พิจารณาสำหรับการบีบอัดซ้ำ 1024 (1 KiB)
mmd.zram.recompression.huge.enabled จะเปิดใช้การบีบอัดหน้าเว็บ HUGE อีกครั้งหรือไม่ true
mmd.zram.recompression.idle.enabled จะเปิดใช้การบีบอัดหน้าเว็บ IDLE อีกครั้งหรือไม่ true
mmd.zram.recompression.huge_idle.enabled จะเปิดใช้การบีบอัดหน้าเว็บ HUGE_IDLE อีกครั้งหรือไม่ true

การติดตามหน้าว่างของ ZRAM

mmd การบำรุงรักษา ZRAM จะทำเครื่องหมายหน้า ZRAM เป็นไม่ได้ใช้งานตามระยะเวลาตั้งแต่มีการเข้าถึงครั้งล่าสุด ฟีเจอร์นี้กำหนดให้ต้องเปิดใช้การกำหนดค่าเคอร์เนล CONFIG_ZRAM_TRACK_ENTRY_ACTIME หรือ CONFIG_ZRAM_MEMORY_TRACKING CONFIG_ZRAM_TRACK_ENTRY_ACTIME จะเปิดใช้โดย ค่าเริ่มต้นในเคอร์เนล GKI 6.18 ขึ้นไป ในเคอร์เนลเวอร์ชันก่อนหน้า ฟีเจอร์นี้มีค่าใช้จ่ายด้านหน่วยความจำและไม่ได้เปิดใช้โดยค่าเริ่มต้น

หากไม่ได้เปิดใช้การกำหนดค่าเคอร์เนล mmd การบำรุงรักษา ZRAM จะกลับไปใช้ตรรกะการแทนที่ซอฟต์แวร์เพื่อติดตามหน้า ZRAM ที่ไม่มีการใช้งาน

  1. ทำเครื่องหมายหน้า ZRAM ทั้งหมดว่าไม่ได้ใช้งานเมื่อ mmd เริ่มต้น

  2. ข้ามการบำรุงรักษา ZRAM ครั้งถัดไปจนกว่าจะพ้นระยะเวลาหยุดชั่วคราวที่จำเป็น

  3. เขียนกลับหรือบีบอัดหน้าว่างอีกครั้งใน ZRAM หากยังมีหน้าเว็บที่ไม่มีการใช้งานเหลืออยู่เนื่องจากขีดจำกัดการเขียนกลับ mmd จะเขียนกลับหน้าเว็บในการบำรุงรักษาครั้งถัดไปโดยไม่ทำเครื่องหมายหน้าเว็บใหม่เป็นไม่มีการใช้งาน (ข้ามขั้นตอนที่ 4)

  4. หากมีการเขียนหน้าว่างทั้งหมดกลับ ให้ทำเครื่องหมายหน้า ZRAM ทั้งหมดเป็นว่างอีกครั้งและ กลับไปที่ขั้นตอนที่ 2 หากปิดใช้การเขียนกลับ ZRAM mmd จะทำเครื่องหมายหน้า ZRAM ทั้งหมดว่าไม่ได้ใช้งานเมื่อมีการบีบอัด ZRAM อีกครั้งหลังจากระยะเวลาไม่ได้ใช้งานของการบีบอัดอีกครั้ง

คำแนะนำในการแก้ปัญหาและการตรวจสอบ

ใช้ขั้นตอนการตรวจสอบความถูกต้องและขั้นตอนการแก้ปัญหาต่อไปนี้เพื่อยืนยันและ วินิจฉัยการทำงานของ mmd และ ZRAM

ตรวจสอบการตั้งค่า ZRAM

วิธียืนยันว่า mmd กำหนดค่า ZRAM ระหว่างการบูตสำเร็จ

  1. ตรวจสอบอัลกอริทึมการบีบอัดที่ใช้งานอยู่และขนาดดิสก์

    cat /sys/block/zram0/comp_algorithm
    cat /sys/block/zram0/disksize
    
  2. ตรวจสอบmmdพร็อพเพอร์ตี้ของระบบและสถานะบริการที่กำลังทำงาน

    getprop | grep mmd.zram
    dumpsys -l | grep mmd
    

ตรวจสอบการบำรุงรักษาและการเขียนกลับของ ZRAM

ตรวจสอบว่างานบำรุงรักษาการเขียนกลับและการบีบอัดซ้ำของ ZRAM ทำงานได้ตามปกติ

  1. ตรวจสอบสถานะอุปกรณ์บล็อกที่สำรองข้อมูล

    cat /sys/block/zram0/bd_stat
    
  2. ตรวจสอบประสิทธิภาพการบีบอัดซ้ำโดยการตรวจสอบ /sys/block/zram0/mm_stat การเปลี่ยนแปลงขนาดข้อมูลที่บีบอัดควรปรากฏขึ้นหลังจากรอบการบำรุงรักษา

ตรวจสอบการเขียนกลับต่อกระบวนการ

คุณใช้สิ่งต่อไปนี้เพื่อตรวจสอบว่าการเขียนกลับต่อกระบวนการทำงาน ได้หรือไม่

  • ตรวจสอบ adb logcat -s mmd เพื่อดูบันทึกการเขียนกลับที่สำเร็จหรือการวินิจฉัยความล้มเหลว

ปัญหาและการวินิจฉัยที่พบบ่อย

สถานการณ์ข้อผิดพลาดที่พบบ่อยซึ่งผู้ใช้อาจพบมีดังนี้

  • WritebackDailyLimitExceeded: ข้อผิดพลาดนี้บ่งชี้ว่าถึงโควต้าของ mmd.zram.writeback.max_bytes_per_day แล้ว เมื่อเกิดเหตุการณ์นี้ขึ้น mmd จะหยุดการเขียนกลับที่ไม่ได้ใช้งานชั่วคราวจนกว่ากรอบเวลาแบบเลื่อน 24 ชั่วโมง จะเลื่อนไป
  • Process prefetch or writeback failed: ข้อผิดพลาดนี้จะสังเกตได้ใน logcat เมื่อ ioctl ล้มเหลว สาเหตุที่พบบ่อย ได้แก่
    • EBADF หรือ ESRCH: กระบวนการเป้าหมายสิ้นสุดลงก่อนที่ mmd จะส่ง pidfd ไปยังเคอร์เนลได้
    • ENOSPC: พาร์ติชันพื้นที่เก็บข้อมูลสำรองเต็ม หรือคิวอุปกรณ์ลูป หมดแล้ว
  • ไม่ได้ตั้งค่า ZRAM: หาก mmd กำหนดค่า ZRAM ไม่สำเร็จเมื่อบูต อาจเป็นเพราะสคริปต์ init เดิมของ swapon_all หรือสคริปต์ init ของผู้ให้บริการล็อก /dev/block/zram0 ก่อนที่ mmd จะดำเนินการได้