دستگاههایی که با اندروید ۱۲ و بالاتر راهاندازی میشوند، از 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.
رویدادهای ftrace
mm_events ثبت شده توسط ftrace به صورت گرافیکی در جدول زمانی نشان داده نمیشوند. برای مشاهده آنها، روی برگه Query SQL که در شکل 2 نشان داده شده است، کلیک کنید:

شکل ۲. برای دسترسی، روی 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 همیشه فعال است. در نتیجه، یک گزارش اشکال ایجاد میشود که حاوی نوع دادههای نشان داده شده در شکل ۱ و شکل ۲ است.