Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。

在很多情况下,经常会看到还有剩余内存时,oom-killer依旧把进程杀死了,现象是在/var/log/messages日志文件中有如下信息:
Out of Memory: Killed process [PID] [process name].
该问题是low memory耗尽,因为内核使用low memory来跟踪所有的内存分配。
当low memory耗尽,不管high memory剩多少,oom-killer都会杀死进程,以保持系统的正常运行。

要学习点老知识,在 32 位CPU 架构下寻址是有限制的。Linux 内核定义了三个区域:

# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
LowMem 区 (也叫 NORMAL ZONE ) 一共 880 MB,而且不能改变(除非用 hugemem 内核)。对于高负载的系统,就可能因为 LowMem 利用不好而引发 OOM Killer 。一个可能原因是 LowFree 太少了,另外一个原因是 LowMem 里都是碎片,请求不到连续的内存区域

有两种方法查看 low memory 和 high memory 的状态:

# egrep 'High|Low' /proc/meminfo
HighTotal: 5111780 kB
HighFree: 1172 kB
LowTotal: 795688 kB
LowFree: 16788 kB
# free -lm
total used free shared buffers cached
Mem: 5769 5751 17 0 8 5267
Low: 777 760 16 0 0 0
High: 4991 4990 1 0 0 0
-/+ buffers/cache: 475 5293
Swap: 4773 0 4773
当low memory耗尽,不管high memory剩余多少,oom-killer都开始杀死进程,以保持系统的正常运转。
有两种方法可以解决这个问题

1、如果可能,请升级到64位系统。

这是最好的解决办法,因为所有的内存都将成为low memory。如果你在这种情况下耗尽了low memory,那就真的是out of memory了。

2、如果受限于必须使用32位系统,最好的解决办法是使用hugemem内核。

这种内核以不同的方式分割low/high memory,而且在大多数情况下会提供足够多的low memory到high memory的映射。在大多数案例中,这是一个很简单的修复方法:安装hugemem kernel RPM包,然后重启即可。

如果运行hugemem内核也不可能,你可以尝试将/proc/sys/vm/lower_zone_protection 的值设置为250甚至更多。这将让内核愿意保护low memory,从而在分配内存时多考虑从high memory分配。据我所知,此选项从2.6.x内核才开始可用。必要的是,您可能需要通过一些实验来找到您系统环境中最适合的值。可以使用下面方法快速的设置和检查改值:

# cat /proc/sys/vm/lower_zone_protection
# echo "250" > /proc/sys/vm/lower_zone_protection
在 /etc/sysctl.conf 中加入设置,以便启动就生效:

vm.lower_zone_protection = 250

作为最后的努力,你可以关闭oom-killer。这个选项可以导致系统挂起,所以请小心使用(风险自负)!

查看当前oom-killer的状态:

# cat /proc/sys/vm/oom-kill
关闭/打开oom-killer:

# echo "0" > /proc/sys/vm/oom-kill
# echo "1" > /proc/sys/vm/oom-kill
当进程该被oom-killer杀死却没有被杀死时,相关信息会记录到 /var/log/messages:

"Would have oom-killed but /proc/sys/vm/oom-kill is disabled"

上google研究了一下, 找到了一些配置方法。记录一下,备忘。

sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf

上面配置可以让linux在出现 Out of memory之后重启。

echo -15 &gt; /proc/[pid]/oom_adj
这会让 oom 在出现 Out of memory后,尽量不去kill这个进程。

echo 10 &gt; /proc/[pid]/oom_adjoom
会优先考虑kill这个进程。

echo -17 &gt; /proc/[pid]/oom_adj
oom在Out of memory时, 不会kill该进程。

oom_adj的值在-16 到 +15之间,值越高被kill的优先度越高,当该值为-17时,系统将不会杀死指定pid的进程,而-16~15则会使得进程的/proc/[pid]/oom_adj值呈指数(K*2^n)形式递增,即它们被杀掉的可能性呈指数递增。针对init(进程号为1)这个进程,无论该值设为多少都不会被杀。

sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

可以完全关掉oom, 不过这并不建议,关掉后可能会出现未知的情况。

Out of memory: Kill process 解决相关推荐

  1. 理解和配置Out of memory: Kill process

    转自:爱开源 理解 OOM killer 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题.这通 ...

  2. Mongodb副本集--Out of memory: Kill process 37325 (mongod)

    Mongodb副本集--Out of memory: Kill process 37325 (mongod) 1.Mongodb副本集--Out of memory: Kill process 373 ...

  3. linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析

    转自:http://www.111cn.net/sys/CentOS/84755.htm 从Out of memory来看是内存超出了,后面的 Kill process[PID] [process n ...

  4. Linux——》Out of memory:kill process

    推荐链接:     总结-->[Java]     总结-->[Mysql]     总结-->[Spring]     总结-->[SpringBoot]     总结--& ...

  5. Out of memory: Kill process 内存不足

    服务直接被 killed,感觉特别奇怪.代码肯定是没有问题的,但为什么放到服务器上就出错了呢. 部署时报错如下: Shell代码   Failed to add the deployment cont ...

  6. linux进程异常退出分析,ECS Linux程序异常退出提示“out of memory”的临时解决办法...

    ECS Linux上的程序会出现异常退出的情况,退出的原因多数是因为系统内存不足,Linux内存不足通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM ki ...

  7. mysql killed 不掉,解决:kernel: Out of memory: Killed process 15967, UID 27, (mysqld).

    最近服务器突然有一段时间:ssh连不上,查看日志发现有大有问题,去网上查了,发现是内存不够了,可以使用以为网友提供的添加一个1Gswap分区,原服务器确实已经删除了swap分区. Mar 20 16: ...

  8. ORA-27125: unable to create shared memory segment的解决方法(转)

    ORA-27125: unable to create shared memory segment的解决方法(转) 原文:http://www.eygle.com/rss/20111202.html  ...

  9. Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)

    这篇文章主要介绍了Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)的相关资料,需要的朋友可以参考下 在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映.这个时候, ...

最新文章

  1. sqlmap namespace ibatis 没有生效
  2. 2016/3/10 PHP (超文本预处理器) 是什么?
  3. linux snap安装redis-desktop-manager
  4. flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...
  5. QT【001】- 基础写在前面的话
  6. 系统时钟(汇编语言程序设计)
  7. Oracle数据库学习笔记
  8. linux u盘 写保护,高手分享U盘被写保护的解决方案
  9. 面试官说:Spring这几个问题你回答下,月薪3万,下周来上班!
  10. 易语言python识别图片验证码_图片识别-打码平台-打码网站-识别验证码-图鉴网络科技有限公司...
  11. 在Ubuntu 20.04上面搭建嵌入式开发环境
  12. 硬件-ESP32S模块资料介绍
  13. 使用PowerShell 获取AAD 用户的license授予时间
  14. 使用jquery.wordexport.js导出word文档 设置行间距不生效问题
  15. itools官方中文版2014 v2.0.3.8_苹果同步软件
  16. 为什么go语言还没有火起来?go语言有哪些劣势?
  17. 干货 | 诚迈科技联合联发科技、Linaro推出《Make it happen!联发科技曦力X20开发板技术公开课(上海站)》精彩回顾
  18. 关于计算机设计的英语作文,关于电脑的英语作文
  19. linux基础篇(三)
  20. Python爬虫之scrapy框架介绍

热门文章

  1. 存储调研:BeeGFS并行文件系统体系结构
  2. java和ccnp哪个难_新版思科网络工程师CCNP的通过率是多少?
  3. FCPX插件:Stupid Raisins Block Pop(视频转场插件)
  4. HDU 5514 Frogs 容斥
  5. 2021-08-15 minikube在阿里云centos系统上的安装实践
  6. 海店湾养生专家:被称为油料之王的“神奇的豆子”,你知道它吗?
  7. 使用Java开发一个做数据共享的联盟链思路
  8. Qt图形视图框架详解-安晓辉-专题视频课程
  9. RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is
  10. Java编写网络打字游戏