1.1 参数说明
Oracle数据库在linux系统上的安装过程中涉及到设置linux内核参数,这些内核参数究竟代表什么含义?如何调整这些参数?
#可以使用的共享内存的总量,单位:页。
kernel.shmall = 2097152
#最大单个共享内存段大小。取物理内存大小的一半,单位为字节。
kernel.shmmax = 2147483648
#整个系统共享内存段的最大数目。
kernel.shmmni = 4096
#每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数。
# semaphores: semmsl,semmns,semopm,semmni
kernel.sem = 250 32000 100 128
# 系统中所允许的文件句柄最大数目。
fs.file-max = 65536
#应用程序可使用的IPv4端口范围。
net.ipv4.ip_local_port_range = 1024 65000
#套接字接收缓冲区大小的缺省值。
net.core.rmem_default = 1048576
#套接字接收缓冲区大小的最大值。
net.core.rmem_max = 1048576
#套接字发送缓冲区大小的缺省值。
net.core.wmem_default = 262144
#套接字发送缓冲区大小的最大值。
net.core.wmem_max = 262144
共享内存:
可以通过ipcs -lm命令查看目前系统共享内存的参数限制:
# ipcs -lm
—— Shared Memory Limits ——–
max number of segments = 4096
max seg size (kbytes) = 1048576
max total shared memory (pages) = 2097152
min seg size (bytes) = 1
这里涉及到3个于共享内存相关的参数:SHMMAX,SHMMNI,SHMALL
SHMMAX
含义:单个共享内存段最大字节数
设置:比SGA略大
查看:cat /proc/sys/kernel/shmmax
$ cat /proc/sys/kernel/shmmax
1073741824
修改:
sysctl -w kernel.shmmax=1073741824
echo “kernel.shmmax=1073741824″ >> /etc/sysctl.conf
SHMMNI
含义:共享内存段最大个数
设置:至少4096
查看:cat /proc/sys/kernel/shmmni
# cat /proc/sys/kernel/shmmni
4096
修改:
# sysctl -w kernel.shmmni=4096
# echo “kernel.shmmni=4096″ >> /etc/sysctl.conf
SHMALL
含义:系统中共享内存页总数
设置:至少ceil(shmmax/PAGE_SIZE);ORACLE DOC 默认值:2097152*4096=8GB
查看:cat /proc/sys/kernel/shmall
$ getconf PAGE_SIZE
4096
# cat /proc/sys/kernel/shmall
2097152
修改:
# sysctl -w kernel.shmall=2097152
# echo “kernel.shmall=2097152″ >> /etc/sysctl.conf
信号量:
当前系统信号量限制:
oracle@lab-rd-01:~$ ipcs -ls
—— Semaphore Limits ——–
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
SEMMSL
含义:每个信号量set中信号量最大个数
设置:最小250;对于processes参数设置较大的系统建议设置为processes+10
SEMMNI
含义:linux系统信号量set最大个数
设置:最少128
SEMMNS
含义:linux系统中信号量最大个数
设置:至少32000;SEMMSL * SEMMNI
SEMOPM
含义:semop系统调用允许的信号量最大个数
设置:至少100;或者等于SEMMSL
查看信号量设置:cat /proc/sys/kernel/sem
order:SEMMSL, SEMMNS, SEMOPM, SEMMNI
oracle@lab-rd-01:~$ cat /proc/sys/kernel/sem
250 32000 100 128
修改:
sysctl -w kernel.sem=”250 32000 100 128″
echo “kernel.sem=250 32000 100 128″ >> /etc/sysctl.conf
ORACLE提供了sysresv工具管理共享内存以及信号量,操作系统级别可以通过ipcs管理。
1.1.1 kernel.shmmax 参数说明
shmmax 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,
shmmax 设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降 。
shmmax 仅仅是在共享内存段被创建的时候用来比较的一个数字,当共享内存段被一个进程(Process)创建,操作系统检查是否被要求的共享内存段的值大于
shmmax 的值 ,如果是,那么将会抛出一个错误。这个时候系统会创建另外的一个或多个共享内存段满足进程的需求 。一般来说,共享内存段个数和系统性能没有太直接的关系,也不会对性能产生太大的影响。
在实例启动以及Server Process 创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响),但是其他时候都不会有影响。这意味着如果你的程序不是经常Create Processes(以及Destroy Them),性能方面就不是考虑的问题。
Oralce 建议 SHMMAX > SGA(SGA_MAX_SIZE),这样在任何时候都不会有甚至轻微的性能下降的隐患。
我们可以使用Ipcs -sa 查看看到共享内存段个数
1.1.2 kernel.
shmall
参数说明
shmall
参数是控制共享内存页数,该参数大小为物理内存除以pagesize。
查看os系统页的大小
# getconf PAGESIZE
4096
这里显示的pagesize 是4k,假设一个共享内存段的最大大小是16G,那么需要共享内存页数是(单位:页):16GB/4KB=16777216KB/4KB=4194304
也就是64Bit 系统下16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求,几乎是原来设置2097152的两倍。
1.1.3 kernel.shmmni 参数说明
shmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,是
shmmni, shmmin 表示内存段最小大小 ),shmmni 缺省值 4096 ,一般肯定是够用了。
1.1.4 fs.file-max 参数说明
fs.file-max为512 乘以 processes,
如128个process,则file-max=512*128=65536。
1.1.5 Oracle 下需要做调整的参数
在Oracle 10g 中引入了一个非常重要的参数:SGA_TARGET,这也是Oracle 10g 的一个新特性。自动共享内存管理(Automatic Shared Memory Management ASMM),控制这一特性的,就仅仅是这个参数SGA_TARGE。设置这个参数后,你就不需要为每个内存区来指定大小了。SGA_TARGET 指定了SGA 可以使用的最大内存大小,而SGA 中各个内存的大小由Oracle 自行控制,不需要人为指定。
Oracle 可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET 指定的值之内。一旦给SGA_TARGET 指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM
特性。
10g 下设置 SGA_TARGET 之后启动ASSM 特性之后, 只有以下的这些区的内存大小动态共享起来:
* Buffer cache (DB_CACHE_SIZE)
* Shared pool (SHARED_POOL_SIZE)
* Large pool (LARGE_POOL_SIZE)
* Java pool (JAVA_POOL_SIZE)
* Streams pool (STREAMS_POOL_SIZE)
而SGA 中的其他区域的内存大小仍然是固定不共享的。它的含义和SGA_MAX_SIZE 的一样,也表示SGA 最大的大小,于是它也就有了一个限制,那就是它的大小不能大于SGA_MAX_SIZE 的大小。
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 的大小了。
在11g 中,这个SGA_TARGET 只能设置是等于SGA_MAX_SIZE 的大小了,设置比它小,oracle 会自动帮你调整,设置比它大,那还是出错。现在可以自己想想,oracle对SGA_TARGET 的大小处理在往正确的简单的方向前进中。
SGA_TARGET 带来一个重要的好处就是,能使SGA 的利用率达到最佳,从而节省内存成本。因为ASMM 启动后,Oracle 会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。
1.2 内核参数设置
我们可以使用Ipcs -sa 查看看到共享内存段个数,在文件/etc/sysctl.conf末尾添加如下内容:
kernel.shmall =2097152
kernel.shmmax =2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000100 128
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
内核参数生效
# sysctl -p
相关解释
fs.file-max为512 乘以 processes (如128个process则为 65536);
net.ipv4.tcp_rmem/net.ipv4.tcp_wmem两个参数一般情况下无需设置, 除非是在Dataguard/Streams等需很多网络传输情况下;其它参数根据官方文档要求设置即可.
kernel.shmmax 的单位是字节;kernel.shmall的单位是页。对于32位系统,一页=4k,也就是4096字节。
kernel.shmall = 2097152 就是 2097152*4k/1024/1024 =8G 就是说可用共享内存一共8G。
#设置的一般规律
#kernel.shmall = 2097152 ---内存8G
#kernel.shmall = 4194304 ---内存16G
#kernel.shmall = 8388608 ---内存32G
#kernel.shmall = 16777216 ---内存64G