Linux内存管理之OOM Killer

OOM Killer是Linux在内存不足时启动的程序,负责结束某些进程以保持系统运行。Linux采用overcommit策略提高内存使用效率,但可能导致OOM情况。可通过调整overcommit_memory参数优化。当触发OOM时,系统依据进程的badness score决定优先结束哪个进程,该分数考虑了内存使用、子进程、nice值等因素。可以通过调整oom_adj避免进程被杀死。此外,还有全局和cgroup两种OOM Killer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 什么是OOM Killer
    • OOM Killer是linux自带的一个程序。它的作用是在系统内存不足的时候启动,杀掉一些进程来保证系统继续运行。
  • 为什么需要OOM Killer
    • 这里就需要介绍一个Linux里非常重要的概念了,overcommit。什么是overcommit呢?在Linux系统中,如果一个进程需要申请新的可用的内存,这个进程就会向操作系统提出申请(malloc之类的)。此时不同操作系统会有不同的策略来应对这样的内存申请。在默认情况下,Linux遵循的原则是:只要申请不是明显的夸张,即使系统现在有没有那么多可以使用的内存,也会同意进程的内存申请。这样做是为了让系统的内存使用更加高效。来举个🌰,比如我向用一个1000个int的数组,我要先向系统申请能容纳1000个int的内存空间,但是我这个数组并不会马上使用,如果系统给我分配了我需要的所有内存空间,那就势必导致这段内存会空置一段时间。这样我们的内存使用就不是很高效。为了解决这个问题,系统就会分配比自己拥有内存更多的内存给进程们,当进程真正access这些内存的时候,才会去物理内存中申请空页。这时候另外一个问题就来了,如果本来系统只有4G内存,但是分配了20G给所有的进程,那么,如果当这些进程同时access他们的内存的时候,4G就有可能不够用了,这个时候,OOM Killer就会启动来杀掉一些进程来保证系统的正常运行
  • overcommit有什么参数可以调优吗?
    • 当然有。在现代的Linux系统中,有3个模式。这三个模式都可以在/proc/sys/vm/overcommit_memory中进行设置
      • 0: 启发式。只要不是太过分的内存申请请求,都会同意
      • 1:总是同意任何内存请求
      • 2: 不进行overcommit。这时,系统可用的所有内存= swap + /proc/sys/vm/overcommit_ratio(默认是50%) * physical memory。只要我们把overcommit_ratio设置到100或者以下,系统总的可用的内存就不会超过我们拥有的物理内存和swap的总和了,也就是不会overcommit了。在此时,内存申请会报错而不会无脑返回了。
  • OOM Killer会先杀谁?
    • 首先,OOM Killer会对每个进程计算一个坏分(badness score),并且会根据这个分数从高到低进行杀进程操作。在计算过程中,总的原则是少杀多得不错杀。那这个分数是怎么算出来的呢?大概有这么几个因素:
      • 内存使用量越多,分数越高。
      • 子进程们的独立内存越多,分数越高
      • Niced process,分数*2
      • CPU时间越长,分数越低
      • CAP_SYS_ADMIN 和 CAP_SYS_RAWIO, 分数除4
      • 最后,加上/减去(其实是位移)用户设置的参数oomadj
  • OOM Killer有参数可以调优吗?
    • 有的。每一个进程可以在/proc/<pid>/oom_adj调整自己的参数。这个参数的范围是-17到15。如果设置成-17,OOM Killer就不会杀掉这个进程了
  • 我们可以禁用OOM Killer吗?
    • 当然是可以的。
      • vm.oom-kill = 0 in /etc/sysctl.conf 禁用OOM Killer
      • 禁用overcommit(上面提到过方法)
  • Global OOM killer vs cgroup OOM killer:
    • Global OOM killer是系统自带的OOM killer。当系统无法分配物理页面的时候,就会被出发,从而杀掉坏分最高的进程。这个过程会持续进行直到申请内存的请求被满足
    • Cgroup OOM killer。是下一个级别的OOM killer。它的出发条件和我们对于cgroup的配置有关系。如果使用的内存大于memory.max。oom killer就会介入杀掉进程来降低内存用量

REF

关于overcommit:

https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

OOM Killer 介绍

https://lwn.net/Articles/317814/#:~:text=Without%20overcommit%2C%20a%20system%20will,the%20risk%20of%20OOM%20situations.&text=If%20oom_adj%20is%20set%20to,not%20considered%20for%20OOM%2Dkilling

OOM badness score:

https://linux-mm.org/OOM_Killer#:~:text=It%20is%20the%20job%20of,selected%20process%2C%20for%20obvious%20reasons

cgroup OOM Killer vs system OOM Killer

Chris's Wiki :: blog/linux/OOMKillerWhen

The Linux kernel: Memory

如何不被oom killer杀掉?

https://dev.to/rrampage/surviving-the-linux-oom-killer-2ki9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值