Các thiết bị chạy trên Android 12 trở lên 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 thu thập định kỳ khi hệ thống gặp tình trạng thiếu 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 tình trạng thiếu bộ nhớ, nên chi phí hiệu suất bổ sung của tính năng này 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 kernel đượ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
để thu thập số liệu thống kê theo khoảng thời gian đều đặn.
Thay vì cung cấp ảnh chụp nhanh một lần về trạng thái bộ nhớ hệ thống khi báo cáo lỗi được gửi, mm_events sẽ cho thấy một chế độ xem tóm tắt về số liệu thống kê bộ nhớ trong các khoảng thời gian thiếu bộ nhớ. Số liệu thống kê được thu thập sẽ được liệt kê trong các bảng sau.
Các 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 |
Các 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, thì báo cáo lỗi cho các sự kiện được thu thập ngay sau khi thiết bị bắt đầu gặp tình trạng thiếu bộ nhớ sẽ cung cấp số liệu thống kê mm_events trước đây, ở dạng báo cáo được nén trong
FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Bạn có thể xem cả dữ liệu vmstat và các 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ẽ trên biểu đồ theo 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
Các mm_events ftrace được thu thập không xuất hiện ở dạng đồ hoạ trên dòng thời gian. Để xem các sự kiện này, hãy nhấp vào thẻ Truy vấn SQL như 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à các biện pháp để giảm thiểu mức sử dụng bộ nhớ và CPU của mm_events:
- Thực thể
mm-events ftracesử dụng bộ đệ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. - Chỉ có thể có 1 phiên theo dõi
mm-eventshoạt động tại bất kỳ thời điểm nào.
Tuỳ chỉnh
mm_events sử dụng tệp cấu hình theo dõi 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 theo dõi 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 theo dõi có sẵn, hãy xem Tài liệu
Perfetto.
Để biết cấu hình theo dõi mẫu, hãy xem ví dụ về
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 tình trạng thiếu bộ nhớ được trình bày trong đoạn mã sau:
# 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 theo dõi Perfetto bắt đầu thu thập các sự kiện bộ nhớ vm_stats và ftrace cho đến khi kết thúc khoảng thời gian stop_delay_ms được định cấu hình, tức là 36000 ms (6 phút).
Thời gian chờ của trình 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. Kết quả là một báo cáo lỗi
được tạo, chứa loại dữ liệu như trong Hình 1
và Hình 2.