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选择进程的策略大致如下:
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 接受三种取值:
overcommit的阈值在/proc/meminfo中指定,
vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%
附录:
vmstat、 sar、time、strace、pstree、top
vmstat、strace、top、ipcs、ipcrm、slabtop、cat /proc/meminfo、cat /proc/slabinfo、cat /proc/<pid #>/maps
vmstat、iostat、repquota、quotacheck
Ifconfig、ethereal、iptraf、iwconfig、nfsstat、mrtg、ntop、netstat、cat /proc/sys/net
nice、renic、sysctl
swapon、ulimit、sysctl
Edquota、quoton、sysctl
本文发布于:2024-02-02 04:49:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170682058241462.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |