目录
工程实例
当内存严重不足时,页分配器在多次尝试直接回收失败后,就会调用内存耗尽OOM killer,选择杀死进程,释放内存。
先看一段oom 输出的错误
[ 7981.765805] kthreadd invoked oom-killer: gfp_mask=0x2dc2(GFP_KERNEL|__GFP_HIGHMEM|__GFP_NOWARN|__GFP_ZERO), order=0, oom_score_adj=0
[ 7981.777742] CPU: 3 PID: 2 Comm: kthreadd Tainted: G O 5.4.0-xilinx-v2020.1 #1
[ 7981.786164] Hardware name: xlnx,zynqmp (DT)
[ 7981.790329] Call trace:
[ 7981.792767] dump_backtrace+0x0/0x140
[ 7981.796415] show_stack+0x14/0x20
[ 7981.799717] dump_stack+0xac/0xd0
...
[ 7982.331629] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=net_process,pid=1275,uid=0
[ 7982.344516] Out of memory: Killed process 1275 (net_process) total-vm:4113316kB, anon-rss:3888320kB, file-rss:36kB, shmem-rss:2052kB, UID:0 pgtables:7852032kB oom_score_adj:0
[ 7982.974247] oom_reaper: reaped process 1275 (net_process), now anon-rss:0kB, file-rss:0kB, shmem-rss:2052kB
在应用程序开发时会出现内存泄露,如上述所示,杀死net_process进程信息。在内核中是如何处理的呢?
一、内存耗尽可配置的参数如下:
/proc/sys/vm/oom_kill_allocating_task

当Linux系统内存严重不足时,会触发OOM Killer来选择并杀死某些进程以释放内存。本文详细介绍了内核中oom_kill_process的执行流程,包括内存耗尽时的可配置参数、杀死进程的计算方法、技术原理,以及源码分析。通过计算进程的badness分数来决定哪个进程将被杀死,并讨论了如何避免内存泄露导致的OOM情况。此外,还探讨了内核如何处理有子进程的情况以及如何发送SIGKILL信号。
最低0.47元/天 解锁文章
2104

被折叠的 条评论
为什么被折叠?



