我们有一个应用服务器,由于遗留原因,它仍然在带有 PAE 的 32 位内核上运行(Ubuntu 12.04 LTS)。该服务器有 24GB 的 RAM,如 free 的输出所示:
$> 免费-lmt 已使用的、可用的、缓存的共享缓冲区总数 内存:24256 19468 4788 0 0 2382 低:189 146 42 最高:24067 19321 4745 -/+ 缓冲区/缓存:17085 7170 交换:19956 47 19908 总计:44212 19515 24697
但是,一旦实际内存使用量超过 16GB,进程就会被 OOM 终止程序(尤其是 Google Chrome)终止,并且 Java 的一些内存分配也往往会失败。我已经设置了
vm.overcommit_memory = 1
通过sysctl
,但似乎没有帮助。这是一个dmesg 摘录它显示了一次 OOM 之后的输出。
答案1
快速谷歌搜索oom killer premature
似乎表明有几个原因即使系统有足够的可用内存/交换空间,也可能调用 OOM killer。
一种可能的解释是内存碎片,特别是:
Normal: 2386*4kB 2580*8kB 197*16kB 6*32kB 4*64kB 0*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 35576kB
表明可用的正常大页面并不多。
恐怕这不能完全回答你的问题,但它可以为你指明一个可能的探究方向。