我应该如何决定在具有 2-4 GB RAM 的新 Linux 机器 (Debian) 上进行交换的大小?我真的需要交换空间吗?
当物理内存不足但有足够的交换空间时,如何让 Linux OOM 杀手不杀死我的进程?
我使用 sysctl vm.overcommit_memory=2 禁用了 OOM 杀戮和过度使用。
VM 有 3 GB 的完全免费的未碎片交换空间,被 OOM 杀死的进程的最大内存使用量小于 200MB。
我知道长期交换对性能来说会很糟糕,但是我现在需要使用交换来在内存要求更高的 valgrind 下进行功能测试。
Mar 7 02:43:11 myhost kernel: memcheck-amd64- invoked oom-killer: gfp_mask=0x24002c2, order=0, oom_score_adj=0
Mar 7 02:43:11 myhost kernel: memcheck-amd64- cpuset=/ mems_allowed=0
Mar 7 02:43:11 myhost kernel: CPU: 0 PID: 3841 Comm: memcheck-amd64- Not tainted 4.4.0-x86_64-linode63 #2
Mar 7 02:43:11 myhost kernel: Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014
Mar 7 02:43:11 myhost kernel: 0000000000000000 …Run Code Online (Sandbox Code Playgroud) 我正在调查为什么我们的两个进程被 Linux OOM 杀手杀死 - 尽管似乎有足够的 RAM 和大量可用的 SWAP。
当我通过这个答案解释它时,第一个内存请求要求 2^2=4 页(16KB)的内存(顺序标志)并希望它来自“正常”区域。
Jan 27 04:26:14 kernel: [639964.652706] java invoked oom-killer: gfp_mask=0x26000c0, order=2, oom_score_adj=0
Run Code Online (Sandbox Code Playgroud)
如果我正确解析输出,就会有足够的空间:
Node 0 Normal free:178144kB min:55068kB low:68832kB high:82600kB
Run Code Online (Sandbox Code Playgroud)
几分钟后第二次有同样的请求——而且似乎也有足够的可用空间。
为什么当时触发了OOM杀手?我解析的信息有误吗?
vm.overcommit_memory设置设置为“0”(启发式),这可能不是最佳的。实例一:
Jan 27 04:26:14 kernel: [639964.652706] java invoked oom-killer: gfp_mask=0x26000c0, order=2, oom_score_adj=0
Jan 27 04:26:14 kernel: [639964.652711] java cpuset=/ mems_allowed=0
Jan 27 04:26:14 kernel: [639964.652716] CPU: 5 PID: 2152 Comm: java Not tainted 4.4.0-59-generic …Run Code Online (Sandbox Code Playgroud)