首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux OOM机制分析

OOM分析 oom_killer(out of memory killer)是Linux内核一种内存管理机制,在系统可用内存较少情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存...通常oom_killer触发流程是:进程A想要分配物理内存(通常是当进程真正去读写一块内核已经“分配”给它内存)->触发缺页异常->内核去分配物理内存->物理内存不够了,触发OOM。...一句话说明oom_killer功能: 当系统物理内存不足时,oom_killer遍历当前所有进程,根据进程内存使用情况进行打分,然后从中选择一个分数最高进程,杀之取内存。...函数解析: oom_killer处理主要集中在mm/oom_kill.c。...(p, mem, nodemask)) continue; /*已经有一个进程被oom killer选中,并正在被杀死(上一次触发oom还没有处理完),结束本次oom killer*/

7.9K93
您找到你想要的搜索结果了吗?
是的
没有找到

Linux OOM 终结者

你知道Linux里面有许多邪恶怪物(也叫作守护进程)。这些守护进程是由几个内核作业所看管,其中一个犹为恶毒。...所有的现代Linux内核中都会有一个内存不足终结者(Out of memory Killer, OOM Killer)内建机制,在内存过低情况下,它会杀掉你进程。...理解”Out of memory killer“ 默认情况下,Linux内核会允许进程请求内存超出实际可用内存大小。...示例 当我把这个情况描述给工程师时候,有一位工程师觉得很有意思,因此写了个小测试用例来重现了这个问题。你可以在Linux下编译并运行下面这个代码片段(我是在最新稳定版Ubuntu上运行)。...还有别的一些方法比如OOM killer调优,或者将负载水平分布到数个小实例上,又或者减少应用程序内存占用量。

1.9K60

Linux OOM一二三

Linux开发一般会遇到“/proc/sys/vm/overcommit_memory”,即文件/etc/sysctl.conf中vm.overcommit_memory,Overcommit意思如同其字面意思...overcommit_memory有三种取值(注:overcommit_memory并不控制OOM,是否开启OOM由panic_on_oom控制): overcommit_memory取值 含义 0...系统是否行使OOM,由/proc/sys/vm/panic_on_oom值决定,当/proc/sys/vm/panic_on_oom取值为1时表示关闭OOM,取值0时表示启用OOM。...如果将/proc/sys/vm/oom_kill_allocating_task值设置为1,则OOM时直接KILL当前正在申请内存进程,否则OOM根据进程oom_adj和oom_score来决定。...oom_adj表示进程被OOM KILLER杀死权重,取值“17~15”,值越大被KILL概率越高,当进程oom_adj值为-17时,表示永远不会被OOM KILLER选中。

1.5K20

linux OOM killer分析

基本概念 Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存进程,为了防止内存耗尽而内核会把该进程杀掉...我们先来看一下kernel提供给用户态/proc下一些参数: /proc/[pid]/oom_adj ,该pid进程被oom killer杀掉权重,介于 [-17,15]之间,越高权重,意味着更可能被.../proc/[pid]/oom_score,当前该pid进程被kill分数,越高分数意味着越可能被kill,这个数值是根据oom_adj运算后结果,是oom_killer主要参考。...sysctl 下有2个可配置选项: vm.panic_on_oom = 0 #内存不够时内核是否直接panic vm.oom_kill_allocating_task = 1 #oom-killer是否选择当前正在申请内存进程进行...killer选中概率,禁止或者给oom_adj最小或偏小值,也可以通过sysctl调节oom killer行为 如何查看OOM日志 grep "Out of memory" /var/log/messages

94420

Linux系统之 OOM 解析

本文将聚焦于 Linux 内存结构、内存分析以及 OOM killer 等 3 个方面以及笔者多年实践经验总结进行“吹牛逼”,当然,若吹不好,欢迎大家扔砖、鸡蛋。...它是如何产生OOM,全称为 “Out Of Memory”,即 内存溢出。OOM Killer 是 Linux 自我保护方式,防止内存不足时出现严重问题。...通常,系统内核检测到系统内存不足时,筛选并终止某个进程过程可以参考内核源代码:linux/mm/oom_kill.c,当系统内存不足时候,out_of_memory()被触发,然后调用 select_bad_process...Linux 操作系统选择”bad”进程是通过调用 oom_badness(),挑选算法和想法都很简单很朴实:最 bad 那个进程就是那个最占用内存进程。...综上所述,本篇文章主要通过基于对 Linux 内存结构、分析及 OOM Killer 3个核心维度,从主动及被动场景等 2 方面对 Linux 操作系统内存剖析,以探讨在实际业务场景中,内存表现相关活动及经验认知

2.6K30

消失Java进程-Linux OOM Killer

和-XX:HeapDumpPath参数分别用于指定发生OOM是否要导出堆以及导出堆文件路径 该命令一执行,立即就会发生OOM,并打印如下日志: fenglibin@fenglibin-HP:~/eclipse_neon_workspace...文件已经生成了,该文件就是应用在发生OOM异常时自动导出堆文件。...那我们此时需要对该文件进行分析,因为其中记录了是什么对象导出了应用程OOM发生。...分析OOM工具推荐使用MAT,在配置好Java环境电脑中,直接打开即可,不需要安装,然后通过MAT打开已经生成OOM文件oom.out,出现如下提示,选择“Leak Suspects Report...96.43%堆内存,实际内存占用是char[]数组,因而被检测出来为OOM可疑元凶。

2K50

linux OOM处理机制

当系统内存不足时,Linux内核会触发OOM来选择一些进程kill掉,以便能回收一些内存,尽量继续保持系统继续运行。...具体选择哪个进程杀掉,这有一套算分策略,参考因子是进程占用内存数,进程页表占用内存数等,oom_score_adj值越小,进程得分越少,也就越难被杀掉,oom_score_adj取值为[-1000,1000...将为0,这里不影响选中kill掉进程, //只是作为OOM输出信息score值 *ppoints = chosen_points * 1000 / totalpages...- (points *3) /100 //for root //若point很小,oom_adj为负数(比如-100),则算出来point可能是负值 adj =oom_score_adj * (...points : 1; //若points值很小,此处得到points将为0,这里不影响选中kill掉进程, //只是作为OOM输出信息score值 score = points * 1000

2.5K150

tensorflow oom报错OOM when allocating tensor with shape

今天在GPU上运行卷积神经网络手写数字,报了如下错误Resource exhausted: OOM when allocating tensor with shape[10000,32,28,28]...一开始还不知道因为什么,因为我训练集我已经分批训练了啊,竟然换回出现这样问题,后来在StackOverflow上发现了原因。...原来我在做测试时候一下子把测试集全部读进去了,这就造成了显卡显存不能容纳这么多数据,造成崩溃,只需要改改最后测试就行了。...4D向量[batch,in_height,in_width,in_channels] x_image = tf.reshape(x,[-1,28,28,1]) #初始化第一个卷积层权值和偏置 W_conv1...28*28,第一次池化后变为14*14 #第二次卷积后为14*14,第二次池化后变为7*7 #经过上面操作后得到64张7*7平面 #初始化第一个全连接层权值 W_fc1 = weight_variable

2.2K90

oom killer

Linux系统内存管理中存在着一个称之为OOM killer(Out-Of-Memory killer)机制,该机制主要用于内存监控,监控进程内存使用量,当系统内存耗尽时,其将根据算法选择性地kill...本文分析内存溢出保护机制,也就是OOM killer机制了。...,如果有则退出;再接着通过constrained_alloc()检查内存分配限制以及check_panic_on_oom()检查是否报linux内核panic;继而判断sysctl_oom_kill_allocating_task...points : 1; } 计算进程分值函数中,首先排除了不可OOM kill进程以及oom_score_adj值为OOM_SCORE_ADJ_MIN(即-1000)进程,其中oom_score_adj...取值范围是-1000到1000;接着就是计算进程RSS、页表以及SWAP空间使用量占RAM比重,如果该进程是超级进程,则去除3%权重;最后将oom_score_adj和points归一后,但凡小于

1.8K20

深入了解Linux OOM Killer:一次可怕内核事件

之所以会发生这种情况,是因为Linux内核在给某个进程分配内存时,会比进程申请内存多分配一些....二、OOM Killer 理解OOM Killer: Linux 内核根据应用程序要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用内存可以留作它用,这部分内存是属于每个进程...1)Linux下每个进程都有个OOM权重,在/proc//oom_adj里面,取值是-17到+15,取值越高,越容易被干掉; 2)linux内核会通过特定算法给每个进程计算一个分数来决定杀哪个进程...rlimit 上面提到RLIMIT_AS和RLIMIT_DATA都可以通过函数getrlimit和setrlimit来设置和读取,同时linux还提供了一个prlimit程序来设置和读取rlimit配置...算法 Linux中内存都是以页形式管理,因此无论是怎么申请内存,都会调用alloc_page()函数,最终调用到函数out_of_memory(),触发OOM机制。

95920

LINUX内存高,触发OOM-KILLER问题解决

最近遇到两起Linux内存问题,其一是触发了oom-killer导致系统挂 1....4GB内存系统,需要消耗更多low memory,当low memory耗尽,即便系统仍然有剩余内存,仍然会触发oom-killer。...Linux内核策略是最大程度利用内存cache 文件系统数据,提高IO速度,虽然在机制上是有进程需要更大内存时,会自动释放Page Cache,但不排除释放不及时或者释放内存由于存在碎片不满足进程内存需求...所以我们需要一个方法,能够限定PageCache上限。 Linux 提供了这样一个参数min_free_kbytes,用来确定系统开始回收内存阀值,控制系统空闲内存。...: 关闭oom-kille cat /proc/sys/vm/oom-kill echo "0" > /proc/sys/vm/oom-kill vi /etc/sysctl.conf vm.oom-kill

2.5K20

GPDB OOM问题

前文,我们分析了gp_vmem_protect_limit参数意义,仅统计gp_malloc中申请,它并没有统计共享内存部分,所以仍旧有操作系统OOM风险,详情:GPDB中gp_vmem_protect_limit...参数意义。...猜想,仍有malloc函数申请内存没有统计进去,继续在该函数上打断点,进行跟踪。经排查,发现大部分额外malloc都是压缩、解压缩函数中调用,也就是zstd库函数。...最开始猜想,是因为GP列存压缩表压缩导致,但是业务SQL不涉及修改,都是查询。那这个压缩来自哪里?查看堆栈发现是排序、HASH AGG和HASH JOIN中。...zstd压缩造成内存消耗问题确实是一个有挑战课题,感兴趣同学们可以深入探讨!

56830

Android | 关于 OOM 那些事

最为常见 OOM 就是内存泄露(大量对象无法被释放)导致 OOM,或者说是需要内存大小大于可分配内存大小,例如加载一张非常大图片,就可能出现 OOM。...常见 OOM 堆溢出 堆内存溢出是最为常见 OOM ,通常是由于堆内存已经满了,并且不能够被垃圾回收器回收,从而导致 OOM。...出现 OOM 是应为 Android 系统对虚拟机 heap 做了限制,当申请空间超过这个限制时,就会抛出 OOM,这样做目的是为了让系统能同时让比较多进程常驻于内存,这样程序启动时就不用每次都重新加载到内存...OOM 监控 我们都知道,OOM 出现就是大部分原因都是由于内存泄露,导致内存无法释放,才出现了 OOM,所以监控主要监控是内存泄露,现在市面上对于内存泄露检查这方面已经非常成熟了,我们来看几个常用监控方式...KOOM OOM 优化 OOM 优化其实相当于是内存优化,对于这部分内容,网上有一篇讲非常详细文章 **深入探索 Android 内存优化**,该文章内容非常全面且难度也比较高,建议仔细阅读。

84620

JVMFinalization Delay引起OOM

这个服务是用Java写,主要完成功能是根据特定指令文件生成mp4文件,用到java库主要有javacv,这个库底层其实是使用JNI调用操作系统里安装ffmpeg。...检查日志文件 首先检查日志文件,发现日志里出现了OOM报错 java.lang.OutOfMemoryError: null at sun.misc.Unsafe.allocateMemory(Native...org.bytedeco.javacv.Java2DFrameConverter.convert(Java2DFrameConverter.java:62) ~[javacv-1.1.jar:1.1] 很明显这里是申请DirectByteBuffer出现了OOM...既然DirectByteBuffer申请C堆内存释放是自动,为啥在这个场景里会出现OOM呢?查阅javabug记录,终于找到原因。...意思是如果DirectByteBuffer创建得过于频繁,服务器CPU太繁忙,C堆内存还是会OOM,原因是JVM来不及进行GC及Finalization,大量对象销毁工作被推后,最终C堆内存无法得到释放

1.3K80

一次 OOM 问题

背景: 最近在做服务作业时候,突然发现机器 dump 文件在暴增,1小时执行下来,应用 _dump.log.* 文件达到了惊人 20 个,其中每个dump 文件都是900mb 文件,还在不断增多...5.查看dump 文件 在任务执行时候 dump 还正常,但是在任务结束后,出现了 这么多 dump 文件,明显出现了问题,初步怀疑是 OOM 异常,所以这里我把 某个dump 文件拉下来进行分析。...从图中 我们可以看出 char[] 竟然达到了惊人占比 80.8%文件大小,我们继续看 可以看出前面几个实例占用空间很大,达到了602m。...这个 List 是返回每个用户计算结果,成功提示日志和错误异常信息。...本来没有什么,但是因为我们之前 封测机器多了几台实例,然后我们把这个实例 -Xmx -Xms 都调整成了 1000m。所以会导致了 OOM。 8.

63210
领券