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

รูปที่ 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

รูปที่ 2 โฟลว์การเขียนกลับต่อกระบวนการของ mmd
เมื่อกระบวนการเปลี่ยนไปเป็นสถานะแคชในเบื้องหลัง ActivityManager จะทำการบีบอัดหน่วยความจำ หากผู้ใช้จะเห็นการหยุดทำงานเนื่องจากหน่วยความจำไม่เพียงพอของกระบวนการ นั่นคือ กระบวนการโฮสต์กิจกรรม และหากการเขียนกลับต่อกระบวนการของ ZRAM จะทำให้หน่วยความจำที่ใช้ของกระบวนการเข้าใกล้ 0 ระบบจะทำตามขั้นตอนต่อไปนี้
- หลังจากทำการบีบอัดแล้ว
CachedAppOptimizerจะโพสต์ข้อความที่ล่าช้า (ZRAM_WRITEBACK_MSG) ไปยังตัวแฮนเดิลการบีบอัดภายใน (ล่าช้าโดยmZramWritebackWaitSeconds) - เมื่อระยะเวลาหน่วงหมดอายุ ActivityManager จะเปิดตัวอธิบายไฟล์กระบวนการที่ปลอดภัย
pidfd - เซิร์ฟเวอร์ระบบจะเรียกใช้
mmd.asyncWritebackProcessZramMemory(pfd, callback) mmdจะเรียกใช้ ioctl ของการเขียนกลับต่อกระบวนการและรายงานกลับโดยใช้IMmdProcessWritebackCallbackหากสำเร็จ ActivityManager จะตั้งค่าสถานะบันทึกกระบวนการ (setIsZramWrittenBack(app, true)) เพื่อเพิ่มoom_score_adjของกระบวนการและบันทึกเมตริกลงในFrameworkStatsLog.ZRAM_WRITEBACK_EVENT
การดึงข้อมูลล่วงหน้าระดับกระบวนการ
เมื่อผู้ใช้เปิดแอปที่แคชไว้ก่อนหน้านี้อีกครั้ง (เลิกตรึงเนื่องจาก
UNFREEZE_REASON_ACTIVITY) ActivityManager จะลดเวลาในการตอบสนองของการเริ่มต้นแอป
ที่เกิดจากข้อผิดพลาดของหน้าเว็บที่สำคัญจากพื้นที่เก็บข้อมูลสำรอง
CachedAppOptimizerจะสกัดกั้นเหตุการณ์การเลิกตรึงและเรียกใช้prefetchZram(app)- เซิร์ฟเวอร์ระบบจะส่ง
pidfdของแอปผ่าน Binder โดยใช้mmd.asyncPrefetchProcessZramMemory(pfd)mmdจะออกคำสั่งZRAM_ANDROID_IOC_PROCESS_PREFETCHioctl เพื่อสั่งให้เคอร์เนล ดึงข้อมูลล่วงหน้าแบบไม่พร้อมกันสำหรับหน้าที่สลับกลับไปไว้ใน RAM ขณะที่เทรด UI หลักของแอป กำลังเริ่มต้น
ภาพรวมของงานบำรุงรักษาและงานหลังการประมวลผล
ส่วนนี้อธิบายการดำเนินการบำรุงรักษาเบื้องหลังและงานหลังการประมวลผลที่ mmd เรียกใช้เพื่อเพิ่มประสิทธิภาพพื้นที่สวอปและหน่วยความจำของระบบ
การบำรุงรักษาใน mmd
ใน mmd การบำรุงรักษาหมายถึงการกวาดล้างการบำรุงรักษาในเบื้องหลังที่กำหนดเวลาไว้
ซึ่งจะเพิ่มประสิทธิภาพการใช้พื้นที่สวอปและหน่วยความจำจริงโดยไม่ส่งผลกระทบต่อ
ประสิทธิภาพในเบื้องหน้าของผู้ใช้ที่ใช้งานอยู่ การบำรุงรักษาจะดำเนินการแบบไม่พร้อมกันแทนที่จะเป็นการกวาดแบบพร้อมกันอย่างต่อเนื่อง (ซึ่งจะทำให้ CPU ทำงานหนักและ UI กระตุก) ดังนี้
system_serverจะเริ่มทำงานเป็นระยะๆdoZramMaintenanceAsync()ใน Bindermmdจะวางคำขอในคิวงานเบื้องหลังLowPrioWorkItem::ZramMaintenanceมี Worker เธรดเดียวใน
mmdที่จัดการทั้งคิวที่มีลำดับความสำคัญสูงและคิวที่มีลำดับความสำคัญต่ำ ระบบจะประมวลผลรายการงานที่มีลำดับความสำคัญสูง (เช่น การดึงข้อมูลล่วงหน้าระดับกระบวนการ) ก่อน และสามารถขัดจังหวะรายการงานที่มีลำดับความสำคัญต่ำได้ การบำรุงรักษาและการเขียนกลับต่อกระบวนการจะทำงานเป็นรายการงานที่มีลำดับความสำคัญต่ำ เมื่อป๊อปอัปขึ้นมา เทรดผู้ปฏิบัติงานจะดำเนินการบำรุงรักษาหลัก 2 รายการตามลำดับ ดังนี้การบีบอัด ZRAM อีกครั้ง: สแกนหน้าสวอปที่มีอยู่และ บีบอัดหน้าว่างอีกครั้งโดยใช้อัลกอริทึมการบีบอัดรองที่มีอัตราส่วนสูงกว่า เช่น
zstdการเขียนกลับของ ZRAM: สแกนหน้าเว็บที่ไม่มีการใช้งานและนำออกจาก RAM ทั้งหมดไปยังพื้นที่เก็บข้อมูลแฟลชสำรองซึ่งเป็นอุปกรณ์วนซ้ำจากไฟล์ใน
/data
งานหลังการประมวลผลใน ZRAM
ในโมดูล ZRAM ของเคอร์เนล Linux และสถาปัตยกรรม mmd งานหลังการประมวลผล
คือการแปลงแบบไม่พร้อมกันที่ใช้กับหน้าหน่วยความจำหลังจาก
ที่เคอร์เนลได้สลับออกไปแล้วตามเส้นทางการเรียกคืนมาตรฐานของเคอร์เนล
(kswapd หรือการบีบอัด)
เมื่อมีการสลับหน้าเว็บออกในตอนแรก ระบบจะจัดลำดับความสำคัญของความเร็ว โดยจะใช้อัลกอริทึมการบีบอัดหลักที่รวดเร็ว (เช่น lz4) และจัดเก็บหน้าเว็บที่บีบอัดไว้ใน RAM อย่างไรก็ตาม เมื่อเวลาผ่านไป หน้าที่สลับหลายหน้าจะกลายเป็นไม่ได้ใช้งานหรือไม่ได้ใช้งาน
เช่น แอปที่แคชไว้ในเบื้องหลังซึ่งไม่ได้กลับมาใช้งานเป็นเวลาหลายชั่วโมง การปล่อยให้หน้าเว็บที่ไม่ได้ใช้งานอยู่ใน ZRAM ที่บีบอัดเล็กน้อยอย่างรวดเร็วเป็นเรื่องที่ไม่มีประสิทธิภาพ
ไปป์ไลน์หลังการประมวลผล
mmd ใช้ขั้นตอนการประมวลผลภายหลังแบบหลายระดับเพื่อเพิ่มประสิทธิภาพหน้าเว็บต่อไปนี้

รูปที่ 3 mmdวงจรการใช้งานหน้าเว็บ
ระยะที่ 1: การสลับออกครั้งแรก (การบีบอัดอย่างรวดเร็ว): ระบบจะเรียกคืนหน่วยความจำก่อน ผ่าน kswapd หรือการบีบอัดแอป โดยปกติแล้ว การเรียกคืนครั้งแรกนี้จะดำเนินการ โดยใช้อัลกอริทึมการบีบอัดที่รวดเร็ว เช่น
lz4และเนื้อหาจะจัดเก็บไว้ใน RAMขั้นตอนที่ 2: การทำเครื่องหมายว่าไม่ได้ใช้งาน (การกำหนดอายุและการติดตาม):
mmdการติดตามการไม่ได้ใช้งานจะเข้าถึง การติดตามหน่วยความจำเคอร์เนล (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) หรือใช้ เครื่องหมายการไม่ได้ใช้งานของซอฟต์แวร์เพื่อติดตามระยะเวลาที่หน้าเว็บยังคงไม่มีการแตะต้องระยะที่ 3: การประมวลผลภายหลัง 1 - การบีบอัดซ้ำ (การเรียกคืนในหน่วยความจำ) หน้าเว็บที่มีอายุการไม่ได้ใช้งานของการบีบอัดซ้ำ (
min_idle_secondsถึงmax_idle_seconds) จะได้รับการบีบอัดซ้ำmmdเขียนถึง/sys/block/zram0/recompressเพื่อสั่งให้เคอร์เนลคลายการบีบอัดหน้าlz4และบีบอัดอีกครั้งโดยใช้zstdซึ่งจะเรียกคืน RAM จริง โดยไม่ทำให้เกิดการสึกหรอจากการเขียนแฟลชขั้นตอนที่ 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.sizemmd.zram.comp_algorithmmmd.zram.device_prioritymmd.zram.recompression.enabledmmd.zram.recompression.huge_idle.enabledmmd.zram.recompression.idle.enabledmmd.zram.recompression.huge.enabledmmd.zram.recompression.threshold_bytesmmd.zram.recompression.algorithmmmd.zram.writeback.device_sizemmd.zram.writeback.huge_idle.enabledmmd.zram.writeback.idle.enabledmmd.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 ที่ไม่มีการใช้งาน
ทำเครื่องหมายหน้า ZRAM ทั้งหมดว่าไม่ได้ใช้งานเมื่อ
mmdเริ่มต้นข้ามการบำรุงรักษา ZRAM ครั้งถัดไปจนกว่าจะพ้นระยะเวลาหยุดชั่วคราวที่จำเป็น
เขียนกลับหรือบีบอัดหน้าว่างอีกครั้งใน ZRAM หากยังมีหน้าเว็บที่ไม่มีการใช้งานเหลืออยู่เนื่องจากขีดจำกัดการเขียนกลับ
mmdจะเขียนกลับหน้าเว็บในการบำรุงรักษาครั้งถัดไปโดยไม่ทำเครื่องหมายหน้าเว็บใหม่เป็นไม่มีการใช้งาน (ข้ามขั้นตอนที่ 4)หากมีการเขียนหน้าว่างทั้งหมดกลับ ให้ทำเครื่องหมายหน้า ZRAM ทั้งหมดเป็นว่างอีกครั้งและ กลับไปที่ขั้นตอนที่ 2 หากปิดใช้การเขียนกลับ ZRAM
mmdจะทำเครื่องหมายหน้า ZRAM ทั้งหมดว่าไม่ได้ใช้งานเมื่อมีการบีบอัด ZRAM อีกครั้งหลังจากระยะเวลาไม่ได้ใช้งานของการบีบอัดอีกครั้ง
คำแนะนำในการแก้ปัญหาและการตรวจสอบ
ใช้ขั้นตอนการตรวจสอบความถูกต้องและขั้นตอนการแก้ปัญหาต่อไปนี้เพื่อยืนยันและ
วินิจฉัยการทำงานของ mmd และ ZRAM
ตรวจสอบการตั้งค่า ZRAM
วิธียืนยันว่า mmd กำหนดค่า ZRAM ระหว่างการบูตสำเร็จ
ตรวจสอบอัลกอริทึมการบีบอัดที่ใช้งานอยู่และขนาดดิสก์
cat /sys/block/zram0/comp_algorithm cat /sys/block/zram0/disksizeตรวจสอบ
mmdพร็อพเพอร์ตี้ของระบบและสถานะบริการที่กำลังทำงานgetprop | grep mmd.zram dumpsys -l | grep mmd
ตรวจสอบการบำรุงรักษาและการเขียนกลับของ ZRAM
ตรวจสอบว่างานบำรุงรักษาการเขียนกลับและการบีบอัดซ้ำของ ZRAM ทำงานได้ตามปกติ
ตรวจสอบสถานะอุปกรณ์บล็อกที่สำรองข้อมูล
cat /sys/block/zram0/bd_statตรวจสอบประสิทธิภาพการบีบอัดซ้ำโดยการตรวจสอบ
/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จะดำเนินการได้