OOM Killer

转载 2015年07月08日 14:01:35

最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂

1. 首先确认该系统的版本是32位

#uname -a
Linux alarm 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386

2. 我们了解一下32位Linux的内存管理结构

# DMA: 0x00000000 -  0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>

    内核使用low memory来跟踪所有的内存分配,这样的话一个16GB内存的系统比一个4GB内存的系统,需要消耗更多的low memory,当low memory耗尽,即便系统仍然有剩余内存,仍然会触发oom-killer。在2.6内核的表现是,杀掉占用内存最高的进程,所以会导致sshd等进程被杀掉,造成系统无法登录。

3. 如何查看lowMem

复制代码
-bash-3.00# free -lm
             total       used       free     shared    buffers     cached
Mem:          2026       1973         52          0         36       1303
Low:           874        823         51
High:         1151       1150          1
-/+ buffers/cache:        633       1392
Swap:         3067        142       2924
复制代码

4. 所以我们需要保护LowMem,在2.6内核引入了lower_zone_protection,这将让内核愿意保护low memory,从而在分配内存时优先考虑从high memory分配。

-bash-3.00# cat /proc/sys/vm/lower_zone_protection
0
-bash-3.00#echo 400 > /proc/sys/vm/lower_zone_protection

 另一起问题是24G内存的系统,空闲内存已经不到50M

1. 确认该系统的版本是64位

# uname -a
Linux gxgd-nms-app 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:01:26 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

2. 用ps查看各进程的内存,大约就占用了4G, 绝大部分内存都是被Page Cache所占用。Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释放Page Cache,但不排除释放不及时或者释放的内存由于存在碎片不满足进程的内存需求。

   所以我们需要一个方法,能够限定PageCache的上限。

Linux 提供了这样一个参数min_free_kbytes,用来确定系统开始回收内存的阀值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。

[root@zyite-app01 root]# cat /proc/sys/vm/min_free_kbytes
163840
echo 963840 > /proc/sys/vm/min_free_kbytes

其他可选的临时解决方法:

关闭oom-killer

cat /proc/sys/vm/oom-kill
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
  vm.oom-kill = 0

2. 清空cache (可选)
echo 1 > /proc/sys/vm/drop_caches



OOM-killer:Out-of-Memory (OOM) Killer是一种保护机制,用于当内存严重不足时,为了系统的继续运转,内核迫不得已挑选一个进程,将其杀死,以释放内存,缓解内存不足的问题。
可以看出这种方式对进程的保护是有限的,不能完全的保护进程的运行。


OOM Killer的关闭与激活方式:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1″ > /proc/sys/vm/oom-kill


在实际运营场景中,我们经常出现ssh连接不上服务器,但ping却是通的情况,这个时候很有可能是内存不够linux启动了oom-killer,系统根据一定的分数和机制来决定
随机杀掉一些程序释放物理内存(特别是我们后台需要大量共享内存而且用了mlock的程序),而sshd进程很可能就是被选中杀掉的进程,因此导致通过ssh登录不上。 
这个时候基本上swap也被耗尽, 所有能释放内存的机制内核都已经尝试了。


而ping能够通,主要是因为ping其实是内核协议栈就直接回包了,不会走到用户态,所以还能证明机器还是活着的。


 
对于每个进程都有一个oom_score的属性/proc/PID/oom_score
oom- killer 会杀死oom_score较大的进程,当oom_score为0时禁止内核杀死该进程。


还有一个/proc/PID/oom_adj
一般来说,oom_adj的值越大,该进程被系统选中终止的可能就越高,当oom_adj=-17时,oom_score将变为0。
(要对某个进程进行OOM保护的话就直接向“/proc/pid/oom_adj”中写入“-17”即可。)


所以可以通过命令 
echo 0 > /proc/PID/oom_adj 
来防止重要的进程被oom_killer杀死。


例如可以把sshd进程的oom_adj改为0 ,包括自己连接上的那个终端进程,这样你还可以执行一些运维工作。

Linux OOM killer 机制

Linux中的Out Of Memory(OOM) Killer功能是一种确保系统内存足够的最终手段,可以在耗尽系统内存或交换区后,按某种算法判断占用系统最多资源的进程,向进程发送信号,强制终止该进程...
  • JeffreyNicole
  • JeffreyNicole
  • 2015年08月03日 22:07
  • 2177

Linux oom-killer的问题

Linux oom-killer的问题 今天遇到了一个奇怪的问题,往一块嵌入式开发板上写文件当文件写入到一定长度时程序就会出现fault,整个程序死掉。发现串口下出现了oom的打印 什么是oom-...
  • oujiangping
  • oujiangping
  • 2017年07月08日 15:04
  • 9027

linux的OOM killer机制

linux oom killer机制探究,结合实践,解决项目遇到的问题
  • weixiaomao0801
  • weixiaomao0801
  • 2016年11月29日 18:48
  • 330

linux系统 关闭 oom killer

关闭oom killer 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题。这通常是因为某...
  • sanmaoljh
  • sanmaoljh
  • 2015年07月17日 15:44
  • 966

oom和oom-killer实例简介(内存用完和进程杀死)------顺便说说linux下的两个重要目录:/proc/kmsg和/var/log/messages

oom就是out of memory, 意思就是内存用完了(内存泄漏可能导致这种现象)。 在linux中, 如果linux机器的内存用完了, 会怎样呢? 很显然, 系统肯定无法正常工作。 linux...
  • stpeace
  • stpeace
  • 2017年03月11日 21:29
  • 3719

linux系统中oom killer策略

最近经常出现datanode被内核oom-killer干掉的情况,下面追查下原因:(todo...) 什么是Overcommit和OOM?  overcommit的策略  当oom-kill...
  • mango_song
  • mango_song
  • 2014年03月22日 21:44
  • 1347

关于OOM-killer

OOM-killer:Out-of-Memory (OOM) Killer是一种保护机制,用于当内存严重不足时,为了系统的继续运转,内核迫不得已挑选一个进程,将其杀死,以释放内存,缓解内存不足的问题。...
  • tenfyguo
  • tenfyguo
  • 2013年07月22日 15:34
  • 7914

Linux Out-Of-Memory(OOM) Killer分析

Linux Out-of-Memory(OOM) Killer       Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优...
  • chenleixing
  • chenleixing
  • 2015年07月27日 08:53
  • 1668

linux下mysql oom killer

1、现象描述:昨晚新上线一个服务,有人做了一个del操作,接着mysql主从全部挂机 如下: 主 Apr  6 22:56:58 wmappdb1 kernel: Out of memory: ...
  • yujin2010good
  • yujin2010good
  • 2017年04月07日 16:15
  • 280

linux如何查看进程OOM killer

基本概念: Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程...
  • daiyudong2020
  • daiyudong2020
  • 2016年05月31日 10:29
  • 2701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OOM Killer
举报原因:
原因补充:

(最多只允许输入30个字)