首页
学习
活动
专区
圈层
工具
发布

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.9K93
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 的 OOM 终结者

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

    2.1K60

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

    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 操作系统内存的剖析,以探讨在实际的业务场景中,内存表现的相关活动及经验认知

    3.3K30

    消失的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可疑的元凶。

    2.4K50

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

    Linux系统:OOM相关问题定位及排查

    近日被问到OOM内存溢出、内存泄漏如何定位,现将过往相关知识点梳理总结如下: 内存溢出 OOM 定义 内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多...补充: OOM指的是内存溢出(Out Of Memory)‌,而不是内存泄漏。 如果程序持续运行且内存泄漏未得到修复,最终可能会导致内存溢出。...常见的OOM问题定位分析 上述偏于理论了,来看下实战操作:本文适用 Linux系统 借助系统命令查看系统负载 可以使用命令如top查看系统负载,包括内存使用情况、进程占用资源情况等。...借助下述命令,查找是否有内存不足的相关信息,包括不限于OOM问题发生的上下文和可能的原因。...查看应用程序日志 查看应用程序的日志文件,寻找内存不足的提示信息。这些信息通常包含有关OOM问题的详细信息,如错误类型、错误发生的位置等。

    1.8K10

    如何使用eBPF监控Linux内存 OOM killer:Linux内存调优之eBPF监控内存 OOM killer 事件

    ,以及对应的内核调优参数,博客没有涉及 理解不足小伙伴帮忙指正 :),生活加油 知不可乎骤得,托遗响于悲风 ---《赤壁赋》 下面实验用的 Linux 环境 [root@developer ~]# hostnamectl.../usr/bin/bpftrace /* * oomkill Trace OOM killer. * For Linux, uses bpftrace and eBPF....(),捕获 OOM Killer 触发事件,同时输出了一些其他的指标信息 自定义 OOM Killer 发生时的性能指标采集 下面是最上面脚本的基础上添加的一些他的指标数据采集,从而实现在 OOM Killer...linux/oom.h> BEGIN { printf("Tracing oom_kill_process()......program bpf_text = """ #include linux/ptrace.h> #include linux/oom.h> struct data_t { u32

    63400

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

    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下执行。

    83410

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

    7.3K20

    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归一后,但凡小于

    2.1K20

    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.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的线程,点进去查看其堆栈。

    48710
    领券