现在是早上6点。 我清醒地总结了导致我太早醒来的电话的事件序列。 这些故事开始时,我的电话警报响了。 困倦而脾气暴躁的我检查了电话,看我是否真的疯了以至于无法在凌晨5点设置唤醒警报。 不,这是我们的监视系统,表明Plumbr服务之一已关闭。

作为该领域经验丰富的资深人士,我开启了浓缩咖啡机,朝着解决方案迈出了正确的第一步。 喝杯咖啡,我有能力解决这些问题。 首先怀疑的是,应用程序本身在崩溃之前似乎表现完全正常。 没有错误,没有警告标志,在应用程序日志中没有任何可疑的痕迹。

我们已经进行的监视已注意到该进程已终止,并且已经重新启动了崩溃的服务。 但是由于我的血液中已经含有咖啡因,所以我开始收集更多证据。 30分钟后,我发现自己盯着/var/log/kern.log中的以下内容:

Jun  4 07:41:59 plumbr kernel: [70667120.897649] Out of memory: Kill process 29957 (java) score 366 or sacrifice child
Jun  4 07:41:59 plumbr kernel: [70667120.897701] Killed process 29957 (java) total-vm:2532680kB, anon-rss:1416508kB, file-rss:0kB

显然,我们成为了Linux内核内部的受害者。 众所周知,Linux是由一堆邪恶的生物(称为“ 守护程序 ”)构建的。 这些守护程序由多个内核作业管理,其中之一似乎特别危险。 显然,所有现代Linux内核都具有一种称为“ 内存不足杀手 ”的内置机制,该机制可以在极低内存条件下消除您的进程。 当检测到这种情况时,将启动杀手并选择要杀死的进程。 使用一组对所有过程进行评分的启发式方法选择目标,然后选择得分最差的目标来杀死目标。

了解“内存不足的杀手””

默认情况下,Linux内核允许进程请求的内存比系统中当前可用的内存更多。 考虑到大多数进程实际上从未真正使用过它们分配的所有内存,因此这在世界范围内都是有意义的。 与这种方法最简单的比较是与电缆运营商进行比较。 他们向所有消费者提供100Mbit的下载承诺,远远超出了他们网络中的实际带宽。 再次押注的事实是,用户将不会同时全部使用其分配的下载限制。 因此,一个10Gbit链路可以成功服务超过我们的简单数学所允许的100个用户。

如果您的某些程序正在耗尽系统内存的路径上,这种方法的副作用是显而易见的,这可能导致内存极低,无法分配任何页面进行处理。 您可能已经遇到过这样的情况,即使没有root帐户也无法杀死有问题的任务。 为防止此类情况,杀手启动并确定要杀死的进程。

您可以从RedHat文档中的本文中了解有关微调“ 内存不足杀手 ”行为的更多信息。

是什么触发了内存不足杀手?

现在我们有了上下文,仍然不清楚是什么触发了“杀手”,并在凌晨5点将我叫醒? 更多调查显示:

  • / proc / sys / vm / overcommit_memory中的配置允许过量使用内存–设置为1,表示每个malloc()应该成功。
  • 该应用程序在EC2 m1.small实例上运行。 EC2实例默认情况下已禁用交换。

这两个事实,再加上我们服务中流量的突然激增,导致应用程序请求越来越多的内存来支持那些额外的用户。 过量使用配置允许为这个贪婪的过程分配越来越多的内存,最终触发了“ 内存不足杀手 ”,他正在按照自己的意图去做。 在半夜杀死我们的应用程序并将我叫醒。

当我向工程师描述这种行为时,其中一位工程师很感兴趣,可以创建一个小的测试用例来重现错误。 在Linux上编译并启动以下Java代码段时(我使用了最新的稳定Ubuntu版本):

package eu.plumbr.demo;
public class OOM {public static void main(String[] args){
java.util.List l = new java.util.ArrayList();
for (int i = 10000; i < 100000; i++) {try {l.add(new int[100_000_000]);} catch (Throwable t) {t.printStackTrace();}}
}
}

那么您将面临同样的内存不足:杀死进程<PID>(java)得分<SCORE>或牺牲子消息。

请注意,您可能需要调整交换文件和堆大小,在我的测试用例中,我使用了通过-Xmx2g指定的2g堆以及以下配置进行交换:

swapoff -a
dd if=/dev/zero of=swapfile bs=1024 count=655360
mkswap swapfile
swapon swapfile

解?

有几种方法可以处理这种情况。 在我们的示例中,我们只是将系统迁移到具有更多内存的实例。 我还考虑了允许交换,但是在咨询了工程人员之后,我想起了一个事实,那就是JVM上的垃圾回收进程不擅长在交换下运行,因此该选项不在讨论之列。

其他可能性包括微调OOM杀手 ,在几个小实例上水平扩展负载或减少应用程序的内存需求。

如果您发现研究有趣– 在Twitter或RSS 上关注Plumbr ,我们将继续发布有关Java内部知识的见解。

翻译自: https://www.javacodegeeks.com/2014/06/out-of-memory-kill-process-or-sacrifice-child.html

内存不足:杀死进程或牺牲孩子相关推荐

  1. 内存不足:杀死进程还是牺牲子进程

    早上6点,我不得不开始处理"叫醒"我的一些问题.因为当这些问题发生的时候,我的手机铃声响了.昏睡中的我非常不情愿地拿起了手机,检查我是否疯狂到将叫醒闹钟设在了早上5点.原来是监控系 ...

  2. linux如何杀死进程最快,如何在Linux系统中杀掉内存消耗最大的进程?

    作为一名博客作者,我收藏了很多博客.网站和论坛用来寻找 Linux 和 Unix 相关的内容.有时候,我在浏览器中开启了非常多的标签页,导致操作系统会无响应好几分钟.我不能移动我的鼠标,也不能杀掉一个 ...

  3. 奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)...

    1. 二叉树最近公共祖先 奇安信集团 2020校招 服务端开发-应用开发方向在线考试 编程题|20分2/2 寻祖问宗 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C+ ...

  4. Linux如何查看进程、杀死进程、查看端口等常用命令

    查看进程号 1.ps 命令用于查看当前正在运行的进程.grep 是搜索 例如: ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 2.ps -aux | gr ...

  5. Linux OOM 自动杀死进程(转)

    Linux OOM 自动杀死进程 问题描述: 今天上班后,登录一台内网测试服务器,发现部分进程失踪 (Nginx/PHP-FPM/MySQL/Crond). 解决方法: 1.首先启动这些进程,保证正常 ...

  6. centos 杀死进程命令kill

    2019独角兽企业重金招聘Python工程师标准>>> Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能.在Linux 系统中,有 5 种常见的进程 ...

  7. linux杀死oracle进程,杀死进程后,oracle数据库无法启动

    报错信息: 报错信息一: You are running addbctl.sh version 120.1 Starting the database PROD ... SQL*Plus: Relea ...

  8. linux查看杀死进程

    linux 中使用top 或 ps 查看进程使用kill杀死进程 1.使用top查看进程: $top 进行执行如上命令即可查看top!但是难点在如何以进程的cpu占用量进行排序呢? cpu占用量排序执 ...

  9. linux与windows查看占用端口的进程ID并杀死进程

    有时候tomcat出现端口被占用,需要查出进程ID并杀死进程. 1.查找占用端口的进程ID(windows与linux一样  8005也可以加上引号   grep可以用findstr替换) 6904就 ...

最新文章

  1. scala 时间格式转换(String、Long、Date)
  2. 我们是如何拿下Google和Facebook Offer的?
  3. tensorflow reshape,range用法
  4. raft算法_Raft算法与实现
  5. Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件
  6. java-io流入门
  7. LCT(Link Cut Tree)总结
  8. python编程else是什么意思_Python编程
  9. python简单计算器异常处理_Python计算器(正确除零)
  10. KVASER新手入门的常见十一个问题
  11. SLA技术3D打印机的原理
  12. 蒙特卡罗方法(Monte Carlo)
  13. C#中的InputBox
  14. 目标检测之DarkNet-DarkNet源码解读<二>训练篇
  15. Android 实现 iBeacon
  16. JavaScript基于qrcode.js带Logo彩色二维码(艺术二维码)
  17. 微信智能机器人助手,基于hook技术,自动聊天机器人
  18. 计算机文字转表格,Word怎么把文字转换成表格 30秒搞定
  19. Table 类 - Google Guava
  20. 阿里云服务器漏洞phpmyadmin CVE-2016-6617 SQL注入漏洞 解决方法

热门文章

  1. 电脑基本快捷键的使用
  2. git删除本地分支、删除远程分支 复制分支
  3. sql注入攻击和PreparedStatement有效防止sql注入攻击
  4. 移除指定的session
  5. 在Spring Boot中使用切面统一处理自定义的异常
  6. 重新学习Spring一--Spring在web项目中的启动过程
  7. cloud foundry_介绍“又一个” Cloud Foundry Gradle插件
  8. java 开发:md5_Java社区调查结果:74%的开发人员希望减少详细程度
  9. jdk入门_JDK 9 REPL:入门
  10. Hibernate锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作