| # Out-of-memory (OOM) system | |
| This file contains information about the systems that watch for and respond to | |
| out-of-memory (OOM) events. | |
| [TOC] | |
| ## Behavior | |
| When the system runs out of memory and the kernel OOM thread is running, you | |
| should see a series of log messages like: | |
| ``` | |
| OOM: 5915.8M free (+0B) / 8072.4M total | |
| OOM: oom_lowmem(shortfall_bytes=524288) called | |
| OOM: Process mapped committed bytes: | |
| OOM: proc 1043 397M 'bin/devmgr' | |
| OOM: proc 2107 88M 'driver_host:pci#1:8086:1916' | |
| OOM: proc 1297 12M 'virtual-console' | |
| OOM: proc 3496 17M 'netstack' | |
| OOM: proc 4157 170M 'flutter:userpicker_device_shell' | |
| OOM: proc 28708 353M 'flutter:armadillo_user_... (+3)' | |
| OOM: proc 31584 9M 'dart:weather_agent' | |
| OOM: proc 32093 14M 'dart:mi_dashboard.dartx' | |
| OOM: Finding a job to kill... | |
| OOM: (skip) job 57930 'story-8cf82cb9f742d9ecc77f1d449' | |
| OOM: (skip) job 37434 'story-10293ae401bc0358b3ce52d2a' | |
| OOM: *KILL* job 29254 'agent' | |
| OOM: + proc 32093 run 'dart:mi_dashboard.dartx' | |
| OOM: = 1 running procs (1 total), 0 jobs | |
| OOM: (next) job 29247 'agent' | |
| OOM: (next) job 29240 'agent' | |
| OOM: (next) job 29233 'agent' | |
| ``` | |
| The first line shows the current state of system memory: | |
| ``` | |
| OOM: 45.8M free (-12.4M) / 8072.4M total | |
| ``` | |
| The next section prints a list of processes that are consuming large amounts of | |
| memory, in no particular order: | |
| ``` | |
| OOM: Process mapped committed bytes: | |
| OOM: proc 1043 397M 'bin/devmgr' | |
| OOM: proc 2107 88M 'driver_host:pci#1:8086:1916' | |
| OOM: proc 1297 12M 'virtual-console' | |
| OOM: ... | |
| ^koid ^mem | |
| ``` | |
| The next section shows the walk through the ranked job list, printing skipped | |
| jobs (which don't have killable process descendants), the job that will be | |
| killed, and the next jobs on the chopping block: | |
| ``` | |
| OOM: Finding a job to kill... | |
| OOM: (skip) job 57930 'story-8cf82cb9f742d9ecc77f1d449' | |
| OOM: (skip) job 37434 'story-10293ae401bc0358b3ce52d2a' | |
| OOM: *KILL* job 29254 'agent' | |
| OOM: + proc 32093 run 'dart:mi_dashboard.dartx' | |
| OOM: = 1 running procs (1 total), 0 jobs | |
| OOM: (next) job 29247 'agent' | |
| OOM: (next) job 29240 'agent' | |
| OOM: (next) job 29233 'agent' | |
| ^koid ^name | |
| ``` | |
| The `*KILL*` entry will also show all process descendants of the to-be-killed | |
| job. | |
| ## Components | |
| ### Kernel OOM thread | |
| A kernel thread that periodically checks the amount of free memory in the | |
| system, and kills a job if the free amount is too low (below the "redline"). | |
| Use `k oom info` to see the state of the OOM thread (on the kernel console): | |
| ``` | |
| $ k oom info | |
| OOM info: | |
| running: true | |
| printing: false | |
| simulating lowmem: false | |
| sleep duration: 1000ms | |
| redline: 50M (52428800 bytes) | |
| ``` | |
| The redline, sleep duration, and auto-start values are controlled by | |
| `kernel.oom.*` [kernel commandline flags](/docs/reference/kernel/kernel_cmdline.md). | |
| The thread can be started with `k oom start` and stopped with `k oom stop`. | |
| `k oom print` will toggle a flag that prints the current free and total memory | |
| every time the thread wakes up. | |
| `k oom lowmem` will trigger a false low-memory event the next time the thread | |
| wakes up, potentially killing a job. | |
| ### OOM-ranker driver | |
| TODO(dbort/maniscalco): Implement and document. |