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

linux 内存不足杀进程

杀死孩子的过程或牺牲 现在是早上六点。 我清醒地总结了导致我太早唤醒电话的事件顺序。 这些故事开始时,我的电话警报响了。 困倦而脾气暴躁的我检查了电话,看我是否真的疯了以至于无法在凌晨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文档中的本文中了解有关微调“ Out of memory Killer ”行为的更多信息。

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

现在我们有了背景,现在还不清楚是什么触发了“杀手””并在凌晨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

linux 内存不足杀进程

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

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

相关文章

为什么声明性编码使您成为更好的程序员

在许多情况下&#xff0c;具有功能组成的声明式解决方案提供了优于传统命令式代码的优越代码度量。 阅读本文并了解如何使用具有功能组成的声明性代码成为更好的程序员。 在本文中&#xff0c;我们将仔细研究三个问题示例&#xff0c;并研究用于解决这些问题的两种不同技术&am…

高效的企业测试-单元和用例测试(2/6)

在本系列的第一部分中&#xff0c;我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中&#xff0c;我们将仔细研究代码级单元测试以及组件或用例测试。 单元测试 单元测试验证单个单元&#xff08;通常是类&#xff09;的行为&#xff0c;而忽略或模拟该单元…

搜狗输入法更换字体与皮肤

图标上右键-更多-属性设置 效果&#xff1a; 注意&#xff1a;如果是新安装的字体&#xff0c;更换中文字体但其中列表没有显示&#xff0c;可以取消更换字体前面的对钩后&#xff0c;重新选择对钩&#xff0c;此时就显示新的中文字体了

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

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

如何在内存序列化中使用Java深克隆对象

在我以前的文章中&#xff0c;我解释了深度克隆和浅层克隆之间的区别 &#xff0c; 以及复制构造函数和防御性复制方法比默认的Java克隆更好。 使用复制构造函数和防御性复制方法进行的Java对象克隆当然具有某些优势&#xff0c;但是我们必须显式编写一些代码才能在所有这些方…

复制网页内容

问题背景&#xff1a; 当网页复制东西时&#xff0c;可能因为某些原因导致无法复制。可以用以下方法解决 解决方法&#xff1a; 1. 按下F12&#xff0c;出现以下内容 2. 依次点击右上角三个点&#xff0c;弹出界面后点击shortcuts 3. 选择首选项后&#xff0c;选中Disable …

插入时间信息

问题描述 在进行文本编辑的时候&#xff0c;往往需要记录当天日期。而Typora等软件没有及时插入时间的快捷方式。 方法 搜狗收入法提供快速记录时间的方式 1. 在中文输入法模式中输入rq&#xff08;汉语拼音日期的首字母&#xff09;&#xff0c;选项卡自动显示今日日期,可…

activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分

activemq网络桥接在前面的第3部分中 &#xff0c;我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来&#xff0c;这有助于确定从消息生产者到使用者的较短路径。 在第4部分中&#xff0c;我们将研究如何在远程代理上负载均衡并发使用者。 让我们考虑一些高级配置…

sublime 添加注释模块

问题背景&#xff1a; 规范的程序需要对函数进行注释&#xff0c;常用的开发工具如IDEA、VS Code都对注释模板有很好的支持。本博客介绍Sublime下支持模块注释功能的设置。 一 安装 一、安装方法 1.安装docblocker插件 mac CmdShiftP -> Install Package -> docblock…

只读副本和Spring Data第3部分:配置两个实体管理器

我们之前的设置可以正常工作。 我们现在要做的是进一步发展&#xff0c;并配置两个单独的实体管理器&#xff0c;而不会影响我们之前实现的功能。 第一步是将默认的实体管理器配置设置为主要配置。 这是第一步 package com.gkatzioura.springdatareadreplica.config; import…

Win+E快速打开我的电脑方式设置方式

W10运用快捷键WinE快速打开我的电脑设置方式

JMetro版本11.6.5和8.6.5发布

再一次问好。 设置了SDK中所有JavaFX控件的样式以及其他一些不存在的样式以及其他库中的其他样式。 后续版本将涉及调整JMetro现有样式或从第三方库的其他控件添加其他样式。 此版本就是这种情况。 这是新功能&#xff1a; 3种新的控件样式&#xff1b; 调整JMetro现有样式&a…

Chrome浏览器的便捷使用方式

截取转载于B站视频【全套教程】高效玩转Chrome浏览器&#xff0c;丰富你的上网体验_哔哩哔哩_bilibili中的脑图文件&#xff0c;便于之后的熟悉使用。 脑图链接 https://naotu.baidu.com/file/5a5332eee10dd903cc084d49189cd2behttps://naotu.baidu.com/file/5a5332eee10dd90…

Sublime查看已经安装的插件

蓝色框图内显示已经安装的插件

activemq网络桥接_ActiveMQ –经纪人网络解释–第3部分

activemq网络桥接现在&#xff0c;我们已经在本博客系列的第1部分和第2 部分中了解了ActiveMQ网络连接器的基础&#xff0c;在第3部分中&#xff0c;我们将研究ActiveMQ如何平衡连接到代理网络的使用者。 介绍 当可以无序处理队列中的消息时通常使用并发使用者&#xff0c;通常…

Word样式的导入与导出

1 样式的介绍 样式&#xff0c;也就是Word中各级标题的格式。合理的设置样式模板&#xff0c;可以帮助更方便的进行文本编辑。 2 样式的导入 具体情形为将“文档标准模板.dotm”的内容应用于“新建Microsoft Word文档”。 按照图示进行操作 【 如果应用模板为文件内的样式…

word将一个文档的样式导入到另一个文档

一、背景 在word中编辑文档时&#xff0c;经常需要定义一个样式给特定格式的文本使用&#xff0c;如标题1&#xff0c;标题2等&#xff0c;而有时需要在一个新文档A中使用一个旧文档B中定义好的样式。 二、操作步骤 1、打开旧文档B&#xff0c;选择上方标签栏的"样式&quo…

Spring Boot应用程序浪费了内存

内存是当今世界上被广泛浪费的资源之一。 由于编程效率低下&#xff0c;令人吃惊的&#xff08;有时是“令人震惊的”&#xff09;内存浪费被浪费了。 我们看到这种模式在多个企业应用程序中重复出现。 为了证明这种情况&#xff0c;我们进行了一项小型研究。 我们分析了著名的…

Win10灵活使用快速访问

I 快速访问视图 位置在winE 左侧窗口&#xff0c;点击可快速到达某个特定的文件夹。作用类似于快捷方式&#xff0c;操作简单。 II 关闭自动添加 默认是显示经常使用的文件夹。这使得窗口内文件夹较乱。 通过以下设置&#xff0c;关闭自动显示 1. 2.把框内√去掉 III 固定文…

activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分

activemq网络桥接在此博客中&#xff0c;我们将看到双工网络连接器如何工作。 在上一部分中&#xff0c;我们从broker-1和broker-2创建了一个网络连接器。 我们能够看到&#xff0c;当代理2上有一个使用者使用队列“ foo.bar”时&#xff0c;代理1上的队列“ foo.bar”的消息如…