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