我们有三个 Ubuntu 12.04 机器,它们在 nginx 后面进行负载平衡。我们最初使用 apt-get 安装了 tomcat7,但遇到了一个问题,我认为内核由于 OOM 而终止了 java 进程。我切换到最新的 tomcat7 发行版并手动安装它。结果相同。
我们启用了交换文件。我最初按照托管提供商的建议将交换性设置为 0。我将其切换为 60。看起来这种情况仍在发生。
以下是我在系统日志中看到的内容:
Feb 8 06:35:38 processor1 kernel: [658920.280798] select 1 (init), adj 0, size 371, to kill
Feb 8 06:35:38 processor1 kernel: [658920.280813] select 425 (rsyslogd), adj 0, size 497, to kill
Feb 8 06:35:38 processor1 kernel: [658920.280827] select 18905 (bash), adj 0, size 1568, to kill
Feb 8 06:35:38 processor1 kernel: [658920.280831] select 28556 (java), adj 0, size 63276, to kill
Feb 8 06:35:38 processor1 kernel: [658920.280837] send sigkill to 28556 (java), adj 0, size 63276
系统信息:
- 512MB 内存
- 已启用 512MB 交换文件。
- OpenJDK 运行时环境(IcedTea 2.4.4)(7u51-2.4.4-0ubuntu0.12.04.2)
- OpenJDK 64 位服务器 VM(版本 24.45-b08,混合模式)
- Apache-tomcat-7.0.50
- 使用 -Xmx64m 设置 Java 内存
我可以看到内存使用量随着 Java 进程的增加和减少。我看到垃圾收集正在进行。我将监控使用情况,看到 RAM 下降到 <5MB,然后垃圾收集将发生,将内存恢复到超过 100MB 的可用空间。
Tomcat7 中没有发生错误。该进程每天至少被 Linux 内核杀死一次。
答案1
我见过一些 OOM-killer 启动的情况,但 OOM-killer 生成的日志与你的问题完全不同。所以我认为在较新的内核版本中 OOM-killer 发生了一些变化,所以我对这个短语进行了 livegrep“发送 sigkill 到”,结果如下。你可以看到这种日志不是来自 OOM-killer,而是来自 Android 的 lowmemory-killer。很奇怪。
知道问题的根源后我很快就发现这和这bugreport。这些报告解释了情况,看起来这个错误在 saucy 内核中已修复,但似乎在 precise 内核中尚未修复。
我不知道这个问题什么时候会在你的内核中修复(我认为是 3.8),但你可以通过安装将 12.04 安装更新到 13.10 内核硬件支持包和
sudo apt-get install --install-recommends linux-generic-lts-saucy xserver-xorg-lts-saucy libgl1-mesa-glx-lts-saucy
当然如果你xserver
的机器上没有使用(没有 GUI),那么只能使用以下命令安装较新的内核:
sudo apt-get install --install-recommends linux-generic-lts-saucy