آمار حافظه تاریخی رویدادهای MM

دستگاه‌هایی که با اندروید ۱۲ و بالاتر راه‌اندازی می‌شوند، از mm_events ، مجموعه‌ای از آمارهای مرتبط با حافظه، استفاده می‌کنند که به صورت دوره‌ای در حالی که سیستم فشار حافظه را تجربه می‌کند، ثبت می‌شوند. mm_events با مکانیسم‌های ردیابی perfetto tracing) یکپارچه شده است و از آنجا که فقط زمانی فعال می‌شود که فشار حافظه شناسایی شود، سربار عملکرد اضافی آن حداقل است. جمع‌آوری آمار زمانی شروع می‌شود که مکانیسم‌های 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

رویدادهای ردیابی مرتبط با میلی‌متر

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 برای تجزیه و تحلیل مشاهده کرد.

داده‌های vmstat

فایل systrace.pftrace را در Perfetto UI آپلود کنید تا داده‌های vmstat را روی یک جدول زمانی، همانطور که در شکل 1 نشان داده شده است، مشاهده کنید:

vmstat data graphed on a timeline

شکل ۱. جدول زمانی داده‌های گرافیکی vmstat.

رویدادهای ftrace

mm_events ثبت شده توسط ftrace به صورت گرافیکی در جدول زمانی نشان داده نمی‌شوند. برای مشاهده آنها، روی برگه Query SQL که در شکل 2 نشان داده شده است، کلیک کنید:

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

شکل ۲. برای دسترسی، روی Query (SQL) کلیک کنید.

فعال کردن mm_events

برای فعال کردن mm_events، sysprop persist.mm_events.enabled=true از vendor init.rc تنظیم کنید.

موارد زیر برای کاهش مصرف حافظه و CPU توسط mm_events در نظر گرفته شده‌اند:

  • یک نمونه mm-events ftrace از یک بافر ۴ کیلوبایتی به ازای هر CPU استفاده می‌کند.
  • تریگر kmem_activity به یک بار در دقیقه محدود شده است.
  • فقط ۱ جلسه ردیابی mm-events می‌تواند در هر زمان فعال باشد.

سفارشی‌سازی

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 تریگر perfetto kmem_activity را آغاز می‌کند و جلسه ردیابی Perfetto شروع به ثبت رویدادهای حافظه vm_stats و ftrace تا پایان دوره پیکربندی شده stop_delay_ms ، یعنی ۳۶۰۰۰ میلی‌ثانیه (۶ دقیقه) می‌کند. زمان پایان تریگر روی یک مقدار بزرگ (در این مورد، ۱ ساعت) تنظیم می‌شود و mm_events config به صورت دوره‌ای مجدداً تنظیم می‌شود تا اطمینان حاصل شود که mm_events همیشه فعال است. در نتیجه، یک گزارش اشکال ایجاد می‌شود که حاوی نوع داده‌های نشان داده شده در شکل ۱ و شکل ۲ است.