转载地址:http://www.cnblogs.com/cangos/archive/2011/12/28/2304186.html
Linux内核参数(如kernel.shmmax)及Oracle相关参数调整(如SGA_MAX_SIZE)
在Linux 上安装设置Oracle 或在更换或升级硬件的时需要配置Linux 系统的核心参数, 然后才调整Oracle系统参数。具体这些参数的实质意义是什么,如何合理调整?本文简要介绍参数的意义。注意:以下一些测试只适用于Linux,且为64Bit系统,32Bit的Linux系统可能不一样 。 Linux 系统下的核心参数:
#cat sysctl.conf或/proc/sys/kernel查看。
kernel.shmall = 2097152
kernel.shmmax =8405194752
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
fs.file-max = 65536
net.ipv4.ip_local_port_range= 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default =262144
net.core.wmem_max = 262144
小技巧: 修改/etc/sysctl.conf 文件之后立刻生效命令# sysctl -p
Linux 下核心参数调整
kernel.shmmax
shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应足够大,能在一个共享内存段下容纳下整个的SGA,设置的过低可能会导致需要创建多个共享内存段,可能导致系统性能的下降 。
Oralce建议一个大的共享内存段能容纳整个SGA,这样在任何时候都不会有性能下降的隐患。
Oracle安装文档建议,32位Linux设置shmmax 为32位最大限制值(settingshmmax to the 32-bit number limit),即4G,所以1-4G 的物理内存,可以直接设置shmmax 为最大物理内存即可,SGA 肯定在一个共享内存段中,32位Linux 物理内存大于4G 的设置为4G 即可
设置shmmax>=SGA(32位系统是否支持到1.7G 以上SGA 需要注意) 。如果是64位Linux 系统,shmmax 设置为大于SGA_MAX_SIZE即可。
Ipcs -sa 可以看到共享内存段个数
kernel.shmall
kernel.shmall 参数是控制共享内存页数 。Linux共享内存页大小为4KB, 共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,需要共享内存页数是16GB/4KB=16777216KB/4KB=4194304(页),即64位系统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 足够。
kernel.sem
kernel.sem = 250 32000 100 128
上面的4个数据分别对应:SEMMSL、SEMMNS、SEMOPM、SEMMNI这四个核心参数,具体含义和配置如下。
SEMMSL :用于控制每个信号集的最大信号数量。
Oracle 建议将 SEMMSL 设置为 init.ora 文件(用于 Linux 系统中的所有数据库)中的最大 PROCESS 实例参数的设置值再加上 10 。此外, Oracle 建议将 SEMMSL 的值设置为不少于 100 。
SEMMNS:用于控制整个 Linux 系统中信号(而不是信号集)的最大数。
Oracle 建议将 SEMMNS 设置为:系统中每个数据库的 PROCESSES 实例参数设置值的总和,加上最大 PROCESSES 值的两倍,最后根据系统中 Oracle 数据库的数量,每个加 10 。 使用以下计算式来确定在 Linux 系统中可以分配的信号的最大数量。它将是以下两者中较小的一个值:SEMMNS 或 (SEMMSL * SEMMNI)
SEMOPM: 内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量。semop 系统调用(函数)提供了利用一个 semop 系统调用完成多项信号操作的功能。一个信号集能够拥有每个信号集中最大数量的SEMMSL 信号,因此建议设置 SEMOPM 等于SEMMSL 。
Oracle 建议将 SEMOPM 的值设置为不少于 100 。
SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量。
Oracle 建议将 SEMMNI 的值设置为不少于 100 。
---------------------------------------ORACLE_SGA-----------------------------------------
SGA_MAX_SZIE 为实例允许使用的sga上限,一个静态参数,是不能动态修改的。
SGA_TARGET 为10g推出的sga自动管理参数,动态参数,可以动态修改
sga_max_size 与 SGA 各组件大小的关系
设置的sga_max_size 小于实际的SGA中各个pool的尺寸总和的大小,sga_max_size的值会被oracle自动以实际的SGA的总尺寸代替。如果不设置sga_max_size,oracle会自动的以实际的SGA的总尺寸来设置sga_max_size值。
设置sga_max_size 的值为大于SGA 中各个pool 的尺寸总和的值:但sga_max_size的值相对于所有可用的物理内存来说,是一个合理的值。sga_max_size实际的值和pfile中的sga_max_size指定的值是一样的。
在Oracle10g 中引入了一个非常重要的参数:SGA_TARGET,自动共享内存管理(AutomaticShared Memory Management ASMM),控制这一特性的,是参数SGA_TARGE。设置该参数后,就无需为每个内存区来指定大小。SGA_TARGET指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,无需人为指定。Oracle可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,且控制他们之和在SGA_TARGET指定的值之内。一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。
Oracle10g下,SGA_MAX_SIZE表示SGA 的大小的上限值,而SGA_TARGET是SGA的所有组件的大小的最大值之和,即当SGA_TARGET<SGA_MAX_SIZE 的时候,oracle就会忽略SGA_MAX_SIZE的值,SGA_TARGET也就成了SGA的在此实例中的上限制,它能动态改变大小,但是不能够大于SGA_MAX_SIZE的值。
有人做过试验,在某些版本中,当SGA_TARGET<SGA_MAX_SIZE 时,实例重启以后SGA_MAX_SIZE就变成SGA_TARGET的大小。
SGA_TARGET 带来一个重要的好处就是,能使SGA的利用率达到最佳,从而节省内存成本。因为ASMM启动后,Oracle会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。
参考文章:http://www.cnblogs.com/cabin/archive/2010/12/30/1922200.htmls