【深入解析--eygle】 学习笔记
在为Oracle规划内存使用时,我们必须清楚,如果Oracle耗用的内存过高,甚至超过了系统的物理内存,那么系统的性能就会受到严重的影响,当系统执行任务时,如果没有足够的内存,那么系统就会进行分页或交换,以完成当前活动事务。
当系统执行分页时,会将当前没有使用的信息从内存转移到硬盘上,这样就可以为当前需要内存的程序分配内存。如果频繁发生分页,系统性能就会严重降低,从而导致很多程序的执行时间变长。
当系统执行交换时,会将某些进程所分配的不活跃内存页(根据LRU算法)从内存转移到硬盘上,这样另一个活动进程就可以得到所需要的内存。交换基于系统循环时间。如果交换太过频繁,系统甚至会出现当机。
描述:用户报告,服务器启动一段时间以后,无法建立数据库连接。重新启动几分钟以后,再次无法连接。
操作系统: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 可用至此系统恢复正常,问题解决