内核参数大致可以分为4类:

  1. 共享内存(shared memory)
  2. 信号量(semaphores)
  3. 网络(network)
  4. 打开文件(open files)

一、共享内存

  共享内存是用于进程间通信的一种机制,共享内存可以由指定的多个进程共用,是一种系统资源。共享内存以段的形式分配,段有一个最大大小,可以分配的段数有限。

  Oracle实例启动时,执行shmget()系统调用为SGA分配内存,SGA由Oracle的多个进程共享,这部分内存会以共享内存的形式分配。如果共享内存参数设置错误,会使得Oracle不能为实例分配足够的SGA,从而导致实例启动失败。

  涉及SGA大小及其内部各部分内存区域大小的两个重要的初始化参数是sga_target及sga_max_size(注意:这里的初始化参数是指Oracle实例的初始化参数,而不是操作系统的内核参数)。sga_max_size指定在数据库运行过程中,SGA可以达到的最大大小;sga_target指定当前SGA的大小,如果其值非0,也表示由Oracle自动分配SGA中的各个内存区域大小。

下面是具体的共享内存内核参数及其含义。

kernel.shmmax:每个内存段的最大大小,以字节为单位,是设置共享内存时最重要的一个内核参数,其值应该大于或等于sga_max_size初始化参数的大小,否则SGA会由多个内存段构成,导致效率降低,另外这个参数还要小于物理内存的1/2或2GB。默认情况下,在32位x86系统中,Oracle SGA最大不能超过1.7GB。

kernel.shmmni:系统可分配的共享内存段最大数量。其值也是在系统中可以启动的Oracl实例的最大数量,其默认值为4096,显然在生产环境下,一个服务器上同时启动的实例个数很难达到这个数量,为了正常运行Oracle,此值不需要修改,保留其默认值即可。

kernel.shmall:指定在任意时刻,系统中可以分配的所有共享内存段的总和的最大值(shmmax指定一个共享内存段的最大大小),以数据项(page)为单位。其值应该设置为不小于shmmax/page_size。在32位x86系统中,shmall的默认值为2097152,数据页大小默认为4KB,这样,在32位x86系统中可以分配的共享内存最大可以为8GB。在Itanium系统,shmall的默认值为524288,数据页大小默认为16KB,通过简单计算可以得知共享内存的部和最大也是8GB。如果服务器上运行的所有实例的SGA总和不超过8GB,则可以保留shmall的默认值。

可以使用ipcs -lm 命令查看当前分配的共享内存段情况,如下:

 
  
  1. [root@localhost ~]# ipcs -lm 
  2.  
  3. ------ Shared Memory Limits -------- 
  4. max number of segments = 4096 
  5. max seg size (kbytes) = 524288 
  6. max total shared memory (kbytes) = 8388608 
  7. min seg size (bytes) = 1 

二、信号量

信号量是一种控制资源访问的方法。Oracle实例主要使用信号量来控制共享内存的访问。信号量基于PROCESSES初始化参数分配,每个Oracle实例启动时都要分配一个信号量集合,其中的信号量数量至少要等于PROCESSES初始化参数的值,如果不能分配足够的信号量,Oracle实例将不能启动。

通过sem内核参数来指定各个信号量参数值,如:

 
  
  1. kernel.sem = 250 32000 100 128 

其中,等号右边的4个整数分别表示semmsl、semmns、semopm、semmni的值。

  1. semmsl用于指定第个信号量集合中的最大信号量个数,其值或者取其最小值100,或者为所有数据库中最大的PROCESSES参数加10,选取其较大者;
  2. semmns用于指定整个系统范围内信号量总数的最大值。默认值为32000,一般保留此默认值即可。
  3. semopm用于指定每个semop()系统调用可以设置的信号量操作的最大数量,一个semop()系统调用可以设置多个信号量,推荐取值为100;
  4. semmni用于指定信号量集合的最大数量,最小取值为100,Oracle推荐此参数取值为128。

    因为semmsl指定了每个信号量集合中的最大信号量个数,而semmni指定了信号量集合的最大值,最后,系统能够分配的信号量个数取决于semmns与semmni*semmsl(semmns与semmsl的乘积)的较小者。

 

三、打开文件

    fs.file-max用于指定每个进程可以打开的最大文件数量。Oracle数据库文件在数据库运行期间一直要保持打开状态。应该设置为数据库中的数据文件个数的最大值,推荐设置为一个较大的数值,如65536。

四、网络

net.ipv4.ip_local_port_range:在数据库专用服务器进程启动时,会被分配一个IP端口,用来与用户进程通信,默认情况下,分配给非root用户进程的端口范围为32768~61000,对于用户数很多的数据库,需要修改这个默认值,一般可以设置为1024~65000,小于1024的端口保留给root用户启动的进程使用。

另外还有两组参数用于设置socket数据发送及接收缓冲区的大小。

第一组为net.ipv4.txp_rmem及net.ipv4.tcp_wmem。

net.ipv4.tcp_rmem用于指定socket数据发送缓冲区的最小值、默认值及最大值。

net.ipv4.tcp_wmem用于指定socket数据接收缓冲区的最小值、默认值及最大值。

这两个内核参数的实际取值会在系统运行时根据其设置自动调整。

第二组为net.core.rmem_default、net.core.wmem_default、net.core.rmem_max、net.core.wmem_max。这4个内核参数用于设置socket数据发送缓冲区及接收缓冲区的默认大小与最大大小。

Oracle推荐设置为262144,否则在安装Oracle软件时,会发出警告信息。

在两组内核参数中,默认值的取值以第一组为准,最大值的取值以第二组为准。所以,要注意,第一组内核参数的默认值要设置为Oracle推荐的262144,在Oracle软件安装完毕后,应该修改第二组参数中的最大值为524288,而安装时,为了避免警告信息,可心设置为262144。

为了Oracle数据库正常运行,下面是Oracle推荐要修改的内参数及相应数值的一个总结:

 
  
  1. kernel.shmall=2097152 
  2. kernel.shmmax=536870912(物理内存的一半) 
  3. kernel.shmmni=4096 
  4. kernel.sem=250 32000 100 128 
  5. fs.file-max=65536 
  6. net.ipv4.ip_local_port_range=1024 65000 
  7. net.core.rmem_default=262144 
  8. net.core.wmem_default=262144 
  9. net.core.rmem_max=262144 
  10. net.core.wmem_max=262144