Linux OOM-killer机制说明

1.什么是OOM-killer

oom_killer(out of memory killer)是Linux内核的一种内存管理机制,在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存。通常oom_killer的触发流程是:进程A想要分配物理内存(通常是读写内存)->触发缺页异常->内核去分配物理内存->物理内存不足,触发OOM

1.1. OOM-killer策略

Linux下每个进程都有个OOM权重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。oom killer选择杀哪个进程,是基于它的badness score,该值体现在/proc/<pid>/oom_score里面。它的原则是,尽可能少杀进程来尽可能释放出足够多的内存,同时不去杀那些耗费内存很多的无辜进程。badness score的计算会用到进程的内存大小,CPU时间(user time + system time) 运行时间,以及oom_adj值。进程消耗的内存越多,得分就越高;进程运行的时间越长,得分就越低。

这也解释了,为什么新fork出来的进程容易被杀死,因为它的运行时间短,得分高

oom killer选择进程的策略大致如下:

  1. 它必须拥有大量的页框
  2. 杀掉这个进程只会损失少量的工作
  3. 它的静态优先级必须低(可以通过nice来给不重要的进程设置低的优先级)
  4. 它不能够拥有root权限
  5. 它不能直接访问硬件
  6. 它不能够是0号进程(swapper),1号进程(init),以及内核线程

2.什么是Overcommit

Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存。一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪费内存,因为进程实际使用到的内存往往比申请的内存要少,比如某个进程malloc()了200MB内存,但实际上只用到了100MB,按照UNIX/Linux的算法,物理内存页的分配发生在使用的瞬间,而不是在申请的瞬间,也就是说未用到的100MB内存根本就没有分配,这100MB内存就闲置了。

Unix/Linux的内存分配策略是lazy的,申请的时候不会分配物理内存,只有在使用的时候才分配,为了尽可能地提高内存地利用效率,系统大部分情况下都会“答应”申请内存的要求。由于overcommit的存在,系统没办法在进程运行的时候就预判内存是否会耗尽,只有在真正分配内存的时候才会发现内存不够。为了防止系统崩溃,触发 OOM killer强杀一个或多个进程,以释放部分内存。

2.2.Overcommit策略

Linux 2.6之后允许通过内核参数 vm.overcommit_memory 禁止memory overcommit。内核参数 vm.overcommit_memory 接受三种取值:

  1. 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
  2. 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。
  3. 2 – Don’t overcommit. 禁止overcommit。

overcommit的阈值在/proc/meminfo中指定,

  • CommitLimit :overcommit的阈值,申请的内存总数超过CommitLimit即为overcommit。通过内核参数vm.overcommit_ratio或vm.overcommit_kbytes间接设置的,公式如下:【CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap】

        vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%

  • Committed_AS:所有进程已经申请的内存总大小(是已经申请,不是已经分配),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示 overcommit 越严重

附录:

  • CPU性能分析工具

vmstat、 sar、time、strace、pstree、top

  • 内存性能分析工具

vmstat、strace、top、ipcs、ipcrm、slabtop、cat /proc/meminfo、cat /proc/slabinfo、cat /proc/<pid #>/maps

  • IO性能分析工具

vmstat、iostat、repquota、quotacheck

  • 网络性能分析工具

Ifconfig、ethereal、iptraf、iwconfig、nfsstat、mrtg、ntop、netstat、cat /proc/sys/net

  • CPU性能调优工具

nice、renic、sysctl

  1. 内存性能调优工具

swapon、ulimit、sysctl

  • I/O性能调优工具

Edquota、quoton、sysctl

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值