Linux OOM-killer机制说明
1.什么是OOM-killeroom_killer(out of memory killer)是Linux内核的一种内存管理机制,在系统可用内存较少的情况下,内核为保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存。通常oom_killer的触发流程是:进程A想要分配物理内存(通常是读写内存)->触发缺页异常->内核去分配物理内存->物理内存不足,触发OOM。1....
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选择进程的策略大致如下:
- 它必须拥有大量的页框
- 杀掉这个进程只会损失少量的工作
- 它的静态优先级必须低(可以通过nice来给不重要的进程设置低的优先级)
- 它不能够拥有root权限
- 它不能直接访问硬件
- 它不能够是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 接受三种取值:
- 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
- 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。
- 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
- 内存性能调优工具
swapon、ulimit、sysctl
- I/O性能调优工具
Edquota、quoton、sysctl
更多推荐
所有评论(0)