我们在 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
运行 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 中发现了此问题,并在以下文章中提供了解决方法: