อุปกรณ์ที่เปิดตัวบน 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
ftrace
mm_events
ที่บันทึกไว้จะไม่แสดงเป็นกราฟิกบนไทม์ไลน์ หากต้องการดู ให้คลิกแท็บ Query SQL ดังแสดงในรูปที่ 2:
รูปที่ 2 คลิก Query (SQL) เพื่อเข้าถึง
เปิดใช้งาน mm_events
หากต้องการเปิดใช้งาน mm_events ให้ตั้งค่า sysprop persist.mm_events.enabled=true
จากผู้จำหน่าย init.rc
สิ่งต่อไปนี้มีไว้เพื่อลดขนาดหน่วยความจำและ CPU ของ mm_events:
- อินสแตนซ์
mm-events ftrace
ใช้บัฟเฟอร์ 4 KB ต่อ CPU - ทริกเกอร์
kmem_activity
ถูกจำกัดอัตราไว้ที่หนึ่งครั้งต่อนาที - เซสชันการติดตาม
mm-events
เท่านั้นที่สามารถใช้งานได้ตลอดเวลา
การปรับแต่ง
mm_events
ใช้ไฟล์กำหนดค่าการติดตาม perfetto
เพื่อระบุสถิติที่จะบันทึกระหว่างเซสชันการติดตาม
คุณสามารถจัดเตรียมการกำหนดค่าการติดตาม Perfetto แบบกำหนดเองได้ใน /vendor/etc/mm_events.cfg
สำหรับคำอธิบายของฟิลด์การกำหนดค่าการติดตามที่มีอยู่ โปรดดู Perfetto Docs สำหรับคอนฟิกูเรชันการติดตามตัวอย่าง ดูตัวอย่าง 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
จะเริ่มต้นทริกเกอร์ perfetto kmem_activity
และเซสชันการติดตาม Perfetto เริ่มต้นการจับ vm_stats
และเหตุการณ์หน่วยความจำ ftrace
จนกระทั่งสิ้นสุดระยะเวลา stop_delay_ms
ที่กำหนดค่าไว้ที่ 36000 ms (6 นาที) การหมดเวลาทริกเกอร์ถูกตั้งค่าเป็นค่าที่สูง (ในกรณีนี้คือ 1 ชั่วโมง) และ mm_events config
จะได้รับการปรับปรุงใหม่เป็นระยะเพื่อให้แน่ใจว่า mm_events
จะเปิดใช้งานอยู่เสมอ ผลลัพธ์ที่ได้คือรายงานข้อผิดพลาด ซึ่งมีประเภทของข้อมูลที่แสดงใน รูปที่ 1 และ รูปที่ 2