xref: /aosp_15_r20/external/perfetto/docs/data-sources/memory-counters.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Memory counters and events
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerPerfetto allows to gather a number of memory events and counters on
4*6dbdd20aSAndroid Build Coastguard WorkerAndroid and Linux. These events come from kernel interfaces, both ftrace and
5*6dbdd20aSAndroid Build Coastguard Worker/proc interfaces, and are of two types: polled counters and events pushed by
6*6dbdd20aSAndroid Build Coastguard Workerthe kernel in the ftrace buffer.
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard Worker## Per-process polled counters
9*6dbdd20aSAndroid Build Coastguard Worker
10*6dbdd20aSAndroid Build Coastguard WorkerThe process stats data source allows to poll `/proc/<pid>/status` and
11*6dbdd20aSAndroid Build Coastguard Worker`/proc/<pid>/oom_score_adj` at user-defined intervals.
12*6dbdd20aSAndroid Build Coastguard Worker
13*6dbdd20aSAndroid Build Coastguard WorkerSee [`man 5 proc`][man-proc] for their semantic.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Worker### UI
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/proc_stat.png "UI showing trace data collected by process stats pollers")
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker### SQL
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Worker```sql
22*6dbdd20aSAndroid Build Coastguard Workerselect c.ts, c.value, t.name as counter_name, p.name as proc_name, p.pid
23*6dbdd20aSAndroid Build Coastguard Workerfrom counter as c left join process_counter_track as t on c.track_id = t.id
24*6dbdd20aSAndroid Build Coastguard Workerleft join process as p using (upid)
25*6dbdd20aSAndroid Build Coastguard Workerwhere t.name like 'mem.%'
26*6dbdd20aSAndroid Build Coastguard Worker```
27*6dbdd20aSAndroid Build Coastguard Workerts | counter_name | value_kb | proc_name | pid
28*6dbdd20aSAndroid Build Coastguard Worker---|--------------|----------|-----------|----
29*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.virt | 1326464 | com.android.vending | 28815
30*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.rss | 85592 | com.android.vending | 28815
31*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.rss.anon | 36948 | com.android.vending | 28815
32*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.rss.file | 46560 | com.android.vending | 28815
33*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.swap | 6908 | com.android.vending | 28815
34*6dbdd20aSAndroid Build Coastguard Worker261187015027350 | mem.rss.watermark | 102856 | com.android.vending | 28815
35*6dbdd20aSAndroid Build Coastguard Worker261187090251420 | mem.virt | 1326464 | com.android.vending | 28815
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard WorkerTo collect process stat counters every X ms set `proc_stats_poll_ms = X` in
40*6dbdd20aSAndroid Build Coastguard Workeryour process stats config. X must be greater than 100ms to avoid excessive CPU
41*6dbdd20aSAndroid Build Coastguard Workerusage. Details about the specific counters being collected can be found in the
42*6dbdd20aSAndroid Build Coastguard Worker[ProcessStats reference](/docs/reference/trace-packet-proto.autogen#ProcessStats).
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker```protobuf
45*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
46*6dbdd20aSAndroid Build Coastguard Worker    config {
47*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.process_stats"
48*6dbdd20aSAndroid Build Coastguard Worker        process_stats_config {
49*6dbdd20aSAndroid Build Coastguard Worker            scan_all_processes_on_start: true
50*6dbdd20aSAndroid Build Coastguard Worker            proc_stats_poll_ms: 1000
51*6dbdd20aSAndroid Build Coastguard Worker        }
52*6dbdd20aSAndroid Build Coastguard Worker    }
53*6dbdd20aSAndroid Build Coastguard Worker}
54*6dbdd20aSAndroid Build Coastguard Worker```
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker## Per-process memory events (ftrace)
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker### rss_stat
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard WorkerRecent versions of the Linux kernel allow to report ftrace events when the
61*6dbdd20aSAndroid Build Coastguard WorkerResident Set Size (RSS) mm counters change. This is the same counter available
62*6dbdd20aSAndroid Build Coastguard Workerin `/proc/pid/status` as `VmRSS`. The main advantage of this event is that by
63*6dbdd20aSAndroid Build Coastguard Workerbeing an event-driven push event it allows to detect very short memory usage
64*6dbdd20aSAndroid Build Coastguard Workerbursts that would be otherwise undetectable by using /proc counters.
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard WorkerMemory usage peaks of hundreds of MB can have dramatically negative impact on
67*6dbdd20aSAndroid Build Coastguard WorkerAndroid, even if they last only few ms, as they can cause mass low memory kills
68*6dbdd20aSAndroid Build Coastguard Workerto reclaim memory.
69*6dbdd20aSAndroid Build Coastguard Worker
70*6dbdd20aSAndroid Build Coastguard WorkerThe kernel feature that supports this has been introduced in the Linux Kernel
71*6dbdd20aSAndroid Build Coastguard Workerin [b3d1411b6] and later improved by [e4dcad20]. They are available in upstream
72*6dbdd20aSAndroid Build Coastguard Workersince Linux v5.5-rc1. This patch has been backported in several Google Pixel
73*6dbdd20aSAndroid Build Coastguard Workerkernels running Android 10 (Q).
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard Worker[b3d1411b6]: https://github.com/torvalds/linux/commit/b3d1411b6726ea6930222f8f12587d89762477c6
76*6dbdd20aSAndroid Build Coastguard Worker[e4dcad20]: https://github.com/torvalds/linux/commit/e4dcad204d3a281be6f8573e0a82648a4ad84e69
77*6dbdd20aSAndroid Build Coastguard Worker
78*6dbdd20aSAndroid Build Coastguard Worker### mm_event
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker`mm_event` is an ftrace event that captures statistics about key memory events
81*6dbdd20aSAndroid Build Coastguard Worker(a subset of the ones exposed by `/proc/vmstat`). Unlike RSS-stat counter
82*6dbdd20aSAndroid Build Coastguard Workerupdates, mm events are extremely high volume and tracing them individually would
83*6dbdd20aSAndroid Build Coastguard Workerbe unfeasible. `mm_event` instead reports only periodic histograms in the trace,
84*6dbdd20aSAndroid Build Coastguard Workerreducing sensibly the overhead.
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Worker`mm_event` is available only on some Google Pixel kernels running Android 10 (Q)
87*6dbdd20aSAndroid Build Coastguard Workerand beyond.
88*6dbdd20aSAndroid Build Coastguard Worker
89*6dbdd20aSAndroid Build Coastguard WorkerWhen `mm_event` is enabled, the following mm event types are recorded:
90*6dbdd20aSAndroid Build Coastguard Worker
91*6dbdd20aSAndroid Build Coastguard Worker* mem.mm.min_flt: Minor page faults
92*6dbdd20aSAndroid Build Coastguard Worker* mem.mm.maj_flt: Major page faults
93*6dbdd20aSAndroid Build Coastguard Worker* mem.mm.swp_flt: Page faults served by swapcache
94*6dbdd20aSAndroid Build Coastguard Worker* mem.mm.read_io: Read page faults backed by I/O
95*6dbdd20aSAndroid Build Coastguard Worker* mem.mm..compaction: Memory compaction events
96*6dbdd20aSAndroid Build Coastguard Worker* mem.mm.reclaim: Memory reclaim events
97*6dbdd20aSAndroid Build Coastguard Worker
98*6dbdd20aSAndroid Build Coastguard WorkerFor each event type, the event records:
99*6dbdd20aSAndroid Build Coastguard Worker
100*6dbdd20aSAndroid Build Coastguard Worker* count: how many times the event happened since the previous event.
101*6dbdd20aSAndroid Build Coastguard Worker* min_lat: the smallest latency (the duration of the mm event) recorded since
102*6dbdd20aSAndroid Build Coastguard Worker  the previous event.
103*6dbdd20aSAndroid Build Coastguard Worker* max_lat: the highest latency recorded since the previous event.
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Worker### UI
106*6dbdd20aSAndroid Build Coastguard Worker
107*6dbdd20aSAndroid Build Coastguard Worker![rss_stat and mm_event](/docs/images/rss_stat_and_mm_event.png)
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker### SQL
110*6dbdd20aSAndroid Build Coastguard Worker
111*6dbdd20aSAndroid Build Coastguard WorkerAt the SQL level, these events are imported and exposed in the same way as
112*6dbdd20aSAndroid Build Coastguard Workerthe corresponding polled events. This allows to collect both types of events
113*6dbdd20aSAndroid Build Coastguard Worker(pushed and polled) and treat them uniformly in queries and scripts.
114*6dbdd20aSAndroid Build Coastguard Worker
115*6dbdd20aSAndroid Build Coastguard Worker```sql
116*6dbdd20aSAndroid Build Coastguard Workerselect c.ts, c.value, t.name as counter_name, p.name as proc_name, p.pid
117*6dbdd20aSAndroid Build Coastguard Workerfrom counter as c left join process_counter_track as t on c.track_id = t.id
118*6dbdd20aSAndroid Build Coastguard Workerleft join process as p using (upid)
119*6dbdd20aSAndroid Build Coastguard Workerwhere t.name like 'mem.%'
120*6dbdd20aSAndroid Build Coastguard Worker```
121*6dbdd20aSAndroid Build Coastguard Worker
122*6dbdd20aSAndroid Build Coastguard Workerts | value | counter_name | proc_name | pid
123*6dbdd20aSAndroid Build Coastguard Worker---|-------|--------------|-----------|----
124*6dbdd20aSAndroid Build Coastguard Worker777227867975055 | 18358272 | mem.rss.anon | com.google.android.apps.safetyhub | 31386
125*6dbdd20aSAndroid Build Coastguard Worker777227865995315 | 5 | mem.mm.min_flt.count | com.google.android.apps.safetyhub | 31386
126*6dbdd20aSAndroid Build Coastguard Worker777227865995315 | 8 | mem.mm.min_flt.max_lat | com.google.android.apps.safetyhub | 31386
127*6dbdd20aSAndroid Build Coastguard Worker777227865995315 | 4 | mem.mm.min_flt.avg_lat | com.google.android.apps.safetyhub | 31386
128*6dbdd20aSAndroid Build Coastguard Worker777227865998023 | 3 | mem.mm.swp_flt.count | com.google.android.apps.safetyhub | 31386
129*6dbdd20aSAndroid Build Coastguard Worker
130*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
131*6dbdd20aSAndroid Build Coastguard Worker
132*6dbdd20aSAndroid Build Coastguard Worker```protobuf
133*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
134*6dbdd20aSAndroid Build Coastguard Worker    config {
135*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.ftrace"
136*6dbdd20aSAndroid Build Coastguard Worker        ftrace_config {
137*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "kmem/rss_stat"
138*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "mm_event/mm_event_record"
139*6dbdd20aSAndroid Build Coastguard Worker        }
140*6dbdd20aSAndroid Build Coastguard Worker    }
141*6dbdd20aSAndroid Build Coastguard Worker}
142*6dbdd20aSAndroid Build Coastguard Worker
143*6dbdd20aSAndroid Build Coastguard Worker# This is for getting Thread<>Process associations and full process names.
144*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
145*6dbdd20aSAndroid Build Coastguard Worker    config {
146*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.process_stats"
147*6dbdd20aSAndroid Build Coastguard Worker    }
148*6dbdd20aSAndroid Build Coastguard Worker}
149*6dbdd20aSAndroid Build Coastguard Worker```
150*6dbdd20aSAndroid Build Coastguard Worker
151*6dbdd20aSAndroid Build Coastguard Worker## System-wide polled counters
152*6dbdd20aSAndroid Build Coastguard Worker
153*6dbdd20aSAndroid Build Coastguard WorkerThis data source allows periodic polling of system data from:
154*6dbdd20aSAndroid Build Coastguard Worker
155*6dbdd20aSAndroid Build Coastguard Worker- `/proc/stat`
156*6dbdd20aSAndroid Build Coastguard Worker- `/proc/vmstat`
157*6dbdd20aSAndroid Build Coastguard Worker- `/proc/meminfo`
158*6dbdd20aSAndroid Build Coastguard Worker
159*6dbdd20aSAndroid Build Coastguard WorkerSee [`man 5 proc`][man-proc] for their semantic.
160*6dbdd20aSAndroid Build Coastguard Worker
161*6dbdd20aSAndroid Build Coastguard Worker### UI
162*6dbdd20aSAndroid Build Coastguard Worker
163*6dbdd20aSAndroid Build Coastguard Worker![System Memory Counters](/docs/images/sys_stat_counters.png
164*6dbdd20aSAndroid Build Coastguard Worker"Example of system memory counters in the UI")
165*6dbdd20aSAndroid Build Coastguard Worker
166*6dbdd20aSAndroid Build Coastguard WorkerThe polling period and specific counters to include in the trace can be set in the trace config.
167*6dbdd20aSAndroid Build Coastguard Worker
168*6dbdd20aSAndroid Build Coastguard Worker### SQL
169*6dbdd20aSAndroid Build Coastguard Worker
170*6dbdd20aSAndroid Build Coastguard Worker```sql
171*6dbdd20aSAndroid Build Coastguard Workerselect c.ts, t.name, c.value / 1024 as value_kb from counters as c left join counter_track as t on c.track_id = t.id
172*6dbdd20aSAndroid Build Coastguard Worker```
173*6dbdd20aSAndroid Build Coastguard Worker
174*6dbdd20aSAndroid Build Coastguard Workerts | name | value_kb
175*6dbdd20aSAndroid Build Coastguard Worker---|------|---------
176*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | MemAvailable | 1708956
177*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | Buffers | 6208
178*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | Cached | 1352960
179*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | SwapCached | 8232
180*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | Active | 1021108
181*6dbdd20aSAndroid Build Coastguard Worker775177736769834 | Inactive(file) | 351496
182*6dbdd20aSAndroid Build Coastguard Worker
183*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
184*6dbdd20aSAndroid Build Coastguard Worker
185*6dbdd20aSAndroid Build Coastguard WorkerThe set of supported counters is available in the
186*6dbdd20aSAndroid Build Coastguard Worker[TraceConfig reference](/docs/reference/trace-config-proto.autogen#SysStatsConfig)
187*6dbdd20aSAndroid Build Coastguard Worker
188*6dbdd20aSAndroid Build Coastguard Worker```protobuf
189*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
190*6dbdd20aSAndroid Build Coastguard Worker    config {
191*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.sys_stats"
192*6dbdd20aSAndroid Build Coastguard Worker        sys_stats_config {
193*6dbdd20aSAndroid Build Coastguard Worker            meminfo_period_ms: 1000
194*6dbdd20aSAndroid Build Coastguard Worker            meminfo_counters: MEMINFO_MEM_TOTAL
195*6dbdd20aSAndroid Build Coastguard Worker            meminfo_counters: MEMINFO_MEM_FREE
196*6dbdd20aSAndroid Build Coastguard Worker            meminfo_counters: MEMINFO_MEM_AVAILABLE
197*6dbdd20aSAndroid Build Coastguard Worker
198*6dbdd20aSAndroid Build Coastguard Worker            vmstat_period_ms: 1000
199*6dbdd20aSAndroid Build Coastguard Worker            vmstat_counters: VMSTAT_NR_FREE_PAGES
200*6dbdd20aSAndroid Build Coastguard Worker            vmstat_counters: VMSTAT_NR_ALLOC_BATCH
201*6dbdd20aSAndroid Build Coastguard Worker            vmstat_counters: VMSTAT_NR_INACTIVE_ANON
202*6dbdd20aSAndroid Build Coastguard Worker            vmstat_counters: VMSTAT_NR_ACTIVE_ANON
203*6dbdd20aSAndroid Build Coastguard Worker
204*6dbdd20aSAndroid Build Coastguard Worker            stat_period_ms: 1000
205*6dbdd20aSAndroid Build Coastguard Worker            stat_counters: STAT_CPU_TIMES
206*6dbdd20aSAndroid Build Coastguard Worker            stat_counters: STAT_FORK_COUNT
207*6dbdd20aSAndroid Build Coastguard Worker        }
208*6dbdd20aSAndroid Build Coastguard Worker    }
209*6dbdd20aSAndroid Build Coastguard Worker}
210*6dbdd20aSAndroid Build Coastguard Worker```
211*6dbdd20aSAndroid Build Coastguard Worker
212*6dbdd20aSAndroid Build Coastguard Worker
213*6dbdd20aSAndroid Build Coastguard Worker
214*6dbdd20aSAndroid Build Coastguard Worker## Low-memory Kills (LMK)
215*6dbdd20aSAndroid Build Coastguard Worker
216*6dbdd20aSAndroid Build Coastguard Worker#### Background
217*6dbdd20aSAndroid Build Coastguard Worker
218*6dbdd20aSAndroid Build Coastguard WorkerThe Android framework kills apps and services, especially background ones, to
219*6dbdd20aSAndroid Build Coastguard Workermake room for newly opened apps when memory is needed. These are known as low
220*6dbdd20aSAndroid Build Coastguard Workermemory kills (LMK).
221*6dbdd20aSAndroid Build Coastguard Worker
222*6dbdd20aSAndroid Build Coastguard WorkerNote LMKs are not always the symptom of a performance problem. The rule of thumb
223*6dbdd20aSAndroid Build Coastguard Workeris that the severity (as in: user perceived impact) is proportional to the state
224*6dbdd20aSAndroid Build Coastguard Workerof the app being killed. The app state can be derived in a trace from the OOM
225*6dbdd20aSAndroid Build Coastguard Workeradjustment score.
226*6dbdd20aSAndroid Build Coastguard Worker
227*6dbdd20aSAndroid Build Coastguard WorkerA LMK of a foreground app or service is typically a big concern. This happens
228*6dbdd20aSAndroid Build Coastguard Workerwhen the app that the user was using disappeared under their fingers, or their
229*6dbdd20aSAndroid Build Coastguard Workerfavorite music player service suddenly stopped playing music.
230*6dbdd20aSAndroid Build Coastguard Worker
231*6dbdd20aSAndroid Build Coastguard WorkerA LMK of a cached app or service, instead, is frequently business-as-usual and
232*6dbdd20aSAndroid Build Coastguard Workerin most cases won't be noticed by the end user until they try to go back to
233*6dbdd20aSAndroid Build Coastguard Workerthe app, which will then cold-start.
234*6dbdd20aSAndroid Build Coastguard Worker
235*6dbdd20aSAndroid Build Coastguard WorkerThe situation in between these extremes is more nuanced. LMKs of cached
236*6dbdd20aSAndroid Build Coastguard Workerapps/service can be still problematic if it happens in storms (i.e. observing
237*6dbdd20aSAndroid Build Coastguard Workerthat most processes get LMK-ed in a short time frame) and are often the symptom
238*6dbdd20aSAndroid Build Coastguard Workerof some component of the system causing memory spikes.
239*6dbdd20aSAndroid Build Coastguard Worker
240*6dbdd20aSAndroid Build Coastguard Worker### lowmemorykiller vs lmkd
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard Worker#### In-kernel lowmemorykiller driver
243*6dbdd20aSAndroid Build Coastguard WorkerIn Android, LMK used to be handled by an ad-hoc kernel-driver,
244*6dbdd20aSAndroid Build Coastguard WorkerLinux's [drivers/staging/android/lowmemorykiller.c](https://github.com/torvalds/linux/blob/v3.8/drivers/staging/android/lowmemorykiller.c).
245*6dbdd20aSAndroid Build Coastguard WorkerThis driver uses to emit the ftrace event `lowmemorykiller/lowmemory_kill`
246*6dbdd20aSAndroid Build Coastguard Workerin the trace.
247*6dbdd20aSAndroid Build Coastguard Worker
248*6dbdd20aSAndroid Build Coastguard Worker#### Userspace lmkd
249*6dbdd20aSAndroid Build Coastguard Worker
250*6dbdd20aSAndroid Build Coastguard WorkerAndroid 9 introduced a userspace native daemon that took over the LMK
251*6dbdd20aSAndroid Build Coastguard Workerresponsibility: `lmkd`. Not all devices running Android 9 will
252*6dbdd20aSAndroid Build Coastguard Workernecessarily use `lmkd` as the ultimate choice of in-kernel vs userspace is
253*6dbdd20aSAndroid Build Coastguard Workerup to the phone manufacturer, their kernel version and kernel config.
254*6dbdd20aSAndroid Build Coastguard Worker
255*6dbdd20aSAndroid Build Coastguard WorkerOn Google Pixel phones, `lmkd`-side killing is used since Pixel 2 running
256*6dbdd20aSAndroid Build Coastguard WorkerAndroid 9.
257*6dbdd20aSAndroid Build Coastguard Worker
258*6dbdd20aSAndroid Build Coastguard WorkerSee https://source.android.com/devices/tech/perf/lmkd for details.
259*6dbdd20aSAndroid Build Coastguard Worker
260*6dbdd20aSAndroid Build Coastguard Worker`lmkd` emits a userspace atrace counter event called `kill_one_process`.
261*6dbdd20aSAndroid Build Coastguard Worker
262*6dbdd20aSAndroid Build Coastguard Worker#### Android LMK vs Linux oomkiller
263*6dbdd20aSAndroid Build Coastguard Worker
264*6dbdd20aSAndroid Build Coastguard WorkerLMKs on Android, whether the old in-kernel `lowmemkiller` or the newer `lmkd`,
265*6dbdd20aSAndroid Build Coastguard Workeruse a completely different mechanism than the standard
266*6dbdd20aSAndroid Build Coastguard Worker[Linux kernel's OOM Killer](https://linux-mm.org/OOM_Killer).
267*6dbdd20aSAndroid Build Coastguard WorkerPerfetto at the moment supports only Android LMK events (Both in-kernel and
268*6dbdd20aSAndroid Build Coastguard Workeruser-space) and does not support tracing of Linux kernel OOM Killer events.
269*6dbdd20aSAndroid Build Coastguard WorkerLinux OOMKiller events are still theoretically possible on Android but extremely
270*6dbdd20aSAndroid Build Coastguard Workerunlikely to happen. If they happen, they are more likely the symptom of a
271*6dbdd20aSAndroid Build Coastguard Workermis-configured BSP.
272*6dbdd20aSAndroid Build Coastguard Worker
273*6dbdd20aSAndroid Build Coastguard Worker### UI
274*6dbdd20aSAndroid Build Coastguard Worker
275*6dbdd20aSAndroid Build Coastguard WorkerNewer userspace LMKs are available in the UI under the `lmkd` track
276*6dbdd20aSAndroid Build Coastguard Workerin the form of a counter. The counter value is the PID of the killed process
277*6dbdd20aSAndroid Build Coastguard Worker(in the example below, PID=27985).
278*6dbdd20aSAndroid Build Coastguard Worker
279*6dbdd20aSAndroid Build Coastguard Worker![Userspace lmkd](/docs/images/lmk_lmkd.png "Example of a LMK caused by lmkd")
280*6dbdd20aSAndroid Build Coastguard Worker
281*6dbdd20aSAndroid Build Coastguard WorkerTODO: we are working on a better UI support for LMKs.
282*6dbdd20aSAndroid Build Coastguard Worker
283*6dbdd20aSAndroid Build Coastguard Worker### SQL
284*6dbdd20aSAndroid Build Coastguard Worker
285*6dbdd20aSAndroid Build Coastguard WorkerBoth newer lmkd and legacy kernel-driven lowmemorykiller events are normalized
286*6dbdd20aSAndroid Build Coastguard Workerat import time and available under the `mem.lmk` key in the `instants` table.
287*6dbdd20aSAndroid Build Coastguard Worker
288*6dbdd20aSAndroid Build Coastguard Worker```sql
289*6dbdd20aSAndroid Build Coastguard WorkerSELECT ts, process.name, process.pid
290*6dbdd20aSAndroid Build Coastguard WorkerFROM instant
291*6dbdd20aSAndroid Build Coastguard WorkerJOIN process_track ON instant.track_id = process_track.id
292*6dbdd20aSAndroid Build Coastguard WorkerJOIN process USING (upid)
293*6dbdd20aSAndroid Build Coastguard WorkerWHERE instant.name = 'mem.lmk'
294*6dbdd20aSAndroid Build Coastguard Worker```
295*6dbdd20aSAndroid Build Coastguard Worker
296*6dbdd20aSAndroid Build Coastguard Worker| ts | name | pid |
297*6dbdd20aSAndroid Build Coastguard Worker|----|------|-----|
298*6dbdd20aSAndroid Build Coastguard Worker| 442206415875043 | roid.apps.turbo | 27324 |
299*6dbdd20aSAndroid Build Coastguard Worker| 442206446142234 | android.process.acore | 27683 |
300*6dbdd20aSAndroid Build Coastguard Worker| 442206462090204 | com.google.process.gapps | 28198 |
301*6dbdd20aSAndroid Build Coastguard Worker
302*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
303*6dbdd20aSAndroid Build Coastguard Worker
304*6dbdd20aSAndroid Build Coastguard WorkerTo enable tracing of low memory kills add the following options to trace config:
305*6dbdd20aSAndroid Build Coastguard Worker
306*6dbdd20aSAndroid Build Coastguard Worker```protobuf
307*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
308*6dbdd20aSAndroid Build Coastguard Worker    config {
309*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.ftrace"
310*6dbdd20aSAndroid Build Coastguard Worker        ftrace_config {
311*6dbdd20aSAndroid Build Coastguard Worker            # For old in-kernel events.
312*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "lowmemorykiller/lowmemory_kill"
313*6dbdd20aSAndroid Build Coastguard Worker
314*6dbdd20aSAndroid Build Coastguard Worker            # For new userspace lmkds.
315*6dbdd20aSAndroid Build Coastguard Worker            atrace_apps: "lmkd"
316*6dbdd20aSAndroid Build Coastguard Worker
317*6dbdd20aSAndroid Build Coastguard Worker            # This is not strictly required but is useful to know the state
318*6dbdd20aSAndroid Build Coastguard Worker            # of the process (FG, cached, ...) before it got killed.
319*6dbdd20aSAndroid Build Coastguard Worker            ftrace_events: "oom/oom_score_adj_update"
320*6dbdd20aSAndroid Build Coastguard Worker        }
321*6dbdd20aSAndroid Build Coastguard Worker    }
322*6dbdd20aSAndroid Build Coastguard Worker}
323*6dbdd20aSAndroid Build Coastguard Worker```
324*6dbdd20aSAndroid Build Coastguard Worker
325*6dbdd20aSAndroid Build Coastguard Worker## {#oom-adj} App states and OOM adjustment score
326*6dbdd20aSAndroid Build Coastguard Worker
327*6dbdd20aSAndroid Build Coastguard WorkerThe Android app state can be inferred in a trace from the process
328*6dbdd20aSAndroid Build Coastguard Worker`oom_score_adj`. The mapping is not 1:1, there are more states than
329*6dbdd20aSAndroid Build Coastguard Workeroom_score_adj value groups and the `oom_score_adj` range for cached processes
330*6dbdd20aSAndroid Build Coastguard Workerspans from 900 to 1000.
331*6dbdd20aSAndroid Build Coastguard Worker
332*6dbdd20aSAndroid Build Coastguard WorkerThe mapping can be inferred from the
333*6dbdd20aSAndroid Build Coastguard Worker[ActivityManager's ProcessList sources](https://cs.android.com/android/platform/superproject/+/android10-release:frameworks/base/services/core/java/com/android/server/am/ProcessList.java;l=126)
334*6dbdd20aSAndroid Build Coastguard Worker
335*6dbdd20aSAndroid Build Coastguard Worker```java
336*6dbdd20aSAndroid Build Coastguard Worker// This is a process only hosting activities that are not visible,
337*6dbdd20aSAndroid Build Coastguard Worker// so it can be killed without any disruption.
338*6dbdd20aSAndroid Build Coastguard Workerstatic final int CACHED_APP_MAX_ADJ = 999;
339*6dbdd20aSAndroid Build Coastguard Workerstatic final int CACHED_APP_MIN_ADJ = 900;
340*6dbdd20aSAndroid Build Coastguard Worker
341*6dbdd20aSAndroid Build Coastguard Worker// This is the oom_adj level that we allow to die first. This cannot be equal to
342*6dbdd20aSAndroid Build Coastguard Worker// CACHED_APP_MAX_ADJ unless processes are actively being assigned an oom_score_adj of
343*6dbdd20aSAndroid Build Coastguard Worker// CACHED_APP_MAX_ADJ.
344*6dbdd20aSAndroid Build Coastguard Workerstatic final int CACHED_APP_LMK_FIRST_ADJ = 950;
345*6dbdd20aSAndroid Build Coastguard Worker
346*6dbdd20aSAndroid Build Coastguard Worker// The B list of SERVICE_ADJ -- these are the old and decrepit
347*6dbdd20aSAndroid Build Coastguard Worker// services that aren't as shiny and interesting as the ones in the A list.
348*6dbdd20aSAndroid Build Coastguard Workerstatic final int SERVICE_B_ADJ = 800;
349*6dbdd20aSAndroid Build Coastguard Worker
350*6dbdd20aSAndroid Build Coastguard Worker// This is the process of the previous application that the user was in.
351*6dbdd20aSAndroid Build Coastguard Worker// This process is kept above other things, because it is very common to
352*6dbdd20aSAndroid Build Coastguard Worker// switch back to the previous app.  This is important both for recent
353*6dbdd20aSAndroid Build Coastguard Worker// task switch (toggling between the two top recent apps) as well as normal
354*6dbdd20aSAndroid Build Coastguard Worker// UI flow such as clicking on a URI in the e-mail app to view in the browser,
355*6dbdd20aSAndroid Build Coastguard Worker// and then pressing back to return to e-mail.
356*6dbdd20aSAndroid Build Coastguard Workerstatic final int PREVIOUS_APP_ADJ = 700;
357*6dbdd20aSAndroid Build Coastguard Worker
358*6dbdd20aSAndroid Build Coastguard Worker// This is a process holding the home application -- we want to try
359*6dbdd20aSAndroid Build Coastguard Worker// avoiding killing it, even if it would normally be in the background,
360*6dbdd20aSAndroid Build Coastguard Worker// because the user interacts with it so much.
361*6dbdd20aSAndroid Build Coastguard Workerstatic final int HOME_APP_ADJ = 600;
362*6dbdd20aSAndroid Build Coastguard Worker
363*6dbdd20aSAndroid Build Coastguard Worker// This is a process holding an application service -- killing it will not
364*6dbdd20aSAndroid Build Coastguard Worker// have much of an impact as far as the user is concerned.
365*6dbdd20aSAndroid Build Coastguard Workerstatic final int SERVICE_ADJ = 500;
366*6dbdd20aSAndroid Build Coastguard Worker
367*6dbdd20aSAndroid Build Coastguard Worker// This is a process with a heavy-weight application.  It is in the
368*6dbdd20aSAndroid Build Coastguard Worker// background, but we want to try to avoid killing it.  Value set in
369*6dbdd20aSAndroid Build Coastguard Worker// system/rootdir/init.rc on startup.
370*6dbdd20aSAndroid Build Coastguard Workerstatic final int HEAVY_WEIGHT_APP_ADJ = 400;
371*6dbdd20aSAndroid Build Coastguard Worker
372*6dbdd20aSAndroid Build Coastguard Worker// This is a process currently hosting a backup operation.  Killing it
373*6dbdd20aSAndroid Build Coastguard Worker// is not entirely fatal but is generally a bad idea.
374*6dbdd20aSAndroid Build Coastguard Workerstatic final int BACKUP_APP_ADJ = 300;
375*6dbdd20aSAndroid Build Coastguard Worker
376*6dbdd20aSAndroid Build Coastguard Worker// This is a process bound by the system (or other app) that's more important than services but
377*6dbdd20aSAndroid Build Coastguard Worker// not so perceptible that it affects the user immediately if killed.
378*6dbdd20aSAndroid Build Coastguard Workerstatic final int PERCEPTIBLE_LOW_APP_ADJ = 250;
379*6dbdd20aSAndroid Build Coastguard Worker
380*6dbdd20aSAndroid Build Coastguard Worker// This is a process only hosting components that are perceptible to the
381*6dbdd20aSAndroid Build Coastguard Worker// user, and we really want to avoid killing them, but they are not
382*6dbdd20aSAndroid Build Coastguard Worker// immediately visible. An example is background music playback.
383*6dbdd20aSAndroid Build Coastguard Workerstatic final int PERCEPTIBLE_APP_ADJ = 200;
384*6dbdd20aSAndroid Build Coastguard Worker
385*6dbdd20aSAndroid Build Coastguard Worker// This is a process only hosting activities that are visible to the
386*6dbdd20aSAndroid Build Coastguard Worker// user, so we'd prefer they don't disappear.
387*6dbdd20aSAndroid Build Coastguard Workerstatic final int VISIBLE_APP_ADJ = 100;
388*6dbdd20aSAndroid Build Coastguard Worker
389*6dbdd20aSAndroid Build Coastguard Worker// This is a process that was recently TOP and moved to FGS. Continue to treat it almost
390*6dbdd20aSAndroid Build Coastguard Worker// like a foreground app for a while.
391*6dbdd20aSAndroid Build Coastguard Worker// @see TOP_TO_FGS_GRACE_PERIOD
392*6dbdd20aSAndroid Build Coastguard Workerstatic final int PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ = 50;
393*6dbdd20aSAndroid Build Coastguard Worker
394*6dbdd20aSAndroid Build Coastguard Worker// This is the process running the current foreground app.  We'd really
395*6dbdd20aSAndroid Build Coastguard Worker// rather not kill it!
396*6dbdd20aSAndroid Build Coastguard Workerstatic final int FOREGROUND_APP_ADJ = 0;
397*6dbdd20aSAndroid Build Coastguard Worker
398*6dbdd20aSAndroid Build Coastguard Worker// This is a process that the system or a persistent process has bound to,
399*6dbdd20aSAndroid Build Coastguard Worker// and indicated it is important.
400*6dbdd20aSAndroid Build Coastguard Workerstatic final int PERSISTENT_SERVICE_ADJ = -700;
401*6dbdd20aSAndroid Build Coastguard Worker
402*6dbdd20aSAndroid Build Coastguard Worker// This is a system persistent process, such as telephony.  Definitely
403*6dbdd20aSAndroid Build Coastguard Worker// don't want to kill it, but doing so is not completely fatal.
404*6dbdd20aSAndroid Build Coastguard Workerstatic final int PERSISTENT_PROC_ADJ = -800;
405*6dbdd20aSAndroid Build Coastguard Worker
406*6dbdd20aSAndroid Build Coastguard Worker// The system process runs at the default adjustment.
407*6dbdd20aSAndroid Build Coastguard Workerstatic final int SYSTEM_ADJ = -900;
408*6dbdd20aSAndroid Build Coastguard Worker
409*6dbdd20aSAndroid Build Coastguard Worker// Special code for native processes that are not being managed by the system (so
410*6dbdd20aSAndroid Build Coastguard Worker// don't have an oom adj assigned by the system).
411*6dbdd20aSAndroid Build Coastguard Workerstatic final int NATIVE_ADJ = -1000;
412*6dbdd20aSAndroid Build Coastguard Worker```
413*6dbdd20aSAndroid Build Coastguard Worker
414*6dbdd20aSAndroid Build Coastguard Worker[man-proc]: https://manpages.debian.org/stretch/manpages/proc.5.en.html
415