内核参数大致可以分为4类:
一、共享内存
共享内存是用于进程间通信的一种机制,共享内存可以由指定的多个进程共用,是一种系统资源。共享内存以段的形式分配,段有一个最大大小,可以分配的段数有限。
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 命令查看当前分配的共享内存段情况,如下:
- [root@localhost ~]# ipcs -lm
- ------ Shared Memory Limits --------
- max number of segments = 4096
- max seg size (kbytes) = 524288
- max total shared memory (kbytes) = 8388608
- min seg size (bytes) = 1
二、信号量
信号量是一种控制资源访问的方法。Oracle实例主要使用信号量来控制共享内存的访问。信号量基于PROCESSES初始化参数分配,每个Oracle实例启动时都要分配一个信号量集合,其中的信号量数量至少要等于PROCESSES初始化参数的值,如果不能分配足够的信号量,Oracle实例将不能启动。
通过sem内核参数来指定各个信号量参数值,如:
- kernel.sem = 250 32000 100 128
其中,等号右边的4个整数分别表示semmsl、semmns、semopm、semmni的值。
因为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推荐要修改的内参数及相应数值的一个总结:
- kernel.shmall=2097152
- kernel.shmmax=536870912(物理内存的一半)
- 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=262144
- net.core.wmem_default=262144
- net.core.rmem_max=262144
- net.core.wmem_max=262144