oracle 内核参数二

1.目的

我们在Linux系统上安装Oracle数据库的时候,其中有一步是调整操作系统的内核参数。Linux的内核参数跟Oracle有很大的关系,稍有设置不当就会引起Oracle数据库的性能下降甚至报错,但是很多刚入门的Oracle DBA并不清楚这些参数到底是怎么计算出来的。下面将这些内核参数一一解剖。

安装Oracle时Linux系统的核心参数如下:

1
2
3
4
5
6
7
8
9
10
11
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

2.fs.aio-max-nr参数

1
fs.aio-max-nr =  1048576

指的是可以同时拥有异步I/O请求的数目,Oracle推荐的值为1048576(1024×1024),也就是1024Kb个。可以通过以下命令来查看:

1
cat /proc/sys/fs/aio-max-nr

3.fs.file-max参数

1
fs.file-max =  6815744

该参数指的是:系统所有进程一共可以打开的文件数量。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,应该是这个值设置的太小了,需要增大。

无论何时,当一个文件句柄被应用程序请求时,Linux内核会动态的分配句柄。但是当应用程序释放之后,内核并不释放这些句柄。Linux内核采用循环利用的方式来代替释放。因此系统中已分配的句柄数的值可能很多,但实际上真实使用的句柄数很少。

可以通过以下命令来查看当前设置的可打开的文件句柄数:

1
cat /proc/sys/fs/file-max

这里的"fs.file-max = 6815744"其实是由"fs.file-max = 512 * PROCESSES"得到的。如果指定PROCESSES的值为128,即为"fs.file-max =512 *128"。

可以通过以下命令来查看当前文件句柄数的使用情况:

1
cat /proc/sys/fs/file-nr


在kernel 2.6之前的版本中,file-nr 中的值由三部分组成,分别为:

已经分配的文件句柄数

已经分配单没有使用的文件句柄数

#最大文件句柄数。

但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件句柄无一浪费的都已经被使用了。

4.kernel.shmall参数

1
kernel.shmall = 2097152

该参数是指:该参数用于配置系统一次能够使用的最大的共享页面数,该参数的值总是基于ceil(shmmax/PAGE_SIZE)。按照上面的计算方式,页面内存总大小可以达到8GB(2097152*4096 bytes (shmall*PAGE_SIZE))。

通常情况下,PAGE_SIZE 的大小为4096byte,除非使用了Big Pages 或Huge Pages ,对于超出8GB系统内存,如共享内存段(shmmax)的最大大小是16G,则所需要共享内存页数(shmall)为:

1
16GB /4KB =16777216KB /4KB =4194304(页)

对于32GB,64GB可以依上述方式类推。

可以通过以下方式来查看page size和SHMALL的值:

1
2
3
4
5
$ getconf PAGE_SIZE
4096
   
cat  /proc/sys/kernel/shmall
12097152

注意:如果该值设置的过小,会遇到以下错误(文档 ID 301830.1):

1
2
3
SQL> startup nomount
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device

在当前系统中可以使用的共享内存页的所有数量,其计算公式为当前Linux系统物理内存(free命令查看)/当前Linux系统的pagesizes(getconfig PAGE_SIZE)。对于Oracle 11g来说,如果当前操作系统的值大于上述列出的值,则无需修改,保留原值。

可以通过以下命令行,来查看

5.kernel.shmmax 参数

1
kernel.shmmax = 536870912

该参数定义了一个linux进程能分配虚拟地址空间的单个共享内存段的大小(字节为单位)。SHMMAX主要用于控制和分配sga,且使用3种不同的模式可供选择来分配sga size。

SHMMAX > SGASIZE : 分配一个单独的共享内存段给sga(首选方式)

SHMMAX < SGASIZE : 分配多个连续或不连续的共享内存段给sga

所有,我们应当设置为大于当前服务器上运行实例的最大的SGA的大小。其一般设置为物理内存的1/2,不过对于32-bit操作系统,通常设置为4GB-1byte,最大支持4GB,有很大的局限性。而64-bit,则可以设置为大于4GB。

而且,如该值设置太小或者小于最大sga的大小,则sga无法在一个单独的共享内存段hold住整个sga,而需要分配多个不同的共享内存段来完成。

英语好的同学可以直接读Oracle官方文档ID 567506.1

可以通过以下命令来查看参数文件值:

1
cat  /proc/sys/kernel/shmmax

5.kernel.shmmni参数

1
kernel.shmmni = 4096

该参数用于设置共享内存段的总个数。也就是说在内存中总共可以开辟多少个共享内存段。对于Oracle 11g来说,Oracle的对该参数的建议值至少为4096。

可以通过以下命令来查看shmmni参数文件的值

1
cat  /proc/sys/kernel/shmmni

6.kernel.sem参数

1
kernel.sem = 250 32000 100 128

信号量,有时候也被称为信号灯,是一个非负整数计数器。通常用来协调对资源的访问。(文档 ID 15566.1)。

信号量用于提供进程间的同步或者一个进程内的多个线程来共享资源,比如共享内存。其中信号计数会初始化为可用资源的数目。

当线程在资源增加时会增加计数,在删除资源时会减小计数,这些操作都以原子方式执行。如果信号计数变为零,则表明已无可用资源。

计数为零时,尝试减小信号的线程会被阻塞,直到计数大于零为止。

信号量的数量可以通过系统内核参数SEMMSL来设置。

6.1 参数SEMMSL 

该参数定义了每个信号集的最大信号数量。

Oracle 建议将SEMMSL 设置为Oracle参数文件(用于Linux系统中的所有数据库)中的最大PROCESS实例参数的设置值再加上10,而且不少于100。

6.2 参数SEMMNS

该参数控制整个 Linux 系统中信号(而不是信号集)的最大数。

Oracle 建议将SEMMNS 设置为:系统中所有数据库实例的PROCESSES参数设置值的总和,加上最大PROCESSES值的两倍,最后根据系统中Oracle数据库的数量,每个加10。

使用计算式来确定在Linux 系统中可以分配的信号的最大数量。取两者中较小的一个值:SEMMNS 或(SEMMSL * SEMMNI) 

在Oracle 10g和Oracle 11g中,该值被建议设置为SEMMSL * SEMMNI (250*128=32000)

6.3 参数SEMOPM

该内核参数用于控制一次semop系统调用可以执行的信号操作的数量semopm。semop 系统调用(函数)提供了利用一个semop 。系统调用完成多项信号操作的功能。一个信号集能够拥有每个信号集中最大数量的SEMMSL 信号,因此建议设置SEMOPM 等于SEMMSL 。Oracle 建议将SEMOPM 的值设置为不少于100

6.4 参数SEMMNI

该参数定义整个Linux系统中信号集的最大数量。Oracle 建议将SEMMNI 的值设置为至少为128 。

简要描述这四个参数

1
2
3
4
SEMMSL: 每个信号集的最大信号数量
SEMMNS: 系统信号量(非信号集)最大数量
SEMOPM: 每次semop系统调用可执行的信号操作数
SEMMNI:系统信号量集最大数量

信号量设置示例:

SEMMSL应该设置为服务器中实例中具有最大的PROCESSES参数+10,例如,当最大的PROCESSES参数为5000时,SEMMSL应设置为5010。

SEMMNS参数应设置为SEMMSL*SEMMNI,接上例SEMMSL为5010,SEMMNI的值一般为128,则SEMMNS参数应为(5010*128)=641280。

SEMOPM参数应设置与SEMMSL参数相同,接上例此处应设置为5010

因此对于信号量建议做如下设置

1
kernel.sem= "5010 641280 5010 128"

7.网络参数描述

1
2
3
4
5
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

在Linux下,Oracle使用UDP作为缺省协议用于进程之间的交互以及实例间cache fusion buffer传输。Oracle 建议缺省的最大发送以及接收缓冲的大小为256KB。接收缓冲区用于TCP/UDP传输时hold住应用程序接收到的数据直到被读取。

1
2
3
4
net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)。
net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值