MM Olayları - Geçmiş Bellek İstatistikleri

Android 12 ve sonraki sürümlerde başlatılan cihazlar, bir sistem bellek baskısı yaşarken periyodik olarak yakalanan bellekle ilgili bir dizi istatistik olan mm_events kullanır. mm_events , perfetto izleme mekanizmalarıyla entegredir ve yalnızca bellek basıncı algılandığında etkinleştirildiğinden, ek performans yükü minimumdur. İstatistik toplama, çekirdeğin kswapd , direct reclaim, veya compaction mekanizmaları etkinleştirildiğinde başlar ve düzenli aralıklarla istatistikleri yakalamak için yapılandırılabilir bir süre boyunca etkin kalır.

Bir hata raporu dosyalandığında sistem bellek durumunun bir kerelik anlık görüntüsünü sağlamak yerine mm_events , bellek baskısı dönemleri sırasında bellek istatistiklerinin kısa bir geçmiş görünümünü gösterir. Yakalanan istatistikler aşağıdaki tablolarda listelenmiştir.

vmstat alanları

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 ile ilgili iz olayları

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 verilerini analiz etme

mm_events etkinleştirilirse, bir cihaz yüksek bellek baskısı yaşamaya başladıktan hemen sonra yakalanan olaylara ilişkin hata raporları, FS/data/misc/perfetto-traces/bugreport/systrace.pftrace. içinde sıkıştırılmış bir rapor biçiminde geçmiş mm_events istatistiklerini sağlar. FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.

Perfetto UI kullanılarak analiz için hem vmstat verileri hem de ftrace olayları görüntülenebilir.

vmstat verileri

Aşağıda gösterildiği gibi bir zaman çizelgesinde grafik olarak gösterilen vmstat verilerini görmek için systrace.pftrace dosyasını Perfetto UI'ye yükleyin.

vmstat data graphed on a timeline

Şekil 1. vmstat grafik verilerinin zaman çizelgesi

ftrace olayları

Yakalanan ftrace mm_events , zaman çizelgesinde grafik olarak gösterilmez. Bunları görüntülemek için, Şekil 2'de gösterildiği gibi bulunan SQL Sorgula sekmesine tıklayın.

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

Şekil 2. Erişmek için Sorgu'ya (SQL) tıklayın

mm_events'i etkinleştirme

mm_events'i etkinleştirmek için, satıcı init.rc sysprop persist.mm_events.enabled=true değerini ayarlayın.

mm_events'in bellek ve CPU ayak izini azaltmak için aşağıdakiler mevcuttur:

  • Bir mm-events ftrace örneği, CPU başına 4 KB arabellek kullanır.
  • kmem_activity tetikleyicisi, dakikada bir kez hız ile sınırlıdır.
  • Herhangi bir zamanda sadece 1 mm-events izleme oturumu aktif olabilir.

özelleştirme

mm_events , izleme oturumu sırasında hangi istatistiklerin yakalanacağını belirtmek için bir perfetto izleme yapılandırma dosyası kullanır.

/vendor/etc/mm_events.cfg içinde özel bir Perfetto izleme yapılandırması sağlayabilirsiniz. Kullanılabilir izleme yapılandırma alanlarının açıklaması için Perfetto Belgelerine bakın. Örnek bir izleme yapılandırması için bu mm_events.cfg örneğine bakın.

Bellek baskısı tarafından tetiklenmesini sağlamak için izleme yapılandırmanıza dahil edilecek önemli alanlar aşağıdaki snippet'te gösterilmektedir.

# 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
  }
}

Bu yapılandırmada mm_events , perfetto kmem_activity tetikleyicisini başlatır ve Perfetto izleme oturumu, yapılandırılan stop_delay_ms döneminin (6 dakika) sonuna kadar vm_stats ve ftrace bellek olaylarını yakalamaya başlar. Tetikleme zaman aşımı büyük bir değere ayarlanır (bu durumda, 1 saat) ve mm_events her zaman etkin olduğundan emin olmak için mm_events config periyodik olarak yeniden başlatılır. Sonuç olarak, Şekil 1 ve Şekil 2'de gösterilen veri türünü içeren bir hata raporu oluşturulur.