OOM killer 的避免

640阅读 0评论2015-04-16 yyxl
分类:LINUX

By fireworks2@foxmail.com

关于OOM killer,这篇文章描述的非常详尽:
http://linuxdevcenter.com/lpt/a/6808

和其他随意撰写的文章(不少文章都说和LowMemFree有关)不同,此文准确地指出OOM killer发生的原因以及避免的方法。这里做一个简单的小结,如果想知道详细的情况,可以阅读上面链接所指向的那篇文章。

OOM发生的原因:
  1. 虚拟内存不够用了(真实内存+Swap);通常是因为内存泄露或的确要占大内存
  2. 用户进程空间不够了;一般真实场景下遇到的并非该问题,在程序设计阶段就会考虑进程空间大小是否足够

OOM的避免:(同上面两个原因对应)
  1. 增加内存+Swap的总大小;不过对于内存泄露或虚拟内存仍然不够用时,这么做并没有作用
  2. 改用64位进程+64位系统来扩大进程空间

应用程序自己加保护来避免OOM:
  1. 可以处理上面解决办法里面无法处理的情况
  2. 操作方法是在应用程序分配内存时做出错检查,并且设置合理的系统参数,e.g.
    echo 2 >  /proc/sys/vm/overcommit_memory 
    echo 100 > /proc/sys/vm/overcommit_ratio

此时可申请的内存总量最大为(mmap共享的除外):
    CommitLimit=MemTotal*overcommit_ratio+SwapTotal


另:
还有些做法可以调整oom发生时的行为
这个文章里面也描述了oom的情况


上一篇:在 Linux 下用户空间和内核空间数据交换的方式
下一篇:内核中IS_ERR, ERR_PTR,PTR_ERR用法