cangos

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

posted on 2011-12-28 00:21  cangos  阅读(1759)  评论(0编辑  收藏  举报