Các thiết bị chạy Android 12 trở lên sẽ sử dụng mm_events, một tập hợp các số liệu thống kê liên quan đến bộ nhớ được ghi lại định kỳ trong khi hệ thống chịu áp lực về bộ nhớ. mm_events được tích hợp với cơ chế theo dõi perfetto và vì chỉ được kích hoạt khi phát hiện thấy áp lực bộ nhớ, nên hiệu suất bổ sung của nó là tối thiểu. Quá trình thu thập số liệu thống kê bắt đầu khi các cơ chế kswapd, direct reclaim, hoặc compaction của nhân được kích hoạt và vẫn hoạt động trong một khoảng thời gian có thể định cấu hình để ghi lại số liệu thống kê theo các khoảng thời gian đều đặn.
Thay vì cung cấp thông tin nhanh về trạng thái bộ nhớ hệ thống tại một thời điểm khi báo cáo lỗi được gửi, mm_events cho thấy thông tin tóm tắt về số liệu thống kê bộ nhớ trong các khoảng thời gian bộ nhớ bị quá tải. Các số liệu thống kê được ghi lại sẽ xuất hiện trong các bảng sau.
Trường 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 |
Sự kiện theo dõi liên quan đến mm
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 |
Phân tích dữ liệu mm_events
Nếu mm_events được bật, báo cáo lỗi cho các sự kiện được ghi lại ngay sau khi thiết bị bắt đầu gặp phải tình trạng áp lực bộ nhớ cao sẽ cung cấp số liệu thống kê mm_events trong quá khứ, dưới dạng báo cáo nén trong FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Bạn có thể xem cả dữ liệu vmstat và sự kiện ftrace để phân tích bằng Giao diện người dùng Perfetto.
Dữ liệu vmstat
Tải tệp systrace.pftrace lên giao diện người dùng Perfetto để xem dữ liệu vmstat được vẽ biểu đồ trên dòng thời gian như trong Hình 1:
Hình 1. Dòng thời gian của dữ liệu đồ hoạ vmstat.
Sự kiện ftrace
ftrace mm_events đã chụp không xuất hiện dưới dạng đồ hoạ trên dòng thời gian. Để xem các bảng này, hãy nhấp vào thẻ Query SQL (Truy vấn SQL) như minh hoạ trong Hình 2:
Hình 2. Nhấp vào Truy vấn (SQL) để truy cập.
Bật mm_events
Để bật mm_events, hãy đặt sysprop persist.mm_events.enabled=true từ nhà cung cấp init.rc.
Sau đây là những biện pháp nhằm giảm mức sử dụng bộ nhớ và CPU của mm_events:
- Một thực thể
mm-events ftracesử dụng bộ nhớ đệm 4 KB cho mỗi CPU. - Trình kích hoạt
kmem_activitybị giới hạn tốc độ ở mức một lần mỗi phút. - Mỗi lần, bạn chỉ có thể kích hoạt 1 phiên theo dõi
mm-events.
Tuỳ chỉnh
mm_events sử dụng tệp cấu hình dấu vết perfetto để chỉ định số liệu thống kê cần thu thập trong phiên theo dõi.
Bạn có thể cung cấp cấu hình dấu vết Perfetto tuỳ chỉnh trong /vendor/etc/mm_events.cfg.
Để biết nội dung mô tả về các trường cấu hình dấu vết có sẵn, hãy xem Tài liệu Perfetto.
Để biết cấu hình dấu vết mẫu, hãy xem ví dụ mm_events.cfg này.
Các trường quan trọng cần đưa vào cấu hình theo dõi để đảm bảo cấu hình đó được kích hoạt do áp lực bộ nhớ xuất hiện trong đoạn mã:
# 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
}
}
Trong cấu hình này, mm_events sẽ khởi tạo trình kích hoạt kmem_activity perfetto và phiên truy vết Perfetto bắt đầu ghi lại các sự kiện vm_stats và ftrace về bộ nhớ cho đến khi kết thúc khoảng thời gian stop_delay_ms đã định cấu hình là 36000 mili giây (6 phút).
Thời gian chờ kích hoạt được đặt thành một giá trị lớn (trong trường hợp này là 1 giờ) và mm_events config được định kỳ kích hoạt lại để đảm bảo rằng mm_events luôn được bật. Do đó, một báo cáo lỗi sẽ được tạo, chứa loại dữ liệu xuất hiện trong Hình 1 và Hình 2.