อุปกรณ์ที่เปิดตัวใน Android 12 ขึ้นไปจะใช้ mm_events
ซึ่งเป็นชุดสถิติเกี่ยวกับหน่วยความจำที่ได้รับการบันทึกเป็นระยะๆ ในขณะที่ระบบต้องใช้หน่วยความจำ mm_events
ผสานรวมกับกลไกการติดตาม perfetto
และเนื่องจากจะเปิดใช้งานก็ต่อเมื่อตรวจพบปัญหาหน่วยความจําไม่เพียงพอ การเพิ่มประสิทธิภาพจึงไม่มากนัก การรวบรวมสถิติจะเริ่มขึ้นเมื่อกลไก kswapd
, direct reclaim,
หรือ compaction
ของเคอร์เนลเปิดใช้งาน และจะทำงานต่อไปตามระยะเวลาที่กำหนดค่าได้เพื่อบันทึกสถิติเป็นระยะๆ
mm_events
จะแสดงมุมมองประวัติสถิติหน่วยความจำโดยย่อในช่วงที่หน่วยความจำทำงานหนักแทนที่จะแสดงภาพรวมสถานะหน่วยความจำของระบบแบบครั้งเดียวเมื่อมีการรายงานข้อบกพร่อง สถิติที่บันทึกไว้จะแสดงในตารางต่อไปนี้
ฟิลด์ vmstat
nr_free_pages | nr_slab_reclaimable |
nr_slab_unreclaimable | nr_active_file |
nr_inactive_file | nr_active_anon |
nr_inactive_anon | workingset_refault |
workingset_activate | nr_file_pages |
pgpgin | pgpgout |
pswpin | pswpout |
pgsteal_kswapd_dma | pgsteal_kswapd_normal |
pgsteal_kswapd_movable | pgsteal_direct_dma |
pgsteal_direct_normal | pgsteal_direct_movable |
pgscan_kswapd_dma | pgscan_kswapd_normal |
pgscan_kswapd_movable | pgscan_direct_dma |
pgscan_direct_normal | pgscan_direct_movable |
compact_migrate_scanned | compact_free_scanned |
เหตุการณ์การติดตามที่เกี่ยวข้องกับ mm
vmscan/mm_vmscan_kswapd_wake | vmscan/mm_vmscan_kswapd_sleep |
vmscan/mm_vmscan_direct_reclaim_begin | vmscan/mm_vmscan_direct_reclaim_end |
compaction/mm_compaction_begin | compaction/mm_compaction_end |
วิเคราะห์ข้อมูล mm_events
หากเปิดใช้ mm_events
รายงานข้อบกพร่องของเหตุการณ์ที่บันทึกไว้ไม่นานหลังจากที่อุปกรณ์เริ่มประสบปัญหาหน่วยความจําสูงจะให้สถิติ mm_events
ที่ผ่านมาในรูปแบบรายงานที่บีบอัดใน FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
คุณดูข้อมูลของ vmstat
และเหตุการณ์ ftrace
เพื่อวิเคราะห์ได้โดยใช้ Perfetto UI
ข้อมูล vmstat
อัปโหลดไฟล์ systrace.pftrace
ไปยัง Perfetto UI เพื่อดูข้อมูล vmstat
ที่แสดงเป็นกราฟบนไทม์ไลน์ดังที่แสดงในรูปที่ 1
รูปที่ 1 ไทม์ไลน์ของข้อมูลกราฟิก vmstat
เหตุการณ์ ftrace
mm_events
ของ ftrace
ที่จับภาพไว้จะไม่แสดงในไทม์ไลน์ หากต้องการดู ให้คลิกแท็บ Query SQL ตามที่แสดงในรูปที่ 2
รูปที่ 2 คลิกการค้นหา (SQL) เพื่อเข้าถึง
เปิดใช้ mm_events
หากต้องการเปิดใช้ mm_events ให้ตั้งค่า sysprop persist.mm_events.enabled=true
จาก vendor
init.rc
รายการต่อไปนี้มีไว้เพื่อลดหน่วยความจำและฟุตพริ้นท์ของ CPU ของ mm_events
- อินสแตนซ์
mm-events ftrace
ใช้บัฟเฟอร์ 4 KB ต่อ CPU - ทริกเกอร์
kmem_activity
ถูกจํากัดอัตราไว้ที่ 1 ครั้งต่อนาที - เซสชันการติดตาม
mm-events
จะใช้งานได้เพียง 1 รายการเท่านั้น
การปรับแต่ง
mm_events
ใช้ไฟล์การกําหนดค่าการติดตาม perfetto
เพื่อระบุสถิติที่จะบันทึกระหว่างเซสชันการติดตาม
คุณระบุการกำหนดค่าการติดตาม Perfetto ที่กำหนดเองได้ใน /vendor/etc/mm_events.cfg
ดูคำอธิบายของช่องการกําหนดค่าการติดตามที่ใช้ได้ได้ที่เอกสารประกอบของ Perfetto
ดูตัวอย่างการกําหนดค่าการติดตามได้ที่ตัวอย่างนี้
mm_events.cfg
ฟิลด์สำคัญที่จะรวมไว้ในการกำหนดค่าการติดตามเพื่อให้มั่นใจว่าช่องจะถูกเรียกใช้เมื่อหน่วยความจำกดดันจะแสดงอยู่ในข้อมูลโค้ด ดังนี้
# Ensures only 1 tracing session with this key can be active
unique_session_name: "perfetto_mm_events_session"
# If a trace with bugreport_score > 0 is running,
# the captured data is made available in the zipped bugreport
# at FS/data/misc/perfetto-traces/bugreport/systrace.pftrace
bugreport_score: 100
trigger_config {
trigger_mode: START_TRACING
trigger_timeout_ms: 3600000 # 1 hour
triggers {
# kmem_activity trigger gets activated when memory pressure
# is detected
name: "kmem_activity"
stop_delay_ms: 360000 # 6 mins
}
}
ในการกำหนดค่านี้ mm_events
จะเริ่มต้นทริกเกอร์ kmem_activity
ของ Perfetto และเซสชันการติดตาม Perfetto จะเริ่มบันทึกเหตุการณ์หน่วยความจำ vm_stats
และ ftrace
จนกว่าจะสิ้นสุดระยะเวลา stop_delay_ms
ที่กําหนดค่าไว้ ซึ่งเท่ากับ 36, 000 มิลลิวินาที (6 นาที)
มีการตั้งค่าการหมดเวลาของทริกเกอร์เป็นค่าที่สูง (ในกรณีนี้คือ 1 ชั่วโมง) และmm_events config
จะได้รับการกลับมาเปิดใช้งานเป็นระยะเพื่อให้แน่ใจว่า mm_events
จะเปิดอยู่เสมอ ระบบจะสร้างรายงานข้อบกพร่องขึ้น ซึ่งมีประเภทข้อมูลที่แสดงในรูปที่ 1 และรูปที่ 2