อุปกรณ์ที่เปิดตัวใน 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
ย้อนหลังในรูปแบบรายงานที่บีบอัดเป็นไฟล์ ZIP ใน
FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
ทั้งvmstat
ข้อมูลและftrace
เหตุการณ์สามารถดูเพื่อการวิเคราะห์ได้โดยใช้
UI ของ Perfetto
ข้อมูล vmstat
อัปโหลดไฟล์ systrace.pftrace
ไปยัง UI ของ Perfetto เพื่อดูข้อมูล vmstat
ที่แสดงเป็นกราฟบนไทม์ไลน์ดังที่แสดงในรูปที่ 1
รูปที่ 1 ไทม์ไลน์ของข้อมูลกราฟิก vmstat
เหตุการณ์ ftrace
ftrace
mm_events
ที่บันทึกไว้จะไม่แสดงเป็นกราฟิกบนไทม์ไลน์ หากต้องการดู ให้คลิกแท็บค้นหา 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 Trace ที่กำหนดเองได้ใน /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
ระยะเวลาที่กำหนดค่าไว้ ซึ่งก็คือ 36000 มิลลิวินาที (6 นาที)
ระบบจะตั้งค่าการหมดเวลาของทริกเกอร์เป็นค่าขนาดใหญ่ (ในกรณีนี้คือ 1 ชั่วโมง) และ
mm_events config
จะเปิดใช้ซ้ำเป็นระยะเพื่อให้แน่ใจว่า mm_events
จะเปิดใช้เสมอ ระบบจะสร้างรายงานข้อบกพร่อง
ซึ่งมีประเภทข้อมูลที่แสดงในรูปที่ 1
และรูปที่ 2