สถิติหน่วยความจําที่ผ่านมาของเหตุการณ์ 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ย้อนหลังในรูปแบบรายงานที่บีบอัดเป็นไฟล์ ZIP ใน FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.

ทั้งvmstatข้อมูลและftraceเหตุการณ์สามารถดูเพื่อการวิเคราะห์ได้โดยใช้ UI ของ Perfetto

ข้อมูล vmstat

อัปโหลดไฟล์ systrace.pftrace ไปยัง UI ของ Perfetto เพื่อดูข้อมูล vmstat ที่แสดงเป็นกราฟบนไทม์ไลน์ดังที่แสดงในรูปที่ 1

ข้อมูล vmstat ที่สร้างกราฟในไทม์ไลน์

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

เหตุการณ์ ftrace

ftrace mm_events ที่บันทึกไว้จะไม่แสดงเป็นกราฟิกบนไทม์ไลน์ หากต้องการดู ให้คลิกแท็บค้นหา 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 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