Linux overcommit

一、进程消失排查思路

1、使用dmesg 查看/var/log/messages,命令是 dmesg | grep java or dmesg | egrep -i killed process

出现OOM错误,进程6352 被杀死,score 73 这些信息都指向了overcommit引发的java进程被操作系统杀死。

dstat --top-oom 查看最有可能因为OOM被杀死的进程。

2、登录到admin,使用w查看当前登录用户,history查看当前登录用户的历史操作。

二、overcommit介绍

2、按照UNIX/Linux的算法,物理内存页的分配发生在使用的瞬间,而不是在申请的瞬间,比如某个进程malloc()了200MB内存,但实际上只用到了100MB,未用到的100MB内存根本就没有分配。commit(或overcommit)针对的是内存申请(占用虚拟空间大小),内存申请不等于内存分配,内存只在实际用到的时候才分配(此时占用的是物理空间)。当进程需要内存时(例如通过brk分配内存),进程从内核获得的仅仅是一段虚拟地址的使用权,而不是实际的物理地址,进程并没有获得物理内存。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,产生“缺页”异常,从而进入分配实际物理地址的过程,也就是分配实际的page frame并建立page table。之后系统返回产生异常的地址,重新执行内存访问。virtual memory需要physical memory做为支撑,如果分配了太多的virtual memory,和物理内存不成比例,对性能会有影响。对于这个状况,我们称之为overcommit。用英文描述:

In an ideal world, every application would only request as much memory as it currently needs. And frees memory instantly when it is no longer used.()
Unfortunately that is not the case in the real world. Many applications request more memory - just in case. Or preallocate memory which in the end is never used.

理想情况下,每个应用都想申请合适够用的内存来使用,当不再使用时可以立即释放,实际上,应用总是贪得无厌,想要更多,导致有一部分多申请的内存即使在最后应用结束了,也没有被利用,资源浪费!

overcommit即操作系统在应用申请内存空间时不去检查是否超出当前可用量,随意满足申请要求,应用也不管实际是否有足够多的内存可使用,认为我申请了2G,OS肯定就给我2G使用。最后,随着内存越用越多,OS发现内存不够用了,必须要收回一些内存才行,此时使用oom-killer挑选若干它认为消耗内存够大的进程并杀死,这就是某些进程莫名其妙消失的原因。overcommit参数定义在/proc/sys/vm/overcommit_memory。

Linux根据参数 vm.overcommit_memory设置overcommit

0:默认值,启发式overcommit(Heuristic overcommit handling),它允许overcommit,但太明显的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。当前可申请内存大小: RAM free + Swap free + Cached + (部分可回收的). 可以简单的认为是当前系统实际可用内存

1 : Always overcommit. 允许overcommit,对内存申请来者不拒。随意申请

2:不允许overcommit,提交给系统的总地址空间大小不允许超过CommitLimit。

CommitLimit 就是overcommit的阈值,申请的内存总数超过CommitLimit的话就算是overcommit。

CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap

kernel设有一个阈值,申请的内存总数超过这个阈值就算overcommit,在/proc/meminfo中可以看到这个阈值的大小:


这里总地址空间大小不能超过24G。

vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%。如果你不想使用比率,也可以直接指定内存的字节数大小,通过另一个内核参数 vm.overcommit_kbytes 即可。

查看这些参数的命令是

cat /proc/sys/vm/overcommit_memory(默认1)

cat /proc/sys/vm/overcommit_kbytes(默认0)

cat /proc/sys/vm/overcommit_ratio(默认50)

三、Linux 内存相关命令

free命令

截图上的信息解释为:

详细解释每个参数的含义:

shared:废弃参数,不用管

buffers:系统分配但未被使用的buffers数量,

cached:系统分配但未被使用的cache数量

英文解释:

  •  A buffer is something that has yet to be "written" to disk.
  • A cache is something that has been "read" from the disk and stored for later use.

简单理解Buffer是写缓存,Cache是读缓存。

对于-/+buffers/cache,可以理解成站在一个进程的视角,OS已经使用了5761MB,还剩2430MB可用。这个2430是第一行mem的free + buffers + cache之和。那么第一行的Mem就是站在一个OS的角度,总共有8G,使用了7893MB,还可以使用298MB+ 2132MB,可以使用sudo sysctl vm.drop_caches=3释放缓存,增大free空间

参考:http://linuxperf.com/?p=102

http://www.wowotech.net/linux_kenrel/overcommit.html

https://elixir.bootlin.com/linux/v2.6.32/source/mm/oom_kill.c#L73

猜你喜欢

转载自my.oschina.net/u/2302503/blog/1647540
今日推荐