1) Kernel真的内存耗尽了./proc/meminfo中的SwapFree和MemFree很低.都小于1%,那么负载过大就是缘由.php
2) 若是LowFree很低而HighFree高不少,那么就是32位体系结构的缘由,若是在64位内核或平台上就会好不少.html
3) 内核数据结构或者内存泄漏.java
/proc/slabinfo占用最多空间的对象是什么对象?awk '{printf "%5d MB %s\n", $3*$4/(1024*1024), $1}' < /proc/slabinfo | sort -n,
若是一种对象占用了系统的大部份内存,那么就有多是这个对象的缘由.检查这个对象的子系统.linux
SwapFree和MemFree的大小?算法
task_struct对象的数字是多少?是不是由于系统fork了太多进程致使的.数据库
4)内核没有正确使用swap分区.tomcat
若是应用程序使用了mlock()或者Huge TLBfs pages,那么有可能这个应用程序就不能使用swap空间.这种状况下,Swap Free很高仍然会OOM.mlock和Huge TLBfs pages这两个特征不容许系统将使用的内存换出,所以,这样过分使用内存会使得系统内存耗尽而让系统没有其余资源.服务器
也有多是系统本身有死锁.将数据写入磁盘也须要为各类各样的IP数据结构开辟内存.若是系统根本找不到这样的内存,正是用来产生空闲内存的函数会致使系统内存耗尽.可使用一些小的调节方法好比较早的页映射机智,可是若是系统不能快速的将脏页面换出来释放内存,咱们只能说负载过大而没有办法解决.增长/proc/sys/vm/min_free_kbytes会使得系统回收内存更早.这也会使得系统更难进入死锁.若是你的系统时由于死锁而致使OOM那么这是一个很好的调节值.网络
5)内核做出了错误的决定,读数据错误.当它还有很大RAM的时候就OOM了.数据结构
6)一些病理性的事情发生了.当内核花了一段很长的时间去扫描内存来释放.2.6.19版本的内核中,这个很长的时间指的就是VM扫描了和同一区域的active+inactive 页面6倍长的时间后.
若是内核正在快速扫描页,而你的IO设备(swap,filesystem,network fs)太慢了,内核会判定没有进程在进行交换而触发一次OOM即便swap有空闲.
解决方法:
1 2 3 |
|
lowMem也叫Normal Zone区,是固定不能变的,若是lowMem里存在不少碎片会触发OOM killer.
察看目前系统的LowMem使用情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
可使用的解决方案:
a 添加swap分区。
b 升级64位系统
c 若是必须使用32位系统,可使用hugemem内核,此时内核会以不一样的方式分割low/high memory,而大多状况提供足够多的low memory至high memory的映射。
d 将/proc/sys/vm/lower_zone_protection的值设为250或更大。或者修改/etc/sysctl.conf vm.lower_zone_protection这将会使内核在可以在high memory中分配内存时,不会再low zone里面开辟.
e 关掉 oom-kill echo "0" > /proc/sys/vm/oom-kill 或者修改:/etc/sysctl.conf vm.oom-kill = 0 (此方法不建议,系统会变得更糟糕)
f 增大内存
g 保护单个进程 echo -17 > /proc/[pid]/oom_adj
-------------------以上盗自http://iblog.daobidao.com/linux-linux-system-oom-killer-out-of-memory-killer-approach.DaoBiDao---------------------------------------------------------------------------
然而我遇到的问题是:
tail -n 2 /var/log/message
显示的结果:
May 19 23:33:08 iZ2879ng6hoZ kernel: Out of memory: Kill process 2339 (java) score 134 or sacrifice child
May 19 23:33:08 iZ2879ng6hoZ kernel: Killed process 2339, UID 0, (java) total-vm:3248664kB, anon-rss:314076kB, file-rss:280kB
-------------------如下盗自http://it.deepinmind.com/java/2014/06/12/out-of-memory-kill-process-or-sacrifice-child.html--------------------------------------------------------
很明显咱们被Linux内核给坑了。你知道的,Linux里面有许多邪恶的怪物(也叫做守护进程)。这些守护进程是由几个内核做业所看管的,其中的一个犹为恶毒。全部的现代Linux内核中都会有一个内存不足终结者(Out of memory Killer, OOM Killer)的内建机制,在内存太低的状况下,它会杀掉你的进程。当探测到这一状况时,这个终结者会被激活,而后挑选出一个进程去终结掉。选择目标进程使用的是一套启发式算法,它会计算全部进程的分数,而后选出那个分数最低的进程。
默认状况下,Linux内核会容许进程请求的内存超出实际可用内存的大小。这在现实世界中是有意义的,由于大多数进程其实并不会用到全部分配给它的内存(注:同一时间内不会全用到)。和这个问题最相似的就是运营商了。他们承诺卖给用户的都是100Mb的带宽,这实际上远远超出了他们的网络容量。他们赌的就是用户实际上并不会同时用完分配给他们的下载上限。一个10Gb的链接能够很轻松地承载100个以上的用户,这里的100是经过简单的数学运算得出的(10G/100M)。
这个作法的一个很明显的反作用就是,万一有一个程序正走上了一条耗尽内存的不归路怎么办。这会致使低可用内存的状况,也就是没有内存页可以再分配给进程了。你可能也碰到过这种状况,没有root账户你是杀不掉这种顽固的进程的。为了解决这一状况,终结者被激活了,并找出了要终结的进程。
关于"Out of memory killer"参数的调整,能够参考下这篇文章。
=========================================================================
机器状况:2g内存同时有运行tomcat网站也有php的论坛和博客,数据库也搭在同一台服务器(穷啊)
运行状况:经过查进程发现有大量的php-fpm进程在运行,然而并无这么多访问。查看php-fpm配置发现启动就有大量的进程 占用不少内存
解决方案:修改php-fpm配置归还内存空间