Lock_sga和pre_page_sga参数详解(一)

2014-11-24 12:27:28 · 作者: · 浏览: 1
Lock_sga和pre_page_sga参数详解
Lock_sga 和pre_page_sga,是两个平时用的不算太多的参数,但是这两个参数平时在优化的时候可能给你带来比较乐观的性能提升,通过修改lock_sga和pre_pga_sga参数可以保证SGA不被换出到swap,进而而已提高SGA的使用效率。
当lock_sga参数的值修改设置为true的时候,可以保证整个sga被锁定在物理内存中,这样可以防止sga被换出到swap中;当然理当需要把pre_page_sga参数也设置为true,只有这样才能保证在 数据库启动之初将整个sga读取到物理内存,而不走交换内存,从而有效的提高数据库效率,当然会增加数据库的启动时间。
调整过程如下:
1、 查看lock_sga和pre_page_sga参数的默认值:
[sql] 
SQL> show parameter lock_sga  
   
NAME                                 TYPE        VALUE  
------------------------------------ -----------------------------------------  
lock_sga                             boolean     FALSE  
SQL> show parameter pre_page_sga  
   
NAME                                 TYPE        VALUE  
------------------------------------ -----------------------------------------  
pre_page_sga                         boolean     FALSE  

2、 修改这两个参数,因为其是静态参数,故在添加scop=spfile,记录到参数文件,下次启动生效:
[sql] 
SQL> alter system set lock_sga = truescope=spfile;  
   
System altered.  
   
Elapsed: 00:00:00.03  
SQL> alter system set pre_page_sga = truescope=spfile;  
   
System altered.  
   
Elapsed: 00:00:00.02  
SQL>  

3、 重启数据库
[html] 
SQL> startup  
   
ORA-27102: out of memory  
   
Linux-x86_64 Error: 12: Cannot allocate memory  
SQL>
发现数据库现在起不来了,想想看,这是什么原因导致启动失败呢,其实很简单,Linux操作系统对每一个任务在内存中能锁住的值做了限制,只需手工修改即可。
4、 处理解决ora-27102及Linux-x86_64 Error:12问题:
[sql] 
[oracle@woo ~]$ ulimit -a  
core file size          (blocks, -c) 0  
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 0  
file size               (blocks, -f) unlimited  
pending signals                 (-i) 32768  
max locked memory       (kbytes, -l) 32  
max memory size         (kbytes, -m) unlimited  
open files                      (-n) 65536  
pipe size           (512 bytes, -p) 8  
POSIX message queues     (bytes, -q) 819200  
real-time priority              (-r) 0  
stack size              (kbytes, -s) 10240  
cpu time               (seconds, -t) unlimited  
max user processes              (-u) 16384  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited  

从上面信息我们可以看到,一个任务可以锁住的物理内存最大值为32KB,这个值根本没法满足我们sga的大小。那么我们需要对该值进行修改,使其适应及满足相关要求。
5、 修改有两种方法:
5.1、临时生效可以切换到root用户通过如下命令,进行修改:
[sql] 
[root@woo ~]# ulimit -l  
32  
[root@woo ~]# ulimit -l unlimited  
[root@woo ~]# ulimit -a  
core file size          (blocks, -c) 0  
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 0  
file size               (blocks, -f) unlimited  
pending signals                 (-i) 32768  
max locked memory       (kbytes, -l) unlimited  
max memory size         (kbytes, -m) unlimited  
open files                      (-n) 1024  
pipe size           (512 bytes, -p) 8  
POSIX message queues     (bytes, -q) 819200  
real-time priority              (-r) 0  
stack size              (kbytes, -s) 10240  
cpu time               (seconds, -t) unlimited  
max user processes              (-u) 32768  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited  

5.2 让其永久生效的方法:
[sql] 
[root@woo ~]# vi /etc/security/limits.conf   最底部添加如下两行  
oracle         soft    memlock         unlimited  
oracle         hard    memlock        unlimited  

6、 修改系统限制成功后,启动数据库,可以正常Open,但是时间更长了。
[sql] 
SQL> startup  
ORACLE instance started.  
   
Total System Global Area  6081740870 bytes  
Fixed Size                  1220844 bytes  
Variable Size             197136148 bytes  
Database Buffers          406847488 bytes  
Redo Buffers                2969600 bytes  
Database mounted.  
Database opened.  
SQL>  

7、 参考:
关于locak_sga 及 pre_page_sga 参数在ORACLE10gR2官方文档中的介绍:
LOCK_SGA
Property
Description
Parameter type
Boolean
Default value
false
Modifiable
No
Range of values
true | false
Ba