我在 server_A 上有一个 50 GB 的文件,我正在将它复制到 server_B。我跑
server_A$ rsync --partial --progress --inplace --append-verify 50GB_file root@server_B:50GB_file
Run Code Online (Sandbox Code Playgroud)
Server_B 有 32 GB RAM 和 2 GB 交换。它主要是空闲的,应该有很多空闲内存。它有足够的磁盘空间。在大约 32 GB 时,传输中止,因为远程端关闭了连接。
Server_B 现在已断开网络。我们要求数据中心重新启动它。当我查看崩溃前的内核日志时,我看到它使用了 0 字节的交换空间,并且进程列表使用了很少的内存(rsync 进程被列为使用 600 KB 的 RAM),但是 oom_killer 是变得疯狂,日志中的最后一件事是它杀死了 metalog 的内核读取器进程。
这是内核 3.2.59,32 位(因此任何进程都不能映射超过 4 GB)。
就好像 Linux 更优先考虑缓存而不是长期运行的守护进程。是什么赋予了??我怎样才能阻止它再次发生?
这是 oom_killer 的输出:
Sep 23 02:04:16 [kernel] [1772321.850644] clamd invoked oom-killer: gfp_mask=0x84d0, order=0, oom_adj=0, oom_score_adj=0
Sep 23 02:04:16 [kernel] [1772321.850649] Pid: 21832, comm: clamd Tainted: G C 3.2.59 #21
Sep 23 02:04:16 …Run Code Online (Sandbox Code Playgroud) 我有一个运行 CentOS 和 www/mail/db 的小型虚拟专用服务器,它最近发生了几次 Web 服务器和 ssh 无响应的事件。
查看日志,我看到 oom-killer 杀死了这些进程,可能是由于内存和交换空间不足。
谁能给我一些关于如何诊断可能导致最近发生的事件的指示?很可能是第一个进程被杀死了吗?我还应该去哪里找?
我正在调查为什么我们的两个进程被 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)