Oracle内存管理(之七)

【深入解析--eygle】 学习笔记

 

1.5 Oracle的内存分配

 

在为Oracle规划内存使用时,我们必须清楚,如果Oracle耗用的内存过高,甚至超过了系统的物理内存,那么系统的性能就会受到严重的影响,当系统执行任务时,如果没有足够的内存,那么系统就会进行分页或交换,以完成当前活动事务。

 

当系统执行分页时,会将当前没有使用的信息从内存转移到硬盘上,这样就可以为当前需要内存的程序分配内存。如果频繁发生分页,系统性能就会严重降低,从而导致很多程序的执行时间变长。

 

当系统执行交换时,会将某些进程所分配的不活跃内存页(根据LRU算法)从内存转移到硬盘上,这样另一个活动进程就可以得到所需要的内存。交换基于系统循环时间。如果交换太过频繁,系统甚至会出现当机。

 

1.5.1 示例1,SGA与swap

 

描述:用户报告,服务器启动一段时间以后,无法建立数据库连接。重新启动几分钟以后,再次无法连接。

 

操作系统:REHL 5.8,系统无法正常使用.

 

1. 登陆数据库,检查系统进程

 

登陆系统,检查系统进程,发现后台进程正常,有一定量的用户连接:

 

[root@felix kernel]# ps  -ef | grep oraoracle 25269 25258 0 13:58:36 pts/30:00 grep ora

oracle 25267 1 1 13:58:34 ? 0:00 oracleFELIX(LOCAL=NO)

oracle 25193 1 0 13:57:03 ? 0:01 oracleFELIX(LOCAL=NO)

oracle 25209 1 0 13:57:09 ? 0:00 oracleFELIX(LOCAL=NO)

oracle 25244 1 1 13:58:23 ? 0:00 oracleFELIX(LOCAL=NO)

oracle 25218 1 0 13:57:23 ? 0:00 oracleFELIX(LOCAL=NO)

...............

oracle 25149 1 0 13:56:41 ? 0:01 ora_lgwr_FELIX

oracle 25153 1 0 13:56:42 ? 0:01 ora_smon_FELIX

oracle 25155 1 0 13:56:42 ? 0:00 ora_reco_FELIX

oracle 25151 1 0 13:56:41 ? 0:00 ora_ckpt_FELIX

oracle 25145 1 0 13:56:41 ? 0:00 ora_dbw0_FELIX

oracle 25143 1 0 13:56:41 ? 0:00 ora_pmon_FELIX

 

 

2. 检查警报日志文件

 

发现如下大量提示信息:

Tue Mar 23 13:40:45 2004

skgpspawn failed:category = 27142, depinfo = 12,op = fork, loc = skgpspawn3

skgpspawn failed:category = 27142, depinfo = 12,op = fork, loc = skgpspawn3

 

该提示说明系统无法fork新的数据库进程,数据库无法spawn a new session:

而且这里  "skgpspawn failed:category = 27142"实际上应该是Oracle的错误号,我们可以通过Oracle的手册查询到这个错误的具体内容,在Unix/Linux上我们可以通过oerr工具获得相关的信息:

 

[oracle@felix ~]$ oerr ora 27142

27142, 0000, "could not create newprocess"

// *Cause: OS system call

// *Action: check errno and if possible increasethe number of processes

[oracle@felix ~]$

 

3. 尝试连接数据库

 

当再次尝试连接数据库时,收到如下错误信息,无法连接数据库:

$ sqlplus "/ assysdba"

SQL*Plus: Release9.2.0.3.0 - Production on 星期二 3月 23 14:14:06 2004

Copyright (c) 1982,2002, Oracle Corporation. All rights reserved.

ERROR:

ORA-12540: TNS: 超出内部限制

请输入用户名:

ERROR:

ORA-12540: TNS: 超出内部限制

请输入用户名:

ERROR:

ORA-12540: TNS: 超出内部限制

SP2-0157: 在3次尝试之后无法 CONNECT 到ORACLE, 退出 SQL*Plus

 

内部限制超过,通常说明某些系统资源不足.

 

4. 检查系统日志

 

检查系统日志信息,发现大量失败的su操作,有swap区不足的报告:

用命令demsg检查系统日志:

 

[oracle@felix ~]$ dmesg

Mar 23 13:46:26 wapplatform genunix: [ID 470503kern.warning] WARNING: Sorry, no swap space

to grow stack for pid 24888

(sqlplus)

Mar 23 13:54:08 wapplatform genunix: [ID 470503kern.warning] WARNING: Sorry, no swap space

to grow stack for pid 25036 (su)

现在基本可以判断是交换区的问题,当然和OracleSGA设置有关。

 

5. 检查系统内存及交换区使用

 

通过TOP工具检查系统内存及Swap使用情况:

 

Memory:1024M  real, 34M free, 752M swap in use,10M swap free

 

发现物理内存仅为1G,free部分为34M,交换区使用了752M,仅Swap Free部分仅余10M 。由此我们知道系统内存严重不足,Swap区不足。

 

6. 检查数据库的SGA设置

 

发现为600M,SGA设置过大。

 

7. 调整内容

 

第一步调整,减小SGA,为系统保留足够的内存。

 

第二步调整,为系统增加swap区。

如何增加swap分区大小:

 

1.   首先用命令free查看系统内 Swap 分区大小。

 

[oracle@felix ~]$ free -m

            total       used       free    shared    buffers    cached

Mem:          996        890        106          0        104        442

-/+ buffers/cache:        342        654

Swap:        2047          5       2042

[oracle@felix ~]$

 

 

2.      创建一个 Swap 文件

 

[root@felix ~]# mkdir swap

[root@felix ~]# cd swap

 

 

[root@felix swap]# sudo  ddif=/dev/zero of=swapfile1 bs=1024count=100000

100000+0 records in

100000+0 records out

102400000 bytes (102 MB)copied, 0.887794 s, 115MB/s

 

出现下列提示,上面命令中的 count 即代表swap文件大小。

 

 

把生成的文件转换成 Swap 文件:

 

[root@felix swap]# sudo swaponswapfile1

 

 

4,激活swap文件:

 

[root@felix swap]# free -m

            total       used       free    shared    buffers    cached

Mem:          996        900         96          0         44        510

-/+ buffers/cache:        345        651

Swap:        2194          6       2188

 

 

总数:分配了 623160k 字节 + 保留 162704k = 已使用785864k,1010936k 可用至此系统恢复正常,问题解决

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值