调节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-max为512 乘以 processes (如128个process则为 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的时候,没有尝试)