![尽管 PAE 内核有大量可用内存,但仍会终止 OOM](https://linux22.com/image/1354167/%E5%B0%BD%E7%AE%A1%20PAE%20%E5%86%85%E6%A0%B8%E6%9C%89%E5%A4%A7%E9%87%8F%E5%8F%AF%E7%94%A8%E5%86%85%E5%AD%98%EF%BC%8C%E4%BD%86%E4%BB%8D%E4%BC%9A%E7%BB%88%E6%AD%A2%20OOM.png)
我们有一个应用服务器,由于遗留原因,它仍然在带有 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
表明可用的正常大页面并不多。
恐怕这不能完全回答你的问题,但它可以为你指明一个可能的探究方向。