首页
学习
活动
专区
工具
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*/

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

    Linux OOM 终结者

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

    2K60

    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.6K20

    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

    1.1K20

    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.9K30

    消失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.6K150

    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.4K90

    OOM异常4种可能分析及常见OOM异常演示

    OOM异常4种可能分析及常见OOM异常演示 OOM异常: OutOfMemoryError 1.JAVA堆溢出 JAVA堆用于存储对象实例,只要不断创建对象,并且保证GC Roots到这些对象之间有路径可以来避免垃圾回收机制清除这些对象...Class相关信息,当运行时产生了大量类了填满方法区时,再产生类就会导致OOM 比如大量JSP或动态产生JSP文件应用(JSP第一次运行需要编译为JAVA类),基于OSGI应用(即同一个文件,...* 你服务器并不允许你应用程序创建这么多线程linux系统默认允许单个进程可以创建线程数是1024个,你应用创建超过这个数量,就会报java. lang....分析应用是否真的需要创建这么多线程如果不是,改代码将线程数量降到最低 * 2.对于有的应用,确实需要创建很多线程,远超过Linux系统默认1024个线程限制,可以通过修改Linux...服务器配置,扩大linux默认限制 * 模拟:这个类拷贝到linux下执行。

    19510

    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.9K20

    深入了解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机制。

    3.9K20

    线上OOM排查

    Java虚拟机启动时传递给main()方法参数 -l : 显示主类完整包名,如果进程执行是JAR文件,也会显示JAR文件完整路径 -v : 显示Java虚拟机启动时传递JVM参数 jstack...线程快照是当前java虚拟机内每一条线程正在执行方法堆栈集合,生成线程快照主要目的是定位线程出现长时间停顿原因,如线程间死锁、死循环、请求外部资源导致长时间等待等。...线上OOM排查 1、应用启动时增加JVM参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=, 可以是指定文件或者目录,指定为目录时转储文件是存储在该目录下.../dump -jar test.jar 2、如果没有配置JVM参数在OOM时生成快照 使用jps -ml命令找到对应Java进程 使用jmap -dump:format=b,file=heapdump.hprof... 生成内存快照 3、使用内存分析工具打开生成快照文件,对其进行分析,使用 jvisualvm 打开文件,可以看到导致OOM线程,点进去查看其堆栈。

    8510

    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.7K20

    GPDB OOM问题

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

    65230

    Android | 关于 OOM 那些事

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

    1.4K20
    领券