本文转载自:http://blog.csdn.net/zhoutimo/article/details/52024487

What(什么是OOM):

Linux下面有个特性叫OOM killer(Out Of Memory killer),这个东西会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存。具体的记录日志是在/var/log/messages中,如果出现了Out of memory字样,说明系统曾经出现过OOM!

When(什么时候出现):

linux下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。

参数/proc/sys/vm/overcommit_memory可以控制进程对内存过量使用的应对策略
1.当overcommit_memory=0 允许进程轻微过量使用内存,但对于大量过载请求则不允许,也就是当内存消耗过大就是触发OOM killer。
2.当overcommit_memory=1 永远允许进程overcommit,不会触发OOM killer。
3.当overcommit_memory=2 永远禁止overcommit,不会触发OOM killer。

How(系统会怎么样):

当然,如果触发了OOM机制,系统会杀掉某些进程,那么什么进程会被处理掉呢?kernel提供给用户态的/proc下的一些参数:
1./proc/[pid]/oom_adj,该pid进程被oom killer杀掉的权重,介于 [-17,15](具体具体权重的范围需要查看内核确认)之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。

通过2个步骤可以确认,具体权重的范围:

①uname -a查看Linux内核版本

②进入/usr/src/kernels/内核版本/include/linux/oom.h确认具体的权重范围


2./proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算(2ⁿ,n就是oom_adj的值)后的结果。

oom_adj,oom_score是oom_killer的主要参考值

 
So(我们能做什么):
1.保护我们重要的进程,避免被处理掉
实例:
ps -ef|grep GameServer(获得重要进程的PID)
echo -17 > /proc/PID/oom_score_adj(输入-17,禁止被OOM机制处理)
2.关闭OOM机制(不推荐,如果不启动OOM机制,内存使用过大,会让系统产生很多异常数据)
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
systcl -p

最新文章

  1. C#通过WebClient/HttpWebRequest实现http的post/get方法
  2. JavaScript getComputedStyle
  3. Linux下6种优秀的邮件传输代理
  4. Oracle 安装 INS-30131错误。
  5. DMA-330(二)
  6. 2014多校第三场1005 || HDU 4891 The Great Pan(模拟)
  7. Django学习之路
  8. ESX与ESXi管理员必备25个命令
  9. 以List为例浅谈C#的学习方法
  10. LeetCode算法题-Single Number(Java实现)
  11. 遗传算法selection总结-[Fitness, Tournament, Rank Selection]
  12. NO-CARRIER
  13. Hybrid小程序混合开发之路 - 数据交互
  14. Spring Boot下的lombok安装以及使用简介
  15. you must restart adb and eclipse的相关解决办法
  16. Jenkins进阶-Slave 节点的配置(11)
  17. c简单的单向链表
  18. nginx实战五
  19. [原创]css中a标签去掉锚点文本下划线
  20. jquery实现简单瀑布流

热门文章

  1. 记录一个MySQL的问题
  2. windows下查看端口进程占用情况
  3. windows下react-native搭建环境
  4. APP开发中的弹窗体系,UI设计师不能忽视的地方
  5. page事件
  6. ★Java语法(三)——————————变量常量
  7. error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译
  8. 创建一个类Person
  9. layui confirm
  10. 腾讯模板引擎template