公司 同事 在客户的测试机器上 出现这样的问题
create tablespace monitor02 datafile '/oradata/monitor/monitor021.dat' size 2000M
Wed Jan 13 09:50:52 2010
PSP0: terminating instance due to error 472
Instance terminated by PSP0, pid = 5213
查了一下 Linux 的 Out-of-Memory (OOM) Killer
这个在32位操作系统上貌似是个BUG,,没什么好的解决办法,,
查看linux 操作系统位数
# getconf LONG_BIT
32
查看 内存 free
[oracle@ufc3 ~]$ free
total used free shared buffers cached
Mem: 8150396 8018304 132092 0 570848 6628344
-/+ buffers/cache: 819112 7331284
Swap: 10190840 120 10190720
========================================================
同事在 Linux 服务器上遇到点小问题,我也上去折腾半天。这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer 。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉,有些壮士断腕的意思。
先要学习点老知识,在 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 里都是碎片,请求不到连续的内存区域【根据我遇到的一个案例,一个猜想是 有些应用一次性请求比较大的内存,恰恰又是 880M 之内的,空闲的(LowFree)不够大,就会触发 OOM Killer 出来干活】。检查当前 LowFree 的值:
# cat /proc/meminfo |grep LowFree 检查LowMem内存碎片:
# cat /proc/buddyinfo上面这条命令要在 2.6 Kernel 环境下有效。据说使用 SysRq 的方式更好,不过 Hang 的时候再用吧。参见 Metalink Note:228203.1 。
根据一些文档描述,OOM Killer 在 2.4 与 2.6 上表现是不一样的。2.4 的版本中是把新进来(新申请内存)的进程杀掉。而 2.6 上是杀掉占用内存最厉害的进程(这是很危险的,很容易导致系统应用瘫痪)。
对于 RHEL 4 ,新增了一个参数: vm.lower_zone_protection 。这个参数默认的单位为 MB,默认 0 的时候,LowMem 为 16MB。建议设置 vm.lower_zone_protection = 200 甚至更大以避免 LowMem 区域的碎片,是绝对能解决这个问题的(这参数就是解决这个问题出来的)。
而对于 RHEL 3 (Kernel 2.4) 似乎没什么好办法,一个是用 Hugemem 内核(天知道会不会引入新的毛病),一个是升级到 2.4.21-47 并且使用新的核心参数 vm.vm-defragment 控制碎片的数量。再就是使用 RHEL 4 (Kernel 2.6),这又绕回去了。说白了,如果遇到 OOM Killer ,基本上是低版本 Kernel 设计上有点缺陷。
其它,如果去查询 RedHat 的 Bug 库,会发现不少 Kernel 版本也有 Bug 的。尤其在使用 NFS 的场景。
Tip: OOM Killer 的关闭与激活方式:
# echo "0" > /proc/sys/vm/oom-kill # echo "1" > /proc/sys/vm/oom-kill更多参考信息:
1) OOM killer "Out of Memory: Killed process" SOLUTIONS / SUMMARY【对我遇到的案例没鸟用】
http://www.redaht.com/archives/redhat-list/2007-August/msg00060.html
2) Metalink Notes : Linux Kernel Lowmem Pressure Issues and Kernel Structures
3) Respite from the OOM killer
分享到:
相关推荐
Linux系统的OOM Killer处理机制.docx
NULL 博文链接:https://shuechaolau.iteye.com/blog/1558046
OOM分析工具-MemoryAnalyzer JVM dump分析利器
如果不能使用,请修改根目录下的project.property的android:target为你当前有的target(不知道怎么改的同学可以从8到21一个...但打开时无自动聚焦,这个问题有需要的同学可以自己加上去哦。根本原因是解决内存不足问题。
ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf
1 概述 Android的设计理念之一,便是应用程序退出,但进程还会继续存在系统以便...Android基于Linux的系统,其实Linux有类似的内存管理策略——OOM killer,全称(Out Of Memory Killer), OOM的策略更多的是用于分配内存
gceasy 元空间内泄露导致Full GC日志分析报告
前面一节重点分享了Linux的内存分配策略,基于上述的分配策略,为了规避超售的风险,Linux采了一种OOM Killer的机制,即系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存
关于Android out of memory错误的分析
kubernetes-oom-event-generator 容器启动时生成Kubernetes事件,并指示该容器先前已被杀死。设计控制器侦听Kubernetes API中的新事件和事件更改。 每次收到有关事件的通知时,它都会根据事件的Reason和所涉及对象的...
ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf
This is the global socket data structure used for responding to the Out-of-the-blue (OOTB) packets. A control sock will be created for this socket at the initialization time.
Mar 9 11:29:16 xxxxxx kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 Mar 9 11:29:16 xxxxxx kernel: mysqld cpuset=/ mems_allowed=0 Mar 9 11:29:16 x
主要介绍了Slave memory leak and trigger oom-killer,需要的朋友可以参考下
oom-killer通常在Linux用户中享有不良声誉。 这可能是Linux仅在绝对没有其他选择时才调用它的部分原因。 它将换出桌面环境,删除整个页面缓存,并在最终终止进程之前清空每个缓冲区。 至少那是我认为的做法。 我坐...
heart_oom_protect 一个Erlang OTP库,可保护心脏免于被Linux内核的OOM Killer杀死 建造 $ rebar3 compile
icinga2_check_oom Icinga2 / Nagios检查内存不足问题。 ATM会检查所有dmesg输出。 如果要检查后再次使其变为绿色,则需要运行dmesg -c。 usage: check_oom.py [-h] [-m {warning,critical,default}] [-v]Check for ...
out of memory OOM文件分析工具
proc <pid> oom_adj set to -17 protects the oom killer for legacy purposes.