• 一则 ORA-00471 处理方法


    公司新上架一台服务到机房,硬件是IBM X3850 X5,硬件配置算是好的,内存有128GB。SA安装好系统--(版本sule 32bit)后通知我可以安装数据库了。忙活半天,安装好oracle 9204后,准备建表空间导入数据。因为数据量比较大,我打算建立一个10G的数据文件用来存储这写数据。打入创建表空间的命令后,没过多久数据库出现宕机现象。后来我又重新操作一遍还是故障依旧。以下是日志信息:

    alert.log:

    Errors in file /u01/oracle/admin/orcl/bdump/orcl_pmon_13918.trc:
    ORA-00471: DBWR process terminated with error
    Wed Aug 21 15:56:16 2013
    PMON: terminating instance due to error 471
    Instance terminated by PMON, pid = 13918

     

    trace file:

    /u01/oracle/admin/orcl/bdump/orcl_pmon_13918.trc
    Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.4.0 - Production
    ORACLE_HOME = /u01/oracle/product/9.2.0
    System name:    Linux
    Node name:      dbprod
    Release:        2.6.27.19-5-pae
    Version:        #1 SMP 2009-02-28 04:40:21 +0100
    Machine:        i686
    Instance name: orcl
    Redo thread mounted by this instance: 1
    Oracle process number: 2
    Unix process pid: 13918, image:
    oracle@dbprod</a> (PMON)

    *** 2013-08-21 15:56:16.296
    *** SESSION ID:(1.1) 2013-08-21 15:56:16.277
    error 471 detected in background process
    ORA-00471: DBWR process terminated with error

     

    /var/log/messages:

    Aug 21 14:01:14 dzjg kernel: lowmem_reserve[]: 0 872 62301 62301
    Aug 21 14:01:14 dzjg kernel: Node 0 Normal free:3704kB min:3744kB low:4680kB high:5616kB active:3096kB inactive:3092kB present:893200kB

    Aug 21 14:01:14 dzjg kernel: Out of memory: kill process 12867 (oracle) score 414016 or a child
    Aug 21 14:01:14 dzjg kernel: Killed process 12867 (oracle)

    初步判断是系统内存不够,但是通过free -m查看系统有60G的内存。通过上网查阅相关文档对故障分析如下:

    1.出现故障的原因:

    32CPU下寻址范围是有限的,Linux内核定义了下面三个区域:

       # DMA: 0x00000000 -  0x00999999 (0 - 16 MB)

     

       # LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB

     

       # HighMem: 0x038000000 - (由服务器硬件决定

     

    32位系统中,内存被分为 以上3 个区域,DMA zoneNormal zone(也叫做LowMem)和 HighMem zone其中 DMA zone主要用于 DMA 传输数据,位于低地址空间,其服务对象为各种驱动程序,其大小为 16MB,其中 LowMem (也叫做Normal zone) kernel 可以直接访问的地址空间,其大小为 880 MB,基本上所有的内核数据都在这个区域,同时如果内核要访问更高地址空间的内容,均需要通过 Normal zone映射过去才可以。地址空间大于 880 MB 的为 HIghMem zone.

     

    截取的系统日志如下:

    Aug 21 14:01:14 dzjg kernel: lowmem_reserve[]: 0 872 62301 62301
    Aug 21 14:01:14 dzjg kernel: Node 0 Normal free:3704kB min:3744kB low:4680kB high:5616kB active:3096kB inactive:3092kB present:893200kB

    Aug 21 14:01:14 dzjg kernel: Out of memory: kill process 12867 (oracle) score 414016 or a child
    Aug 21 14:01:14 dzjg kernel: Killed process 12867 (oracle)

    我们可以看到normal zone free 3704KB < min 3744KB,内核申请最小的内存3744KB,此时系统空闲的lowmem 3704KB,不能满足需求。该问题是low memory耗尽,因为内核使用low memory来跟踪所有的内存分配。当low memory耗尽,不管high memory剩多少,会触发oom-killer机制(out of memory killer)杀死进程,以保持系统的正常运行。根据一些文档描述,OOM-Killer 2.4 2.6 上表现是不一样的。2.4的版本中是把新进来(新申请内存)的进程杀掉。而 2.6上是杀掉占用内存最厉害的进程(这是很危险的,很容易导致系统应用瘫痪)。我们目前的系统内核版本为2.6,从而导致系统将数据库LGWR进程杀死.

     

    2.为什么我们系统物理内存有60G,还会耗尽Lowmem?

    目前系统内存详细情况如下,红色字体为NORMAL ZONE(也叫做LOWMEM)

    oracle@dzjg:~> free -lm
                    total       used       free     shared    buffers     cached
    Mem:         62174        479      61695          0         49        299
    Low:           181        108         73
    High:        61992        370      61622
    -/+ buffers/cache:        130      62044
    Swap:         8189          0       8189
    oracle@dzjg:~> cat /proc/meminfo
    MemTotal:     63666656 kB
    MemFree:      63093160 kB
    Buffers:         69124 kB
    Cached:         352836 kB
    SwapCached:          0 kB
    Active:         173088 kB
    Inactive:       299200 kB
    HighTotal:    63480528 kB
    HighFree:     63044476 kB
    LowTotal:       186128 kB
    LowFree:         48684 kB

    SwapTotal:     8385920 kB

     

    可以看到lowmem total181MB严重小于880MB,出现这个现象的原因是32位系统使用一种PAE kernel的技术(内存扩展)来管理主机所有的物理内存,而PAE Kernel的管理工作需要消耗一部分lowmem内存,通常为每16G就要消耗128MBlowmem。而我们的主机物理内存高至60G从而导致lowmem耗尽。

    解释:Physical Address ExtensionPAE,中文译名:物理地址扩展)技术最初是为了弥补32位地址在PC服务器应用上的不足而推出的。我们知道,传统的IA32架构只有32地址总线,只能让系统容纳不超过4GB的内存,这么大的内存,对于普通的桌面应用应该说是足够用了。可是,对于服务器应用来说,还是显得不足,因为服务器上可能承载了很多同时运行的应用。PAE技术将地址扩展到了36位,这样,系统就能够容纳2^36=64GB的内存。

     

    综上所述,建议如下解决办法,供参考:

    办法1:升级到64位系统,这是最好的方法,因为此时所有的内存都属low memory,如此时提示out of memory,则真的是low memory耗尽,真的out of memory

    办法2:拔内存,使主机物理内存将至8G左右,从而降低PAE Kernel消耗过多的Lowmem.

    办法3:升级系统内核到2.6以上版本(或者重新编译系统内核参数增加lowmem的值)---谨慎使用。

     

  • 相关阅读:
    转:因果图法
    转:测试用例设计方法--正交试验法详解
    转:Navicat Premium15破解教程
    转:Excel2016怎么样快速比较两列数据是否相同
    zabbix使用问题
    zabbix系列之七——安装后配置二Userparameters
    zabbix系列之八——安装后配置三Triggers
    zabbix系列之六——安装后配置二Items
    zabbix系列之五——安装后配置一
    zabbix系列之四——快速使用
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3317828.html
Copyright © 2020-2023  润新知