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

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

作为一名该领域经验丰富的高手,我首先来到了咖啡机旁。我需要用一杯咖啡开始工作。第一个问题,在应用崩溃之前看起来一切运行正常。日志中没有错误,没有告警,也没有其他任何异常。

我们的监控系统已经察觉到进程死掉了,并且已经重启了崩溃的服务。因为血液中已经有了咖啡因,我开始收集更多的证据。30分钟后,在/var/log/kern.log文件中发现了以下内容:

1
2
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账号才能杀掉offending任务。为了避免这种情况发生,杀手进程会被启动,识别进程并杀死它。

更多关于“内存不足杀手”的内容请参见这篇RedHad的文档。

内存不足杀手由谁触发?

现在,我们知道了一些背景知识,但是内存不足杀手由谁触发?究竟什么原因让我在早上5点被叫醒?一些调查显示:

  • /proc/sys/vm/overcommit_memory中的配置允许过量使用内存,它被设置为1,意味着每一次malloc都能够成功申请到内存。
  • 应用运行在一个EC2 m1.small实例上。EC2实例默认是不支持交换区的。

这两点再加上突然增加的访问导致了我们的应用会申请越来越多的内存以支持这些用户。过量使用内存配置也允许为这些进程申请越来越多的内存,最后触发了“内存不足杀手”,就像它的名字那样,杀死我们的应用然后在半夜把我叫醒。

示例

当我向工程师们描述这个问题时,有一个很有兴趣的工程师用一个小测试程序来复现这个问题。当在Linux(最新稳定版Ubuntu)上编译和加载下面的Java代码片段时,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
                }
            }
    }
}

你会发现类似下面的消息:Kill process (java) score 或牺牲子进程的消息。

注意:你可能需要修改交换区和堆大小。在我的测试程序中,将堆大小通过-Xmx2g设置成2G,通过如下配置设置交换区大小:

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

解决方案?

有很多种方法可以解决这个问题。在我们的示例中,我们只是把系统迁移到一个有更大内存的实例中。并且我还建议允许交换,但是当咨询过工程人员后,我意识到Java虚拟机中的垃圾回收进程在交换时表现不是很好,所以这个选项最后没有被采用。

其他可能有用的方案包括微调内存不足杀手,在几个实例间进行负载均衡或者降低应用的内存需求。


原文链接: javacodegeeks 翻译: ImportNew.com - 秋双
译文链接: http://www.importnew.com/12285.html

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

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

相关文章

java8 注解: @FunctionalInterface (函数式接口)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Java8提倡函数式编程&#xff0c;因而新增了一个函数式接口。函数式接口保证了函数式编程&#xff0c;同时也保证了能够兼容以前的java版…

写给年轻程序员的一封信

很多年轻的程序员发emails给我&#xff0c;说希望能够得到一些如何尽快跻身优秀程序员行列的建议和方法。关于这个问题&#xff0c;我已经有提到过很多次&#xff0c;现在已经没什么可以补充的了。不过 为了满足大家的要求&#xff0c;在这里我再详细地归纳总结一下&#xff1a…

Docker中RocketMQ的安装与使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 搜索RocketMQ的镜像&#xff0c;可以通过docker的hub.docker.com上进行搜索&#xff0c;也可以在Linux下通过docker的search命令进行搜索…

大浪淘沙:不是所有的IT公司都以成功收场

本文列举了50家创业公司没有什么先后顺序&#xff0c;最后显示&#xff0c;其中21家是独立公司&#xff0c;19家被收购了&#xff0c;4家正在走下坡路&#xff0c;6家已倒闭。但是我希望有更多的公司彻底倒闭&#xff0c;留下实力最强大的公司。公司倒闭也许是重新开始的标志。…

解决:阿里云ECS服务器 远程连接不上、极慢 (主机监控的实现)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 个人低配版的阿里云ECS服务器&#xff0c;突然发现用 Xshell 或者 git-bash 都连接不上... 第一反应发工单去问下为什么&#xff0c;然…

TIOBE 2014年7月编程语言排行榜:仅发布1月,Swift进Top 20!

摘要&#xff1a;TIOBE7月编程语言排行榜发布&#xff0c;本月最值得关注的是&#xff0c;苹果公司在WWDC 2014上推出新的编程语言Swift&#xff0c;发布至今仅一月有余&#xff0c;Swift竟挤进TIOBE排行榜的Top 20&#xff0c;排名第16位。Swift能取得如此骄人的成绩&#xff…

Math对象方法总结(向上取整、向下取整、四舍五入、取随机数,取最大值、取最小值)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。

Docker 方式安装 gitlab ( 阿里云ECS )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.查找镜像&#xff1a; docker search gitlab 2. 拉取镜像&#xff1a; docker pull 镜像名 我选择的是搜索出来的第一个镜像&…

商用的码流分析工具/YUV viewer

目前市场上有一些商用的码流分析工具是比较好的&#xff0c;能够辅助我们进行各个标准的码流分析&#xff1a; 1. Elecard StreamEye系列 可以分析H264/MPEG4/MPEG2的码流&#xff0c;暂时不支持其它标准。 2. H264VISA 比较好的H264码流分析工具 3. Vegas vegas是interra s…

生成多个 SSH-Key 、生成多个公钥和私钥

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 当有多个仓库要同时使用时&#xff0c;需要配置多个公钥、私钥。于是就要先生成多个。 PS&#xff1a;初次生成参见文章&#xff1a;查…

使用Lucid Virtu在有独立显卡的情况下使用Intel硬件加速H.264编码

在硬编码领域&#xff0c;大家都知道CUDA技术对于H.264视频编码速度的提升。然而实际上常见的高清H.264视频压缩都不是用CUDA技术进行硬编码&#xff0c;而是用传统的x264进行软编码&#xff0c;因为通过CUDA硬编码的视频效果远远差于x264软编码压缩出的视频效果。随着Intel Sa…

执行ssh-add时出现Could not open a connection to your authentication agent

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 若执行ssh-add /path/to/xxx.pem是出现这个错误:Could not open a connection to your authentication agent&#xff0c;则先执行如下命…

Intel硬件加速 VS CUDA完胜 视频转码感受

对比试用平台介绍 在体验了酷睿 I5 2300 在3D游戏和多任务、高清播放等方面的突出性能后&#xff0c;今天我利用空闲时间针对酷睿 I5 2300在高清转码方面上与本人的旧平台上对比了一下.&#xff0c;其结果也让人感到震撼。好了闲话不多说了&#xff0c;先来给自己新旧PC做个介绍…

解决 : Shell 脚本 $‘\r‘: command not found 问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.经查证&#xff0c;只是 Windows 的空行在 linux 中不识别&#xff0c;故需要用 dos2unix 来转换。 2. 安装 dos2unix&#xff0c;2 …

H.264 软/硬编码器 画质量化分析评测

第1页&#xff1a;前言——视频压缩无处不在H.264 或者说 MPEG-4 AVC 是目前使用最广泛的高清视频编码标准&#xff0c;和上一代 MPEG-2、h.263/MPEG-4 Part4 相比&#xff0c;它的压缩率大为提高&#xff0c;例如和 MPEG-2 相比&#xff0c;同样的压缩后画面品质&#xff0c;h…

解决:Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 执行 mvn clean deploy ... 想把 jar 包更新到私服仓库&#xff0c;报错&#xff1a; Failed to execute goal org.apache.maven.pl…

YV12 and NV12异同,

用videoCapture和IAMStreamConfig拿到的支持的格式列表。发现支持2中图像格式&#xff0c;YV12和NV12。具体是怎么样的内存分布不知道。查了些文档。自己修改了几个图。看出了点端倪YV12先看看 http://www.fourcc.org/yuv.php 上比较标准的定义&#xff1a;YV12 This is the f…

上传 jar 包到 nexus3、上传本地 jar 包到 maven 私服

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.登陆进入 nexus3&#xff0c;打开要上传的仓库目录&#xff1a;maven-releases 2. 选择要上传的本地 jar 包&#xff0c;并填写好对应…

从桌面到移动:异构计算翻天覆地的技术变革

摘要&#xff1a;在智能手机上&#xff0c;强大的计算单元&#xff0c;不仅仅是CPU一颗&#xff0c;还包含了GPU、DSP等器件。在传统的台式电脑中&#xff0c;异构计算已经说了好多年了。这篇文章有点长&#xff0c;但值得静下心来慢慢阅读。从桌面到移动&#xff0c;这是关于异…

集合源码阅读:ArrayList

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.继承关系&#xff1a;public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…