ORA-27102: out of memory

调节SGA大小遇到ORA-27102: out of memory

服务器配置:16个逻辑CPU,32G内存

 

解决方法:

修改 /etc/sysctl.conf 中的 kernel.shmall 4194304 ,因为想要SGA=8G所以设置内存不能按8G设置了,所以我选择了设置成16G内存。

 

一般设置方法及原理:

kernel.shmall为物理内存除以pagesize;

kernel.shmmax为物理内存的一半;

获取pagesize

[root@rac1-21 ~]# getconf PAGESIZE

4096

8G/4096=2097152            --内存8G          (设置为8G的时候,SGA不能设置为8G

16G/4096=4194304         --内存16G       (设置为16G的时候,SGA可以设置为8G

32G/4096=8388608         --内存32G       (设置为32G的时候,没有尝试)

 

下面为我的操作过程,及相关原理整理

 

SQL> show parameter sga

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 3424M

sga_target                           big integer 2336M

SQL> show parameter pga

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

pga_aggregate_target                 big integer 1330843K

SQL> show parameter session

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

java_max_sessionspace_size           integer     0

java_soft_sessionspace_limit         integer     0

license_max_sessions                 integer     0

license_sessions_warning             integer     0

logmnr_max_persistent_sessions       integer     1

session_cached_cursors               integer     20

session_max_open_files               integer     10

sessions                             integer     313

shared_server_sessions               integer

SQL> show parameter process

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

aq_tm_processes                      integer     0

db_writer_processes                  integer     2

gcs_server_processes                 integer     0

job_queue_processes                  integer     10

log_archive_max_processes            integer     2

processes                            integer     280

SQL> show parameter pfile  

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      /oracle/product/10.2.0/dbs/spf

                                                 ileorcl.ora

修改之前,先做了备份。(备份高于一切,盖老师的话铭记在心)

 

SQL> create pfile from spfile;

 

File created.

 

SQL> alter system set sga_max_size=8G scope=spfile;

 

System altered.

 

SQL> alter system set  sga_target=5G scope=spfile;

 

System altered.

 

SQL> shut immedaite   

SP2-0717: illegal SHUTDOWN option

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORA-27102: out of memory

Linux-x86_64 Error: 28: No space left on device

 

解决方法:修改/etc/sysctl.conf 文件修改kernel.shmall=4194304

 

[root@mailoracle ~]# sysctl -p

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

kernel.shmall = 4194304

kernel.shmmax = 16147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024 65000

net.core.rmem_default = 1048576

 

SQL> startup

ORACLE instance started.

 

Total System Global Area 8589934592 bytes

Fixed Size                  2034520 bytes

Variable Size            4160750760 bytes

Database Buffers         4412407808 bytes

Redo Buffers               14741504 bytes

Database mounted.

Database opened.

SQL> show parameter sga

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 8G

sga_target                           big integer 5G

SQL> show parameter pga

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

pga_aggregate_target                 big integer 1330843K

SQL> show parameter pga_max

 

解决问题的原理:

linux下安装Oracle对内核的要求参数说明

kernel.shmall为物理内存除以pagesize;

kernel.shmmax为物理内存的一半;

fs.file-max512 乘以 processes (128process则为 65536);

net.ipv4.ip_local_port_range/net.core.rmem_default/net.core.rmem_max三个参数设置和官方文档不一样, 这是根据metalink 343431.1 最新要求更改的;

net.ipv4.tcp_rmem/net.ipv4.tcp_wmem两个参数一般情况下无需设置, 除非是在Dataguard/Streams等需很多网络传输情况下;

 

# vi /etc/sysctl.conf

kernel.shmall = 4194304

kernel.shmmax = 16147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 9000 65000

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 262144

 

修改以后让参数生效:

# /sbin/sysctl -p

 

Shmmax 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,

shmmax 设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会

导致需要创建多个共享内存段,这样可能导致系统性能的下降。

kernel.shmall 参数是控制共享内存页数。Linux 共享内存页大小为4KB, 共享内

存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,那么需

要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页),也就是64Bit 系统下

16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置2097152

的两倍)。这时可以将shmmax 参数调整到 16G 了,同时可以修改SGA_MAX_SIZE

SGA_TARGET 12G(您想设置的SGA 最大大小,当然也可以是2G~14G 等,还要协调PGA

参数及OS 等其他内存使用,不能设置太满,比如16G)。

kernel.shmmni ----

shmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,

shmmni, shmmin 表示内存段最小大小)。shmmni 缺省值 4096 ,一般肯定是够用了。

获取pagesize

[root@rac1-21 ~]# getconf PAGESIZE

4096

如果你的物理内存为8G,可以把kernel.shmall=2097152

8G/4096=2097152            --内存8G          (设置为8G的时候,SGA不能设置为8G

16G/4096=4194304         --内存16G       (设置为16G的时候,SGA可以设置为8G

32G/4096=8388608         --内存32G       (设置为32G的时候,没有尝试)   

你可能感兴趣的:(ORA-27102: out of memory)