713f066297
My horrible blog engine v0.0.0.0.1. Don’t judge. Change-Id: I427b4e84d67aa49793cb7625e4d8ca2824f00943 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2456 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
33 lines
1.9 KiB
Markdown
33 lines
1.9 KiB
Markdown
tags: linux
|
||
date: 2020-01-25
|
||
certainty: likely
|
||
status: initial
|
||
title: Preventing out-of-memory (OOM) errors on Linux
|
||
|
||
# Preventing out-of-memory (OOM) errors on Linux
|
||
|
||
I’ve been running out of memory more and more often lately. I don’t use any swap space because I am of the opinion that 16GB of memory should be sufficient for most daily and professional tasks. Which is generally true, however sometimes I have a runaway filling my memory. Emacs is very good at doing this for example, prone to filling your RAM when you open json files with very long lines.
|
||
|
||
In theory, the kernel OOM killer should come in and save the day, but the Linux OOM killer is notorious for being extremely … conservative. It will try to free every internal structure it can before even thinking about touching any userspace processes. At that point, the desktop usually stopped responding minutes ago.
|
||
|
||
Luckily the kernel provides memory statistics for the whole system, as well as single process, and the [`earlyoom`](https://github.com/rfjakob/earlyoom) tool uses those to keep memory usage under a certain limit. It will start killing processes, “heaviest” first, until the given upper memory limit is satisfied again.
|
||
|
||
On NixOS, I set:
|
||
|
||
```nix
|
||
{
|
||
services.earlyoom = {
|
||
enable = true;
|
||
freeMemThreshold = 5; # <%5 free
|
||
};
|
||
}
|
||
```
|
||
|
||
and after activation, this simple test shows whether the daemon is working:
|
||
|
||
```shell
|
||
$ tail /dev/zero
|
||
fish: “tail /dev/zero” terminated by signal SIGTERM (Polite quit request)
|
||
```
|
||
|
||
`tail /dev/zero` searches for the last line of the file `/dev/zero`, and since it cannot know that there is no next line and no end to the stream of `\0` this file produces, it will fill the RAM as quickly as physically possible. Before it can fill it completely, `earlyoom` recognizes that the limit was breached, singles out the `tail` command as the process using the most amount of memory, and sends it a `SIGTERM`.
|