内存不足:杀死进程或牺牲孩子

杀死孩子的过程或牺牲 现在是早上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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端优化

加快网站的最佳实践 最小化HTTP请求 终端用户响应时间的80&#xff05;用于前端。大部分时间都在下载页面中的所有组件&#xff1a;图像&#xff0c;样式表&#xff0c;脚本&#xff0c;Flash等。减少组件数量又会减少呈现页面所需的HTTP请求数量。这是更快页面的关键。 组合…

将Array、Dictionary等集合类的序列化和反序列化

Objective-C的集合类序列化到文件中或者从文件中反序列化其实很简单&#xff0c;请看下面的示例代码&#xff1a; NSArray *array [NSArray arrayWithObjects:"Hefeweizen", "IPA", "Pilsner", "Stout", nil];NSDictionary *dictiona…

职场交流:一位软件工程师的7年总结

2009年05月13日15:06  来源&#xff1a;1、分享第一条经验&#xff1a;“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友 对这个道理有些体会吧。但我相信这一点也很重要&#xff1a;“重要的道理…

使用自定义断言丰富测试代码

受GeeCON会议期间tkaczanowski演讲的启发&#xff0c;我决定仔细研究AssertJ库的自定义断言。 在我的“骰子”游戏中&#xff0c;我创建了一个“机会”&#xff0c;它是骰子的任意组合&#xff0c;其分数是所有骰子的总和。 这是相对简单的对象&#xff1a; class Chance imp…

js判断数据类型

在js中如果想判断某种数据的数据类型&#xff0c;一般使用typeof方法 var str "string";var num 1;var bool true;var u;var n null;var nan NaN;var obj new Object();var fn function () {};console.log(typeof str); //stringconsole.log(typeof num); //n…

Elasticsearch 索引别名的使用

几种常用方式&#xff1a; 1.定时更新别名指向&#xff0c;更新后原索引可删除或保留 POST /_aliases {"actions": [{"add": {"alias": "logs_current","index": "logs_2018-10"}},{"remove": {"a…

Python的win32serviceutil之疑似BUG

郑昀玩聚SR 20090515 1、现象&#xff1a; 用Python的win32serviceutil控制Windows Service启动、停止、重启时&#xff0c;如下代码一般是没问题的。 import win32serviceutil def service_manager(action, machine, service): if action stop: win32serviceutil…

JavaFX 8u20天的未来过去(始终在最前面)

自从我发布有关JavaFX的主题以来已经有很长时间了。 因此&#xff0c;如果您仍在追随&#xff0c;那就太棒了&#xff01; 介绍 在这篇博客文章中&#xff0c;我想写一篇关于从JavaFX 8 update 20开始的非常酷的功能的博客&#xff0c;该功能使您的应用程序始终位于其他应用程…

cocos creator实战-(三)简单例子摇杆控制角色移动

&#xff08;待完善&#xff0c;给玩家加上摄像机跟随效果&#xff09; 1、stick监听cc.Node.EventType.TOUCH_MOVE事件&#xff0c;获取tick移动的坐标和朝向&#xff0c;限制移动的范围 2、根据stick的朝向&#xff0c;每帧更新player的位置和方向 // 摇杆代码 joy_stick.jsc…

统计数组中重复元素个数

/*** 循环统计数组或集合中的重复元素个数* param args*/public static void main(String[] args) {Map<String, Integer> map new HashMap<String, Integer>();String[] ss {"白","黑","绿","白"};for (int i 0; i &l…

火狐 和 IE 透明度的设置。

javascript 中设置如下。 Current 是一个div层。 if(Current.filters undefined) // fire fox { Current.style.MozOpacity 0.75; } else { // ie Current.filters.alpha.opacity…

使用Java 8.0进行类型安全的依赖项注入

所以我有时真的很想念旧学校的依赖注入。 当Spring仍然“轻量级”时&#xff0c;我们很高兴地使用“ 一天学习 ” Spring bean xml配置在application.xml文件中配置了所有bean。 缺点当然是类型安全性的损失。 我可以想到很多测试用例&#xff0c;这些用例的唯一目的是引导Spri…

a标签点击跳转失效--IE6、7的奇葩bug

一般运用a标签包含img去实现点击图片跳转的功能&#xff0c;这是前端经常要用到的东西。 今天遇到个神奇的bug&#xff1a;如果在img上再包裹一层div&#xff0c;而且div设置了width和height&#xff0c;则图片区域点击时&#xff0c;无任何响应。 出现这个bug的条件是&#…

python 数据类型之间的转换

Number数据类型转换 # ###强制类型换 Number (int float bool complex) var1 68 var2 6.89 var3 False var4 3-4j var5 "12345678" var6 "qwe123"#(1) int 强制转换成整型 res int(var2) res int(var3) #res int(var4) #TypeError: cant convert …

php构造数组,并把多数组插入php文件

晚上做的一点东西&#xff0c;发出来大家共享下&#xff01; Code<?php //php 链接数据库mysql_connect("localhost", "root", "hicc") or die("Could not connect: " . mysql_error());mysql_select_db("babyker");$re…

针对新手的Java EE7和Maven项目–第6部分

从前面的部分恢复 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分 &#xff0c; 第4 部分 &#xff0c; 第5部分 在上一篇文章&#xff08;第5部分&#xff09;中&#xff0c;我们发现了如何使用Arquillian&#xff08;我们的EJB服务&#xff09;进行单元测试&#xf…

1. 整除及其性质

整除的定义&#xff1a; 若整数 a 除以非零整数 b &#xff0c;商为整数且余数为零&#xff0c;即 a 能被 b 整除&#xff0c;记做 b | a&#xff0c;读作&#xff1a;b 整除 a 或 a 能被 b 整除。a 叫做 b 的倍数&#xff0c; b 叫做 a 的因数。 整除基本性质&#xff1a; 1. …

echarts 地图 免费离线js,json包分享

最近&#xff0c;项目中需要用到地图&#xff0c;由于项目的特殊性&#xff0c;只能使用内网获取数据。 然而&#xff0c;echarts官网上的离线地图包&#xff08;http://echarts.baidu.com/download-map.html&#xff09;早在一年前就不支持下载了&#xff0c;推荐使用地图API…

WPF 中的设备无关单位

WPF窗体以及内部的所有元素都是采用设备无关的单位来衡量的。一个设备无关单位定义为1英寸的96分之一&#xff0c;即1/96 inch。 假定我们创建了一个WPF按钮&#xff0c;其大小为96x96个单位&#xff0c;如果使用标准Windows的DPI设置&#xff08;96dpi&#xff09;&#xff0…

收藏网站制作常用经典css.div.布局.设计实例打包下载(下方有其他链接)

http://www.aa25.cn/234.shtml 转载于:https://www.cnblogs.com/asia/archive/2009/05/20/1467772.html