สถิติหน่วยความจำในอดีตของเหตุการณ์ MM

อุปกรณ์ที่เปิดตัวบน 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:

vmstat data graphed on a timeline

รูปที่ 1. ไทม์ไลน์ของข้อมูลกราฟิก vmstat

เหตุการณ์ ftrace

ftrace mm_events ที่บันทึกไว้จะไม่แสดงเป็นกราฟิกบนไทม์ไลน์ หากต้องการดู ให้คลิกแท็บ Query SQL ดังแสดงในรูปที่ 2:

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

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