OOM-Killer、jboss 和内核恐慌

OOM-Killer、jboss 和内核恐慌

我们在 VMWareEsx3.5(x64) 上运行 RedHat 3.4.6(x32),内存为 6GB。后台运行着一些 Java 进程(包括 jboss)。

问题是 Java 进程消耗大量内存,有时它们会被 OOM-killer 杀死。当 OOM-killer 即将启动时,可用物理内存非常低(100MB-200MB),但交换空间未被使用(99% 可用)。有时这也会导致内核崩溃。

  • 那么为什么不使用交换呢?
  • 如何调查此内核恐慌?
  • 在 32 位 Redhat 上使用 6GB 内存是否明智?

谢谢

答案1

就我个人而言,我永远不会使用 PAE(32 位系统上超过 4G RAM)。运行实际的 64 位内核和系统将获得更好的性能。

OOM 仅应在 malloc 可能失败时触发。(当您有大量可用交换时则不会)

32 位内核可能是部分原因。PAE 使用不同的内存区域,可能一个区域不允许从另一个区域 malloc。

您是否修改了交换功能?(内核将如何轻松使用交换功能。)cat /proc/sys/vm/swappiness?

您可能还研究调整 vm.dirty_ratio 或 vm.lower_zone_protection = 100。

您是否已捕获内核恐慌?(串行控制台通常是执行此操作的好方法)

您还可以尝试使用自己的进程监控软件来抢占 OOM-Killer。(查看 Monit)

祝你好运

答案2

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1002704

运行 Oracle/Java 的 RHEL4 虚拟机会随机被 OOM killer 杀死进程 详细信息 即使 ESX 没有内存负载,OOM killer 也会杀死应用程序。命令 top 显示大量内存正在被缓存,而交换空间几乎没有被使用。解决方案

当需要复制的数据大小超出物理内存的大小时,oom-killer 会开始随机杀死进程。

可以通过运行以下命令修复此问题:

sysctl -w vm.lower_zone_protection 100

当 lower_zone_protection 设置为 100 时,它会将可用页面阈值增加 100,从而更早地启动页面回收,并防止 NFS(网络文件系统)远远落后于内核的内存需求。这会导致页面回收更快地发生,从而为区域提供更多“保护”。Redhat 在 RHEL 中发现了此问题,并在以下文章中提供了解决方法:

相关内容