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

อุปกรณ์ที่เปิดตัวใน Android 12 ขึ้นไปจะใช้ mm_events ซึ่งเป็นชุดสถิติเกี่ยวกับหน่วยความจำที่ได้รับการบันทึกเป็นระยะๆ ในขณะที่ระบบต้องใช้หน่วยความจำ mm_events ผสานรวมกับกลไกการติดตาม perfetto และเนื่องจากจะเปิดใช้งานก็ต่อเมื่อตรวจพบปัญหาหน่วยความจําไม่เพียงพอ การเพิ่มประสิทธิภาพจึงไม่มากนัก การรวบรวมสถิติจะเริ่มขึ้นเมื่อกลไก kswapd, direct reclaim, หรือ compaction ของเคอร์เนลเปิดใช้งาน และจะทำงานต่อไปตามระยะเวลาที่กำหนดค่าได้เพื่อบันทึกสถิติเป็นระยะๆ

mm_events จะแสดงมุมมองประวัติสถิติหน่วยความจำโดยย่อในช่วงที่หน่วยความจำทำงานหนักแทนที่จะแสดงภาพรวมสถานะหน่วยความจำของระบบแบบครั้งเดียวเมื่อมีการรายงานข้อบกพร่อง สถิติที่บันทึกไว้จะแสดงในตารางต่อไปนี้

ฟิลด์ vmstat

nr_free_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

เหตุการณ์การติดตามที่เกี่ยวข้องกับ mm

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/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 ที่แสดงเป็นกราฟในไทม์ไลน์

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

เหตุการณ์ ftrace

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

ค้นหาแท็บการค้นหา SQL แล้วคลิกเพื่อดู ftrace และ mm_events ที่บันทึกไว้และสร้างเป็นกราฟ

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