SWAP设置
交换空间由系统内的RAM数量决定。 下表显示交换空间建议。
RAM | Swap Space |
---|---|
1 GB – 2GB | RAM 大小的1.5倍 |
2 GB – 16 GB | 等于 RAM 大小 |
16 GB 及以上 | 16 GB |
防火墙设置
IPtables需要打开的端口
Port | Protocol | Description |
---|---|---|
22 | TCP | SSH |
80 | TCP | HTTP |
443 | TCP | HTTPS |
1521 | TCP | Oracle Transparent Network Substrate (TNS) Listener default port |
1158 | TCP | Oracle Enterprise Manager 11g default port |
# Generated by iptables-save v1.4.7 on Fri May 11 12:56:20 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5176]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1158 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri May 11 12:56:20 2018
调整虚拟内存
调整虚拟内存需要修改五个内核参数,这些参数会影响Oracle数据库中使用虚拟内存的速率。在设置虚拟内存时,需要注意建议值作为起点。下面介绍虚拟内存参数的简要说明和推荐设置,以及脏数据的定义。
脏数据(dirty data)是为了提高性能而修改并保存在页面缓存中的数据。一旦数据被刷新到磁盘,数据是干净的。
- swappiness - 从0到100的值,它控制系统交换的程度。高值可以优先处理系统性能,当进程处于非活动状态时积极地将进程交换出物理内存。低值优先考虑交互性,并尽可能避免在物理内存之外交换进程,从而减少响应延迟。默认值是60. Oracle推荐的值是0。
- dirty_ratio - 包含占系统总内存的百分比,生成磁盘写入的进程本身将开始写出脏数据的页数。默认值是20.建议值是80。
- dirty_background_ratio - 包含占系统总内存的百分比,后台回写守护进程将开始写出脏数据的页数。Oracle推荐值为3。
- dirty_expire_centisecs - 定义脏数据的年限足以符合写入条件。默认值为3000,以百分之一秒表示。Oracle推荐值为500。
- dirty_writeback_centisecs - 定义写入脏内存数据写入磁盘的时间间隔。默认值为500,以百分之一秒表示。Oracle推荐值为100。
vm.swappiness = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
调整共享内存
共享内存允许进程通过将内存区域放入内存段来相互通信。就Oracle而言,系统全局区(SGA)使用共享内存段来存储传入数据和控制信息。 Oracle SGA的大小会影响在系统中设置的共享内存页面和共享内存段的数量。默认情况下,红帽企业版Linux 6提供了大量的共享内存页面和段,但是,适当的系统分配取决于系统内的RAM数量。
为了为运行Oracle数据库的系统分配适当数量的共享内存页面和共享内存段,必须设置内核参数shmall,shmmax和shmmni.
- shmall - 是共享内存页面的最大总量
- shmmax - 是单个共享内存段的最大字节数
- shmmni - 是共享内存段的最大总量
确定系统中共享内存页面(shmall)的最大数量的第一步是确定系统的页面大小(以字节为单位)。以下命令可用于获取系统页面大小。
getconf PAGE_SIZE
4096
一旦获取到页面大小,按如下所示计算shmall:
内存大小(单位为字节 byte) / 单个页面大小
例如,在具有48 GB内存的系统上,shmall计算如下所示:
echo "48*1024^3/4096" | bc
12582912
shmmax的计算如下:
内存的一半(单位为字节 byte)
例如,在具有48 GB内存的系统上,shmmax计算如下所示:
echo "48*1024^3/2" | bc
25769803776
至于shmmni,Oracle建议将shmmni的值设置为4096。
注意:如果/etc/sysctl.conf中的当前值高于为shmmax和shmall计算的值,请不要更改/etc/sysctl.conf文件中的值。
由于计算的shmmax和shmall的值比已经设置的值小,因此在/etc/sysctl.conf中不做任何更改。
/etc/sysctl.conf文件的片段:
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
为了使更改立即生效,请运行以下命令:
sysctl -p
调整信号量
红帽企业linux 6为进程之间的信息同步提供信号量。 内核参数sem由四个参数组成:
- semmsl - 被定义为每个信号量组的最大信号数量
- semmni - 被定义为整个系统的最大信号集数量
- semmns - 被定义为整个系统的信号量总数 (注:semmns = semmsl * semmni )
- semopm - 定义为每个semop系统调用执行的信号操作总数。
kernel.sem = semmsl semmns semopm semmni
在/etc/sysctl.conf文件中需要以下行来为Oracle提供足够的信号量:
kernel.sem = 250 32000 100 128
调整临时端口
Oracle建议临时默认端口范围从9000到65500设置。这确保避免Oracle和其他应用程序使用的所有众所周知的端口和端口。 要设置临时端口范围,请修改/etc/sysctl.conf文件并添加以下行:
net.ipv4.ip_local_port_range = 9000 65500
调整网络缓冲区
通过设置rmem和wmem来优化Oracle中应用程序套接字的默认缓冲区和最大缓冲区。
- rmem - 接收缓冲区大小
- wmem - 发送缓冲区大小
在/etc/sysct.conf文件中修改为Oracle推荐的值。
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
调整异步I/O请求的最大数量
修改内核参数fs.aio-max-nr,设置当前异步I / O请求的最大数量。 Oracle建议将该值设置为1048576.
修改/etc/sysctl.conf文件,如下所示:
fs.aio-max-nr = 1048576
调整文件句柄
在安装Oracle 11gR2(11.2.0.4)时,fs.file-max内核参数必须至少设置为6815744。
内核参数fs.file-max设置操作系统的打开文件句柄的最大数量。 Oracle建议对于在系统中找到的每个Oracle数据库实例,除了已分配给Red Hat Enterprise Linux 6操作系统的打开文件句柄之外,还要分配512*PROCESSSES。数据库实例中的PROCESSES是指oracle用户可以并发连接到Oracle数据库的最大进程数。对于Oracle 11gR2(11.2.0.4),PROCESSES的默认值为150。
要正确计算系统的fs.file-max,首先通过以下命令识别分配给系统的当前fs.file-max:
cat /proc/sys/fs/file-max
385107
接下来,从系统中找到每个Oracle数据库实例中所有PROCESSES,并将多个PROCESSES加起来,然后乘以512。如以下命令中所示。
echo "512*150" | bc
76800
注:由于尚未创建Oracle数据库,因此使用默认值150
最后,将当前的fs.file-max值与512*PROCESSES得到的新值相加,以获得新的fs.file-max值。
echo "385107+76800" | bc
461907
虽然fs.file-max参数的值因您的环境而异,但Oracle建议不得小于6815744。
修改/etc/sysctl.conf文件,如下所示:
fs.file-max = 6815744
用户和组
在安装oracle数据库11g第2版(11.2.0.4)之前,Oracle建议为oracle grid infrastructure创建grid用户,并为安装在系统上的oracle数据库软件创建oracle用户。就本文档而言,oracle数据库软件所有者是用户oracle,而oracle grid infrastructure软件所有者是用户grid。根据安装的软件,每个用户被指定不同的组来处理特定的角色。oracle用户和grid用户都有一个公共主要组,即oracle中央清单组(oinstall)。
以下是为安装oracle数据库和oracle用户而创建的推荐系统组。
- osdba组(dba) - 具有dba特权的操作系统用户帐户
- osoper组(oper) - 创建的可选组,用于将有限的dba特权(sysoper特权)分配给特定的os用户帐户
以下是为安装oracle grid infrastructure和grid用户而创建的推荐系统组
osdba组(asmdba) - 提供对oracle asm实例的管理访问
osasm组(asmadmin) - 通过sysasm特权为存储文件提供管理访问权限
osoper组(asmoper) - 创建的可选组,用于为特定的os用户帐户分配有限的dba特权
groupadd --gid 54321 oinstall
groupadd --gid 54322 dba
groupadd --gid 54323 asmdba
groupadd --gid 54324 asmoper
groupadd --gid 54325 asmadmin
groupadd --gid 54326 oper
useradd --uid 54321 --gid oinstall --groups dba,oper,asmdba,asmoper oracle
useradd --uid 54322 --gid oinstall --groups dba,asmadmin,asmdba,asmoper grid
echo "grid" | passwd --stdin grid
echo "oracle" | passwd --stdin oracle
通过以下命令验证grid和oracle用户的主组和属组:
id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(asmdba),54324(asmoper),54326(oper)
id grid
uid=54322(grid) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(asmdba),54324(asmoper),54325(asmadmin)
调整用户资源限制
Oracle建议针对每个用户允许的打开文件描述符(nofile)的数量,进程数量(nproc)和堆栈段(stack)的大小分别进行软硬限制。设置这些限制的目的是为了防止应用程序(如Oracle)在极其繁重的工作负载下耗尽所有操作系统资源时可能导致的系统崩溃。
在/etc/security/limits.d/中创建一个名为99-grid-oracle-limits.conf的文件,如下所示:
touch /etc/security/limits.d/99-grid-oracle-limits.conf
注意:不直接修改/etc/security/limits.conf文件的原因是由于系统中读取限制文件的顺序。读取/etc/security/limits.conf文件后,会读取/etc/security/limits.d/目录中的文件。如果两个文件包含相同的条目,则最后读取的条目优先。
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
grid soft nofile 1024
grid hard nofile 65536
grid soft nproc 16384
grid hard nproc 16384
grid soft stack 10240
grid hard stack 32768
grid hard memlock 134217728
grid soft memlock 134217728
对99-grid-oracle-limits.conf文件所做的修改立即生效。 但是,请确保先前登录的oracle已注销并重新登录,以使更改生效。
以root身份在/etc/profile.d/中创建一个名为oracle.sh的shell脚本,为oracle用户创建适当的ulimits。
oracle.sh脚本的内容如下:
#Setting the appropriate ulimits for oracle and grid user
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -u 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
if [ $USER = "grid" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -u 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
以oracle和grid用户身份运行以下命令来验证ulimit值:
ulimit -a
配置HugePages(Oracle安装完成后)
默认情况下,RHEL6使用透明巨大页面(transparent huge pages),也被称为匿名巨大页面(anonymous huge pages)。在RHEL6中实现透明巨大页面(THP),通过根据需要动态分配巨大页面,消除了手动管理巨大页面的许多困难,从而改善了内存管理。与静态大页面不同,不需要额外的配置即可使用它们。巨大的页面可以通过增加程序快速访问内存页面的机会来提高应用程序的性能。与传统的巨大页面不同,当需要虚拟内存清理时,THP可以被换出(作为较小的4kB页面)。
不幸的是,Oracle数据库没有利用THP进行进程间通信。事实上,My Oracle Support [ID 1557478.1] 12指出,如果发现THP被启用,则会由于意外的性能问题或延迟而禁用THP。要获得Oracle数据库的大页面的好处,需要分配静态大页面并禁用THP。建议在数据库启动并运行后运行该脚本。数据库启动并运行后分配巨大页面的原因是提供适当数量的页面来处理正在运行的共享内存段。步骤如下:
1.新建bash脚本,将其保存为huge_pages_settings.sh
#!/bin/bash
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
do
MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
if [ $MIN_PG -gt 0 ]; then
NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
fi
done
# Finish with results
case $KERN in
'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
'2.6'|'3.8'|'3.10'|'4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
2.以root用户身份运行以下命令,确保huge_pages_settings.sh可执行:
chmod + x huge_pages_settings.sh
3.以root用户身份执行huge_pages_settings.sh脚本,如下所示:
./huge_pages_settings.sh
Recommended setting: vm.nr_hugepages = 2309
4.将huge_pages_settings.sh脚本提供的 hugepages = 2309 添加到/etc/grub.conf中的内核引导命令行中,并在重新启动后持久禁用透明大页面,如下所示:
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/myvg-root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM rd_LVM_LV=myvg/root EYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=myvg/swap rhgb quiet hugepages=2309 transparent_hugepage=never
initrd /initramfs-2.6.32-358.el6.x86_64.img
注意:由于内存还没有被分割,所以在内核引导命令行中分配大量页面的数量是最可靠的方法.
5.重新启动系统以确保巨大页面设置正常生效。
7.使用以下命令验证系统上的大页面总数:
cat /proc/meminfo | grep -i hugepages_total
HugePages_Total: 2309
8.通过以下命令验证透明超大页面的当前状态是否被设置为永远不变:
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
注:从Oracle数据库版本11.2.0.2开始,引入了初始化参数“USE_LARGE_PAGES”,以便为每个数据库用例分配大量页面。Oracle数据库11.2.0.2的默认值为true,而对于运行11.2.0.3或更高版本的Oracle数据库,它将设置为auto。有关参数及其值的更多信息,请参阅My Oracle Support 14。
注:巨大页面与自动内存管理(AMM)不兼容。