我们经历了一个(至少在我们眼中)奇怪的问题:
我们在同一台linux机器(CentOS 6.6)上安装了两个WildFail8.1,它们以不同的版本运行相同的应用程序,并监听不同的端口。
现在,我们突然发现,当启动其中一个时,另一个被杀了。然后我们发现,由于其他泄漏过程,空闲内存的数量很低。当我们杀死它们的时候,这两只野鸟再次正确地运行了。
因为我不认为linux本身决定扼杀另一个随机进程,所以我假设JBoss有某种机制来通过杀死它认为不再需要的东西来释放内存,或者它们都使用了(可能是错误的配置)资源,导致其中一个在无法获得内存的情况下被杀死。
有没有人经历过类似的事情,或者知道这种机制?
发布于 2015-01-20 09:50:11
很可能是linux OOM Killer。您可以通过检查日志文件来验证其中一个服务器是否被它杀死:
grep -i kill /var/log/messages*
如果是的话,你应该看到这样的东西:
host kernel: Out of Memory: Killed process 2592
OOM杀手在确定要杀死哪个进程时使用以下算法:
函数select_bad_process()负责选择要终止的进程。它通过逐步遍历每个运行的任务并计算它是否适合于使用and ()函数杀死。不良性的计算如下,注意,平方根是用int_sqrt()计算的整数逼近;
badness_for_task = total_vm_for_task / (sqrt(cpu_time_in_seconds) *
sqrt(sqrt(cpu_time_in_minutes)))选择此选项是为了选择一个使用大量内存但寿命并不长的进程。已运行很长时间的进程不太可能是内存不足的原因,因此此计算可能会选择使用大量内存但运行时间不长的进程。
通过读取进程目录中的badness文件,您可以手动查看每个进程的oom_score。
cat /proc/10292/oom_score
https://stackoverflow.com/questions/27844528
复制相似问题