暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

oracle 数据库安装过程中需要注意的参数及解释

原创 _ 云和恩墨 2023-04-08
1581

一、依赖包

bc-1.07.1-5.el8.s390x
binutils-2.30-79.el8.s390x
elfutils-libelf-0.180-1.el8.s390x
elfutils-libelf-devel-0.180-1.el8.s390x
fontconfig-2.13.1-3.el8.s390x
gcc-8.3.1-5.1.el8.s390x
gcc-c++-8.3.1-5.1.el8.s390x
glibc-2.28-127.el8_3.2.s390x
glibc-devel-2.28-127.el8_3.2.s390x
ksh-20120801-254.el8.s390x
libnsl2-1.2.0-2.20180605git4a062cf.el8.s390x
libX11-1.6.8-3.el8.s390x
libXau-1.0.9-3.el8.s390x
libXaw-1.0.13-10.el8.s390x
libXi-1.7.10-1.el8.s390x
libXrender-0.9.10-7.el8.s390x
libXtst-1.2.3-7.el8.s390x
libaio-0.3.112-1.el8.s390x
libaio-devel-0.3.112-1.el8.s390x
libattr-devel-2.4.48-3.el8.s390x
libgcc-8.3.1-5.1.el8.s390x
libgfortran-8.4.1-1.el8.s390x
libibverbs-29.0-3.el8.s390x
libnsl-2.28-127.el8_3.2.s390x
librdmacm-29.0-3.el8.s390x
libstdc++-8.3.1-5.1.el8.s390x
libstdc++-devel-8.3.1-5.1.el8.s390x
libxcb-1.13.1-1.el8.s390x
make-4.2.1-10.el8.s390x
net-tools-2.0-0.52.20160912git.el8.s390x
pam-1.3.1-11.el8.s390x
pam-devel-1.3.1-11.el8.s390x
policycoreutils-2.9-9.el8.s390x
policycoreutils-python-utils-2.9-9.el8.noarch
smartmontools-7.1-1.el8.s390x
sysstat-11.7.3-5.el8.s390x

Oracle Database (RDBMS) on Unix AIX,HP-UX,Linux,Solaris and MS Windows Operating Systems Installation and Configuration Requirements Quick Reference (12.1/12.2/18c/19c) (Doc ID 1587357.1)

Oracle Database (RDBMS) on Unix AIX,HP-UX,Linux,Mac OS X,Solaris,Tru64 Unix Operating Systems Installation and Configuration Requirements Quick Reference (8.0.5 to 11.2) (Doc ID 169706.1)

Requirements for Installing Oracle Database 12.1 on RHEL7 or OL7 64-bit (x86-64) (Doc ID 1961997.1)

二、内核参数

  • kernel.shmall

kernel.shmall是一个Linux内核参数,它用于设置系统可以分配的最大共享内存页数。每个共享内存段都需要分配一定数量的物理内存页,因此kernel.shmall的值要足够大才能支持系统上的所有共享内存段。具体来说,kernel.shmall的值应该大于等于系统上所有共享内存段所需的物理内存页数之和。可以使用下面的公式计算kernel.shmall的值:

kernel.shmall = (RAM in bytes) / (Page size in bytes)

其中,RAM in bytes表示系统的物理内存大小,Page size in bytes表示系统的页面大小(通常为4KB)。
例如,如果系统的物理内存大小为16GB,则kernel.shmall的值可以设置为:

kernel.shmall = (16 * 1024 * 1024 * 1024) / (4 * 1024)

这将得出一个值为4194304,表示系统可以分配的最大共享内存页数为4194304页。共享内存段是一种特殊的内存区域,它可以被多个进程共享。这种内存区域可以在多个进程之间传递信息,并且相比于其他进程间通信方式,如管道、消息队列等,共享内存段有着更高的数据传输速度和更少的系统开销。共享内存段可以被看作是一段被所有进程共享的物理内存,这段内存的地址在每个进程中都是相同的。进程可以通过访问这段共享内存,来实现数据的共享和传输。共享内存段在操作系统内核中被实现为一种特殊的资源,进程需要通过系统调用来获取和释放这种资源。在Linux系统中,常用的共享内存段相关系统调用包括shmget、shmat、shmdt和shmctl等

该参数设备太小会导致数据库无法启动,报错

ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
  • vm.min_free_kbytes

内核参数预留 512MB,让 OS 更快回收内存,避免 LowMem 压力

vm.min_free_kbytes是Linux内核参数之一,用于控制系统中未被使用的内存的最小值。它指定了在内存中保留的未使用页面的最小数量,以防止系统耗尽可用内存,并确保系统能够执行必要的操作,如分配内存和处理中断。

当系统中可用内存低于vm.min_free_kbytes值的时候,Linux内核会尝试回收内存中未被使用的页面,以确保系统有足够的可用内存。这个过程可能会导致一些性能损失,因为系统需要花费时间和资源来回收内存。

vm.min_free_kbytes的默认值通常是一个相对较小的值,例如4096KB(4MB),这意味着系统会保留至少4MB的未使用内存。如果你的系统经常出现内存不足的情况,你可以考虑增加vm.min_free_kbytes的值,以确保系统有足够的可用内存。

你可以使用以下命令查看当前系统的vm.min_free_kbytes值:

cat /proc/sys/vm/min_free_kbytes

如果你想修改vm.min_free_kbytes的值,可以使用以下命令:

sudo sysctl -w vm.min_free_kbytes=<new_value>

其中<new_value>是你想要设置的新值。请注意,这种修改只是临时的,如果你想永久修改vm.min_free_kbytes的值,你需要在/etc/sysctl.conf文件中添加以下行:

vm.min_free_kbytes=<new_value>

并执行以下命令使其生效:

sudo sysctl -p /etc/sysctl.conf

参考

Oracle Linux: Kernel Lowmem Pressure Issues and Related Kernel Structures (Doc ID 452326.1)

Linux Kernel: The SLAB Allocator (Doc ID 434351.1)

  • vm.swappiness=100

压力测试表明,在内核版本 2.6.18 或更低版本上,vm.swappiness = 100(默认值 = 60)可以减少或延迟由于大量客户端连接或登录风暴期间内存压力大的情况下的节点驱逐

用于控制内核在RAM(随机访问存储器)使用完毕后,将页帧(page frame)交换到交换分区(swap partition)的倾向程度。当vm.swappiness的值为100时,内核会尽可能地使用交换分区,以便在RAM用完时能够继续运行。这个值的范围是0到100,其中0表示内核尽可能地使用RAM,而100表示内核尽可能地使用交换分区。
在大多数情况下,将vm.swappiness的值设置为100并不是一个好的选择,因为这会导致内核频繁地将数据从RAM交换到交换分区,从而降低系统的性能。通常,将vm.swappiness的值设置在10到60之间是比较合适的,具体取值要根据系统的实际情况来决定。

如果你想修改vm.swappiness的值,可以使用以下命令:

sudo sysctl -w vm.swappiness=<new_value>

其中<new_value>是你想设置的新值。如果你想永久修改vm.swappiness的值,你需要在/etc/sysctl.conf文件中添加以下行:

vm.swappiness=<new_value>
  • rp_filter

互连数据包可能会在多互连系统上被阻止/丢弃。为避免这种情况,将专用互连 NIC 的 rp_filter 内核参数设置为值 0(禁用)或 2(松散)

在Linux中,网络包被发送到一个目标地址时,系统会根据路由表中的信息确定该网络包应该从哪个接口发送出去。反向路径过滤是一种网络安全机制,用于防止网络攻击者伪造源地址欺骗网络设备。当开启rp_filter时,内核会检查接收到的网络包的源地址是否可以通过与路由表匹配的接口发送出去,如果不能,则该网络包将被丢弃。这样可以防止攻击者使用伪造的源地址发送网络包,从而保护网络的安全。rp_filter的默认值为1,表示开启反向路径过滤。如果你的网络环境比较复杂,例如有多个网卡或多个路由表,可能需要根据实际情况调整rp_filter的值。

可以使用以下命令查看当前系统的rp_filter值:

cat /proc/sys/net/ipv4/conf/all/rp_filter

如果想修改rp_filter的值,可以使用以下命令:

sudo sysctl -w net.ipv4.conf.all.rp_filter=<new_value>

其中<new_value>是你想设置的新值。请注意,这种修改只是临时的,如果你想永久修改rp_filter的值,你需要在/etc/sysctl.conf文件中添加以下行:

net.ipv4.conf.all.rp_filter=<new_value>

rp_filter for multiple private interconnects and Linux Kernel 2.6.32+ (Doc ID 1286796.1)

(Max value would be "2", this is OK)
net.ipv4.conf.ib1.rp_filter = 2
net.ipv4.conf.ib0.rp_filter = 2
net.ipv4.conf.all.rp_filter = 0

(Max value would be "0", this is OK)
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
  • kernel.shmmax

设置系统中单个共享内存段的最大大小。共享内存段是一种被多个进程共享的内存区域,kernel.shmmax参数可以限制单个共享内存段的大小,以保证系统的稳定性和安全性。具体来说,kernel.shmmax参数的值表示单个共享内存段可以分配的最大物理内存大小。如果尝试创建的共享内存段大小超过了这个值,创建操作将会失败。kernel.shmmax的值通常应该根据系统的物理内存大小和应用程序的需求来配置。可以通过下面的公式计算kernel.shmmax的值:

kernel.shmmax = (RAM in bytes) / 2

其中,RAM in bytes表示系统的物理内存大小。这个公式将kernel.shmmax设置为系统物理内存大小的一半,这通常是一个比较保守的设置,可以避免过度分配内存资源而导致系统不稳定。需要注意的是,kernel.shmmax的值不能超过系统所支持的最大内存大小。在32位系统上,kernel.shmmax通常不能超过2GB;在64位系统上,kernel.shmmax通常可以设置得更大。在安装Oracle数据库时,需要设置kernel.shmmax参数的值以满足Oracle数据库的内存需求。下面是一些通用的步骤来设置kernel.shmmax参数。
检查当前系统kernel.shmmax参数的值,使用以下命令:

sysctl kernel.shmmax

如果当前值小于Oracle数据库所需的值,则需要修改kernel.shmmax参数。在Linux系统上,可以使用以下命令来修改参数:

sudo sysctl -w kernel.shmmax=<value>

其中,为需要设置的kernel.shmmax参数值。例如,如果需要将kernel.shmmax参数设置为8GB,可以使用以下命令:

sudo sysctl -w kernel.shmmax=8589934592

如果需要永久修改kernel.shmmax参数,可以编辑/etc/sysctl.conf文件,并添加以下行:

kernel.shmmax=<value>

然后保存文件并退出。
重新加载/etc/sysctl.conf文件,以使新的kernel.shmmax参数生效:

sudo sysctl -p /etc/sysctl.conf

需要注意的是,kernel.shmmax参数的值应该根据系统的物理内存大小和Oracle数据库的内存需求来设置。

ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory

建议将kernel.shmmax设置为Oracle数据库需要的最大共享内存大小。可以通过查询Oracle数据库参数文件(如initSID.ora)中的sga_max_size参数来获取需要的共享内存大小。

  • kernel.shmmni = 4096

kernel.shmmni是一个Linux内核参数,用于控制系统中共享内存段的最大数量。shmmni表示"Shared Memory Identifier",是一个唯一标识共享内存段的数字。默认情况下,kernel.shmmni参数的值为4096。如果你需要更多的共享内存段,可以通过以下命令来修改kernel.shmmni参数的值:

sudo sysctl -w kernel.shmmni=<value>

其中是你期望的最大共享内存段的数量。这个值不能超过65536。注意,在修改kernel.shmmni参数之前,你应该了解你的系统的内存和进程需求,以确保你不会超过系统的限制。

ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
  • kernel.sem = 250 32000 100 128

kernel.sem是一个Linux内核参数,用于控制系统中的信号量操作。这个参数由三个数字组成,分别表示:
- 第一个数字表示信号量集的最大数量
- 第二个数字表示系统中信号量的最大数量
- 第三个数字表示系统中信号量操作的最大数量

默认情况下,kernel.sem参数的值是"250 32000 100 128",这意味着系统可以同时处理250个信号量集,每个信号量集有32000个信号量,每个进程可以进行100个信号量操作。
如果你需要更改kernel.sem参数的值,可以使用以下命令:

sudo sysctl -w kernel.sem="<semaphore_max> <semaphores> <operations_max> <timeout>"

其中<semaphore_max>是信号量集的最大数量,是系统中信号量的最大数量,<operations_max>是系统中信号量操作的最大数量,是信号量操作的最大等待时间(以毫秒为单位)。

例如,如果你想将kernel.sem参数的值设置为"300 50000 200 256",可以使用以下命令:

sudo sysctl -w kernel.sem="300 50000 200 256"

在Oracle数据库的安装过程中,建议将kernel.sem参数设置为至少"256 32000 100 256"。这是因为Oracle数据库在运行过程中会使用大量的信号量,特别是在多用户环境中。

以下是每个数字的含义:
- 256:信号量集的最大数量,这个值可以设置得稍微高一些,以便在需要时可以创建更多的信号量集。
- 32000:系统中信号量的最大数量,这个值应该设置得足够高,以便在Oracle数据库运行时可以创建足够多的信号量。
- 100:系统中信号量操作的最大数量,这个值应该设置得足够高,以便在Oracle数据库运行时可以执行足够多的信号量操作。

在Linux系统中,信号量集是一种用于进程间同步和通信的机制。信号量集是由多个信号量组成的,每个信号量都是一个计数器,用于控制对共享资源的访问。进程可以通过调用semget()系统调用来创建信号量集,然后使用semop()系统调用来对信号量进行操作,包括等待、释放和设置计数器值等。信号量集通常用于解决并发访问共享资源的问题。例如,在多个进程同时访问共享内存时,需要使用信号量集来保证每个进程都能正确地访问共享内存,以避免出现数据损坏或竞争条件等问题。另外,信号量集还可以用于进程间通信,例如,一个进程可以通过将信号量值设置为某个特定值来通知其他进程进行某些操作。信号量集的创建和管理是由操作系统内核负责的。在Linux系统中,内核会维护一个系统范围的信号量表,每个信号量集都会在这个表中分配一个唯一的标识符,称为信号量集ID。进程可以使用这个ID来访问信号量集。当一个进程不再需要一个信号量集时,它可以使用semctl()系统调用来删除这个信号量集。总之,信号量集是一种非常重要的进程间同步和通信机制,

kernel.sem参数的第二个整数表示系统中信号量的最大数量。在Linux系统中,每个信号量都是一个计数器,用于控制对共享资源的访问。这个计数器是一个整数,可以用来表示某个共享资源的可用数量,例如,一个共享内存区域的大小,或者一个设备的可用数量等。当一个进程需要访问共享资源时,它需要先获取这个资源的信号量,这会使得信号量的计数器减一。当进程使用完共享资源后,它需要释放这个信号量,这会使得信号量的计数器加一。如果某个进程试图获取一个信号量,而这个信号量的计数器已经为0,那么这个进程就会被阻塞,直到有其他进程释放了这个信号量。因此,系统中信号量的最大数量决定了系统能够支持多少个共享资源。如果系统中的信号量数量达到了这个最大值,那么就无法再创建新的信号量。这会导致某些进程无法访问共享资源,从而影响系统的稳定性和可靠性。需要注意的是,每个进程也有一个最大信号量数限制,可以通过ulimit -a命令查看。如果某个进程需要使用更多的信号量,可以通过修改/etc/security/limits.conf等文件来增加进程的最大信号量数限制。

第三个参数表示系统中所有信号量集的最大值,它限制了整个系统中所有信号量集中信号量的总数量。也就是说,它限制了系统中可用的共享资源的总数量。这个参数的值应该根据系统的硬件配置和使用需求来设置,不能设置得过高或过低。如果设置得过高,会浪费系统资源,导致性能下降;如果设置得过低,会限制系统的可用性。

第四个参数表示对信号量的操作方式,而不是操作的最大等待时间。该参数的取值是由三个标志位进行组合的结果,决定了对信号量的操作方式。其中,SEM_UNDO标志位表示如果进程在对信号量进行操作时意外终止,内核会自动恢复之前的操作,避免资源泄漏;IPC_NOWAIT标志位表示如果对信号量进行操作时,当前信号量的值小于操作所需的值,则立即返回一个错误值;SEM_ADOPT标志位表示如果一个进程在对某个信号量进行操作时因为某种原因终止了,而这个进程持有的信号量还没有被释放,那么这个信号量会被系统中的其他进程继承,从而避免这个信号量一直被锁定。
需要注意的是,这些标志位可以通过位运算进行组合使用。例如,如果需要同时使用SEM_UNDO和IPC_NOWAIT标志位,可以将它们进行按位或操作,得到一个新的标志位。

默认值kernel.sem = 250 32000 100 128表示
- 第一个参数250表示系统中信号量的初始值为250。
- 第二个参数32000表示系统中最多可以存在32000个信号量。
- 第三个参数100表示每个信号量的最大值为100。也就是说,当一个信号量的值达到100时,再进行信号量的增加操作就会失败。
- 第四个参数128表示对信号量的操作方式。具体来说,128用二进制表示为10000000,其中最高位的1表示禁止多个进程同时对信号量进行操作。因此,这个参数的值表示对信号量的操作是不可重入的,即同一时间只能有一个进程对信号量进行操作。

ORA-27125: unable to create shared memory segment
Linux-x86_64 Error: 28: No space left on device
  • fs.file-max = 512 x processes (for example 6815744 for 13312 processes)

fs.file-max是一个Linux内核参数,用于设置系统中同时打开的文件描述符的最大数量。文件描述符是Linux系统中用于访问文件的抽象概念,每个打开的文件都会被分配一个文件描述符。因此,fs.file-max参数的值决定了系统中最多可以同时打开多少个文件。
默认情况下,fs.file-max参数的值比较小,一般只有1024或者更小。如果需要同时打开大量的文件,需要将fs.file-max参数的值适当调大。在调整该参数的值时,需要考虑系统的硬件资源和应用程序的需求,以避免引发系统性能问题或者内存资源耗尽的问题。一般建议将该参数的值设置为系统可用内存的10%~20%左右。

ORA-27123: unable to attach to shared memory segment
Linux-x86_64 Error: 24: Too many open files
  • fs.aio-max-nr = 1048576

用于设置系统中允许同时进行的异步I/O操作的最大数量。异步I/O操作是一种非阻塞式的I/O操作方式,可以提高系统的I/O性能。在Linux系统中,异步I/O操作是通过aio_*系列的系统调用实现的。当一个进程发起异步I/O操作时,内核会维护一个异步I/O操作队列来处理这些请求。fs.aio-max-nr参数的值可以控制该队列的长度,即系统能够同时处理的异步I/O操作的数量。默认情况下,该参数的值比较小,一般只有1024或者更小。如果应用程序需要大量使用异步I/O操作,需要将fs.aio-max-nr参数的值适当调大。
需要注意的是,在调整fs.aio-max-nr参数的值时,需要考虑到系统的硬件资源和应用程序的需求,以避免引发系统性能问题或者内存资源耗尽的问题。一般建议将该参数的值设置为系统可用内存的10%~20%左右。
建议将fs.aio-max-nr设置为足够大的值,以支持Oracle数据库需要的异步IO操作数量。可以通过查询Oracle数据库参数文件中的disk_asynch_io参数计算需要的异步IO操作数量。例如,如果disk_asynch_io设置为TRUE,则需要的异步IO操作数量应该至少为1024。如果fs.aio-max-nr设置过小,可能会导致Oracle数据库无法使用异步IO(AIO)功能,并报出如下错误信息:

ORA-27059: skgfrd: could not read from file
Linux-x86_64 Error: 22: Invalid argument
Additional information: 3
Additional information: 128
  • net.ipv4.ipfrag_high_thresh = 16M

在IP网络中,当一个网络包的大小超过了网络链路的MTU(最大传输单元),它就会被分片为多个小的IP数据包,以便在网络中传输。接收端的网络设备会将这些IP分片重新组装成原始的网络包。

net.ipv4.ipfrag_high_thresh参数用于控制Linux内核中IP分片的高门限值。当内核中的IP分片缓冲区占用率超过了高门限值时,内核会抛弃部分IP分片,以避免内存溢出。

默认情况下,net.ipv4.ipfrag_high_thresh参数的值为64KB。如果你的系统中经常有大量的IP分片,你可能需要增加这个值,以避免内存溢出。

你可以使用以下命令查看当前系统的net.ipv4.ipfrag_high_thresh值:

cat /proc/sys/net/ipv4/ipfrag_high_thresh

如果你想修改net.ipv4.ipfrag_high_thresh的值,可以使用以下命令:

sudo sysctl -w net.ipv4.ipfrag_high_thresh=<new_value>

其中<new_value>是你想设置的新值。请注意,这种修改只是临时的,如果你想永久修改net.ipv4.ipfrag_high_thresh的值,你需要在/etc/sysctl.conf文件中添加以下行:

net.ipv4.ipfrag_high_thresh=<new_value>
  • net.ipv4.ipfrag_low_thresh = 15M

net.ipv4.ipfrag_low_thresh参数用于控制Linux内核中IP分片的低门限值

  • net.ipv4.ip_local_port_range = 9000 65500

用于设置本地端口的范围。在Linux系统中,每个网络连接都会使用一个本地端口和一个远程端口来标识。本地端口是由操作系统随机分配的,可以在一定程度上提高网络连接的安全性。net.ipv4.ip_local_port_range参数的值定义了本地端口可以使用的范围。默认情况下,该参数的值为32768-61000,即本地端口的范围为32768到61000。如果系统需要同时支持大量的网络连接,需要将该参数的值适当调大。需要注意的是,在调整net.ipv4.ip_local_port_range参数的值时,需要考虑到系统的硬件资源和应用程序的需求,以避免引发系统性能问题或者端口耗尽的问题。如果net.ipv4.ip_local_port_range设置不足,可能会导致系统中可用的本地端口数量不足,从而导致一些网络应用程序无法正常工作。

  • net.core.rmem_default = 262144

用于设置套接字接收缓冲区的默认大小。套接字接收缓冲区是指用于存储接收数据的缓冲区,当应用程序通过套接字接收数据时,数据会先被存储到该缓冲区中,然后再由应用程序读取。net.core.rmem_default参数的值定义了套接字接收缓冲区的默认大小,单位为字节。默认情况下,该参数的值为212992,即套接字接收缓冲区的默认大小为212992字节。如果应用程序需要接收大量的数据,需要将该参数的值适当调大。

Oracle数据库通常会在网络传输过程中使用TCP协议来传输数据,而TCP协议的性能和可靠性与接收缓冲区的大小密切相关。如果net.core.rmem_default设置不足,可能会导致Oracle数据库的网络传输性能下降,甚至导致数据包丢失或者丢弃。Oracle数据库通常会在网络传输过程中使用TCP协议来传输大量的数据,例如SQL查询结果、数据库备份等。如果接收缓冲区的大小不足,可能会导致数据包被丢弃或者丢失,从而影响数据库的性能和可靠性。

  • net.core.rmem_max = 4194304

用于设置套接字接收缓冲区的最大大小

  • net.core.wmem_default = 262144

用于设置套接字发送缓冲区的默认大小。套接字发送缓冲区是指用于存储待发送数据的缓冲区,当应用程序通过套接字发送数据时,数据会先被存储到该缓冲区中,然后再由内核将数据发送出去。net.core.wmem_default参数的值定义了套接字发送缓冲区的默认大小,单位为字节。默认情况下,该参数的值为212992,即套接字发送缓冲区的默认大小为212992字节。如果应用程序需要发送大量的数据,需要将该参数的值适当调大。

如果net.core.wmem_default设置不足,可能会导致Oracle数据库在网络传输过程中出现错误,例如ORA-12537 TNS连接关闭、ORA-12547 TNS:lost contact等。

  • net.core.wmem_max = 1048576

设置套接字发送缓冲区的最大大小

  • vm.hugetlb_shm_group

指定哪个用户组可以创建并使用HugeTLB共享内存段。HugeTLB(Huge Transparent Large Pages)是一种内存管理机制,可以提高大内存应用程序的性能,因为它可以将大块内存分配为连续的、固定大小的页面。
vm.hugetlb_shm_group参数的值是一个用户组ID(GID),它指定了哪个用户组可以创建和使用HugeTLB共享内存段。默认情况下,该参数的值为0,表示只有root用户才能创建和使用HugeTLB共享内存段。如果需要允许其他用户组创建和使用HugeTLB共享内存段,可以将vm.hugetlb_shm_group参数的值设置为相应的用户组ID。需要注意的是,为了允许一个用户组创建和使用HugeTLB共享内存段,必须同时满足以下两个条件:
- HugeTLB共享内存段的大小必须大于或等于hugepagesize参数的值,这个参数表示HugeTLB页面的大小,可以通过/proc/meminfo文件或者hugeadm --get-pagesize命令查看。
- HugeTLB共享内存段必须使用shmget系统调用来创建,而不是使用mmap系统调用。

如果 oinstall 的 /etc/group 行为 1000,则为 1000

  • panic_on_oops = 1

指定系统在遇到Oops错误时是否立即崩溃。Oops是Linux内核发生异常时的错误信息,通常是由于内存错误、驱动程序错误或其他内核问题导致的。

当panic_on_oops参数的值为1时,系统遇到Oops错误时会立即崩溃并显示错误信息,这样可以确保系统不会继续执行可能会导致更严重问题的代码。如果该参数的值为0,则系统会尝试继续执行,并尝试恢复。

默认情况下,panic_on_oops参数的值为0,这意味着系统会尝试恢复,并在控制台上打印Oops错误信息。如果需要让系统在遇到Oops错误时立即崩溃,可以将该参数的值设置为1。

  • net.ipv4.tcp_wmem = 4096 65536 1048576

这是Linux系统中TCP协议的写缓存区大小配置,对应了三个参数:min、default、max。

net.ipv4.tcp_wmem = 4096 65536 1048576

min:4096 bytes
default:65536 bytes
max:1048576 bytes

这三个参数设置了TCP协议接收方的写缓存区大小,用于存放接收到的数据,当接收方接收到数据后,会先将数据存放到缓存区中,再从缓存区中读取数据进行处理。缓存区大小的设置会影响TCP协议的性能和效率,如果设置得太小,会导致缓存区容易被填满,从而导致TCP协议的拥塞控制机制无法正常工作,从而影响网络传输的效率;如果设置得太大,会占用过多的系统资源,从而影响系统的稳定性。

  • net.ipv4.tcp_rmem=4096 87380 6291456

是Linux系统中TCP协议的读缓存区大小配置,对应了三个参数:min、default、max。

net.ipv4.tcp_rmem = 4096 87380 6291456

min:4096 bytes
default:87380 bytes
max:6291456 bytes

这三个参数设置了TCP协议发送方的读缓存区大小,用于存放要发送的数据,当发送方要发送数据时,会先将数据存放到缓存区中,再从缓存区中读取数据进行发送。缓存区大小的设置会影响TCP协议的性能和效率,如果设置得太小,会导致发送方无法及时发送数据,从而影响网络传输的效率;如果设置得太大,会占用过多的系统资源,从而影响系统的稳定性。

  • net.ipv4.tcp_sack = 1

Linux系统中TCP协议的SACK(Selective Acknowledgment)配置。SACK是一种TCP协议的改进,用于提高网络传输的效率和可靠性。SACK允许接收方在接收到数据时,向发送方发送一个SACK报文,其中包含了已经接收到的数据的信息,这样发送方就不需要重新发送已经传输过的数据了,从而提高了网络的传输效率。将 net.ipv4.tcp_sack 设置为1,表示启用了TCP协议的SACK机制,可以提高网络传输的效率和可靠性。但在某些情况下,SACK机制可能会引起性能问题。

  • net.ipv4.tcp_window_scaling = 1

Linux系统中TCP协议的窗口缩放配置。TCP协议的窗口缩放机制是一种用于提高网络传输性能的TCP扩展功能。TCP协议的窗口缩放机制允许发送方和接收方使用更大的窗口,从而提高了网络传输的效率。在窗口缩放机制下,TCP协议中的窗口大小被扩大到原来的2的n次方倍,其中n是一个在TCP连接建立时协商的参数,可以根据网络延迟和吞吐量等因素进行调整,从而提高网络传输的效率。将 net.ipv4.tcp_window_scaling 设置为1,表示启用了TCP协议的窗口缩放机制,可以提高网络传输的效率。但在某些情况下,窗口缩放机制可能会导致性能问题,例如在某些网络拓扑中,窗口缩放机制可能会导致网络拥塞,从而影响网络传输的效率。因此需要根据实际情况进行配置

  • net.ipv4.tcp_timestamps = 1

Linux系统中TCP协议的时间戳配置。TCP协议的时间戳是一种用于提高网络传输性能和可靠性的TCP扩展功能。TCP协议的时间戳允许发送方和接收方在数据包中添加一个时间戳,用于记录数据包的发送和接收时间。使用时间戳可以帮助网络设备更准确地计算网络延迟和数据包的传输时间,从而提高网络传输的效率和可靠性。将 net.ipv4.tcp_timestamps 设置为1,表示启用了TCP协议的时间戳机制,可以提高网络传输的效率和可靠性。但在某些情况下,时间戳机制可能会引起性能问题,例如在某些网络拓扑中,时间戳机制可能会导致网络拥塞,从而影响网络传输的效率。因此需要根据实际情况进行配置

三、资源限制

/etc/security/limits.conf是Linux系统中一个用于设置用户和进程资源限制的配置文件。通过修改该文件,可以限制用户和进程可以使用的系统资源,如CPU、内存、文件句柄等。下面是该文件的一般格式:

<domain>	<type>	<item>	<value>

其中,表示限制的目标,可以是一个用户名、一个用户组或者一个进程名;表示限制的类型,可以是soft或hard;表示限制的资源,如cpu、memlock、nofile等;表示限制的具体数值。

例如,下面的配置限制了用户user1和user2可以使用的最大文件句柄数为10000:

user1,user2      soft    nofile      10000

下面是一个更复杂的例子,该配置限制了用户user1和user2可以使用的最大CPU时间为1小时,最大内存为1GB,以及最大文件句柄数为10000:

user1,user2      soft    cpu         3600
user1,user2      soft    rss         1000000
user1,user2      soft    nofile      10000

在上述例子中,cpu表示CPU时间,单位为秒;rss表示进程使用的物理内存,单位为KB;nofile表示最大的文件句柄数。

需要注意的是,/etc/security/limits.conf文件中的配置只对普通用户和非特权进程有效,对于root用户和特权进程无效。如果需要对root用户和特权进程进行资源限制,可以使用其他工具,如systemd的systemd.resource-control等。

grid            soft   nproc    16384
grid            hard   nproc    16384
grid            soft   nofile   65536
grid            hard   nofile   65536
grid            soft   stack    32768
grid            hard   stack    32768
oracle          soft   nproc    16384
oracle          hard   nproc    16384
oracle          soft   nofile   65536
oracle          hard   nofile   65536
oracle          soft   stack    32768
oracle          hard   stack    32768
oracle          hard   memlock  unlimited
oracle          soft   memlock  unlimited

如果计划使用 Linux 大页面,建议内存无限制unlimited。
如果当前用户需要提高时

if [ $USER = "oracle" ]; then

if [ $SHELL = "/bin/ksh" ]; then

ulimit -u 16384

ulimit -n 65536

ulimit -s 32768

else

ulimit -u 16384 -n 65536 -s 32768

fi

fi

/etc/pam.d/login中加入

session required pam_limits.so

四、MTU

MTU(最大传输单元)是指在网络通信中,一次数据传输的最大数据量。对于Oracle RAC(Real Application Clusters)来说,MTU的设置可能会对系统的性能和可靠性产生影响。如果MTU设置过小,会导致大量的网络分组需要进行分段传输,从而降低了数据传输的效率和速度。此外,如果MTU设置过小,还可能导致数据包被丢弃或重传,从而影响系统的可靠性和稳定性。另一方面,如果MTU设置过大,则可能会导致网络丢包率上升,从而影响系统的性能和可靠性。这是因为大的数据包更容易在网络传输过程中发生错误,从而导致数据包被丢弃或需要进行重传。因此,在配置Oracle RAC时,需要根据实际情况评估网络的性能和可靠性,并根据需要调整MTU的大小。一般来说,MTU的设置应该与网络设备和操作系统的设置保持一致,并且应该根据网络负载和数据传输量进行调整,以提高系统的性能和可靠性。

Oracle建议设置MTU(最大传输单元)为9000。MTU是指在网络通信中,一次数据传输所能承载的最大数据量。通过将MTU设置为9000,可以减少网络通信的传输次数,从而提高数据传输的效率。然而,需要确保网络硬件和操作系统都支持设置9000的MTU,并进行正确的配置。如果不正确地配置MTU,可能会导致网络连接问题和性能下降。

Recommendation for the Real Application Cluster Interconnect and Jumbo Frames (Doc ID 341788.1) 建议使用Jumbo Frames

How to Modify Private Network Information in Oracle Clusterware (Doc ID 283684.1) 给出来设置私网Jumbo Frames

 ifconfig eth2 mtu 9000

五、NUMA

启用对性能有提升,伴随而来的问题也不少,资源充足情况下先禁用吧

Oracle NUMA Usage Recommendation (Doc ID 759565.1)

Oracle Linux: RHCK 7 Automatic NUMA Balancing Induces High IO Wait (Doc ID 2749259.1)

echo 0 > /proc/sys/kernel/numa_balancing
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet numa=off"
grub2-mkconfig -o /etc/grub2.cfg

六、remoteIPC

在 Oracle RAC中,remoteIPC 对系统性能和可靠性具有重要影响。Oracle RAC 是一种基于共享存储的集群技术,不同的节点之间需要进行进程间通信(IPC)来实现数据共享和协作。在 Oracle RAC 中,remoteIPC 技术是实现节点之间 IPC 的关键技术之一。
remoteIPC 技术的性能和可靠性对 Oracle RAC 的性能和可靠性具有重要影响。如果 remoteIPC 的性能不佳,可能会导致节点之间的通信延迟增加,从而影响系统的响应能力和可用性。此外,如果 remoteIPC 的可靠性不足,可能会导致数据共享的不一致,从而影响系统的数据一致性和可靠性。为了确保 Oracle RAC 的性能和可靠性,需要对 remoteIPC 进行合理的配置和优化。常用的 remoteIPC 技术包括 TCP/IP、UDP、共享内存等,需要根据实际需求和系统特点选择合适的技术和协议。此外,还需要对系统的网络拓扑、带宽、延迟等因素进行评估和优化,以提高 remoteIPC 的性能和可靠性。

优化removeIPC的方向

  • 调整共享内存大小:共享内存是 remoteIPC 的核心部分,调整共享内存大小可以显著影响 remoteIPC 的性能。通常情况下,应该将共享内存大小设置为足够大,以容纳所有需要共享的数据。可以使用 ipcs 命令查看当前的共享内存大小,并使用 sysctl 命令或修改 /etc/sysctl.conf 文件来调整共享内存大小。

  • 调整 TCP/IP 缓冲区大小:如果使用 TCP/IP 协议进行 remoteIPC,可以通过调整 TCP/IP 缓冲区大小来优化性能。通常情况下,应该将缓冲区大小设置为足够大,以容纳大量的数据。可以使用 sysctl 命令或修改 /etc/sysctl.conf 文件来调整缓冲区大小。

  • 调整网络拓扑:如果 RAC 集群中的节点之间距离较远,或者网络带宽较低,可能需要调整网络拓扑来优化 remoteIPC 的性能。例如,可以使用多个网络接口卡来增加带宽,或者使用专用的网络设备来加速数据传输。

  • 优化操作系统内核参数:操作系统内核参数可以影响 remoteIPC 的性能。例如,可以调整最大进程数、最大文件句柄数、TCP/IP 连接数等参数,以满足 RAC 集群的需求。可以使用 sysctl 命令或修改 /etc/sysctl.conf 文件来调整内核参数。

  • 使用高速网络设备:如果 RAC 集群中的节点之间需要大量的数据传输,可以使用高速网络设备来加速数据传输。例如,可以使用 InfiniBand 或者 10G 网络设备来提高数据传输速度。

七、关于ntpd

service  ntpd start
service  ntpd stop
service  ntpd status
/sbin/service ntpd condrestart

配置

cat /etc/ntp.conf
[root@erp51 ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"

对于 RAC-x 参数是强制性的

# 设置为 'yes' 以在 ntpdate 成功后同步硬件时钟
SYNC_HWCLOCK=no

Oracle Linux 7 ntpd 被 chronyd 取代为默认的网络时间协议守护进程
ntpd和chronyd都是用于网络时间同步的开源软件,它们之间有一些不同点:

  • 时间同步算法不同:ntpd使用Marzullo’s Algorithm,而chronyd使用Bayer’s Filter and Modified Allan Variance。
  • 对于网络延迟和时钟漂移的响应不同:chronyd比ntpd更快地响应网络延迟和时钟漂移,因为它使用更精确的算法。
  • 精度不同:chronyd在精度上比ntpd更准确,可以达到亚微秒级别的精度。
  • 配置文件不同:chronyd的配置文件相对简洁明了,而ntpd的配置文件较为复杂。
  • 其他特性不同:chronyd支持时钟源的选择和监控,以及在线调整时间;而ntpd则支持更多的时钟源类型和更多的操作系统。
  • 总体来说,chronyd比ntpd更加精确和灵活,但ntpd在某些方面可能更适合某些特定的环境和应用。选择哪种时间同步软件取决于你的具体需求和环境。

将chrony更换为ntpd的详细操作步骤:

卸载chrony

sudo yum remove chrony
安装ntpd
使用包管理器安装ntpd软件。例如,在CentOS上,你可以使用以下命令安装ntpd:

sudo yum install ntp
启动ntpd服务
启动ntpd服务,以便它可以同步本地时间和网络时间。例如,在CentOS上,你可以使用以下命令启动ntpd服务:

sudo systemctl start ntpd
你也可以使用以下命令启动ntpd服务:

sudo service ntpd start
配置ntpd
编辑ntpd的配置文件,例如/etc/ntp.conf,以配置时钟源和其他参数。例如,你可以将以下行添加到配置文件中,以使用NTP服务器time.google.com作为时钟源:

server time.google.com
你也可以添加其他NTP服务器作为备用时钟源。

启动ntpd服务
重启ntpd服务,使新的配置文件生效。例如,在CentOS上,你可以使用以下命令重启ntpd服务:

sudo systemctl restart ntpd
你也可以使用以下命令重启ntpd服务:

sudo service ntpd restart

完成以上步骤后,ntpd将取代chrony成为系统的时间同步软件,并按照你的配置文件同步时间。请确保你了解ntpd的配置和管理方法,并且在进行更改之前备份你的配置文件。

八、禁用 ASLR

在 OEL/RHEL 5、6 和 7 以及 Suse 10 及更高版本上禁用 ASLR(地址空间布局随机化)以防止进程启动错误。ASLR 是一种旨在在随机地址中加载共享内存对象的功能。在 Oracle 中,多个进程在跨进程的同一地址映射一个共享内存对象。启用 ASLR 后,Oracle 无法保证此共享内存地址的可用性。地址空间中的这种冲突意味着尝试将共享内存对象附加到特定地址的进程可能无法这样做,从而导致 shmat 子例程失败

可以验证是否正在使用 ASLR,

 # /sbin/sysctl -a | grep randomize
kernel.randomize_va_space = 1

如果参数设置为 0 以外的任何值,则使用 ASLR。

在 Redhat 5 上永久禁用 ASLR。

在 /etc/sysctl.conf 中添加/修改此参数
kernel.randomize_va_space=0
kernel.exec-shield=0

需要重新启动 kernel.exec-shield 参数才能生效。 注意,关闭 ASLR 需要两个内核参数。

进程启动失败可能还有其他原因,但是,通过关闭 ASLR,您可以快速排除 ASLR 是问题所在。ASLR 运行时会发现越来越多的问题。

在 RHEL/OEL 7 中,exec-shield 不再可修改,因此更改 exec-shield 参数会产生错误。”

ORA-00445: Background Process “xxxx” Did Not Start After 120 Seconds (Doc ID 1345364.1)

九、禁用透明大页

从 RedHat6、OL6、SLES11 和 UEK2 内核开始,Transparent HugePages 被实现并启用(默认)以尝试改进内存管理。Transparent HugePages 类似于以前 Linux 版本中可用的 HugePages。主要区别在于透明 HugePages 是在运行时由内核中的 khugepaged 线程动态设置的,而常规 HugePages 必须在启动时预先分配。

由于已知透明 HugePages 会导致节点意外重启和 RAC 性能问题,因此 Oracle 强烈建议禁用透明 HugePages。此外,即使在单实例数据库环境中,Transparent Hugepages 也可能会导致出现意外的性能问题或延迟。因此,Oracle 建议在所有运行 Oracle 的数据库服务器上禁用透明 HugePages。Oracle 强烈建议使用为以前的 Linux 版本推荐的标准 HugePages

注意:在 UEK2 及更高版本上,检查 /sys/kernel/mm/transparent_hugepage/ 目录是否存在。如果这个目录不存在,那么透明hugepage就会从内核中移除,所以不需要禁用透明hugepage

症状

 [    CSSD][224204544]clssscMonitorThreads clssnmvKillBlockThread not scheduled for 7500 msecs
 [    CSSD][224204544]clssscMonitorThreads clssnmvWorkerThread not scheduled for 8030 msecs
  • Linux 6
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] never


transparent_hugepage=never  添加到 /etc/default/grub 文件

cat /sys/kernel/mm/transparent_hugepage/enabled
always [never]

grep AnonHugePages /proc/meminfo

方法2
在 /etc/rc.local 中添加

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
chmod + x /etc/rc.local 

rc.local在redhat7已经弃用,但是依然可以用

  • oracle linux 7

创建/etc/systemd/system/disable-thp.service

[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled && echo 'never' >/sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

运行

# systemctl daemon-reload
# systemctl start disable-thp
# systemctl enable disable-thp
# systemctl status disable-thp

方法2

将“ transparent_hugepage=never ”添加到/etc/default/grub 的 GRUB_CMDLINE_LINUX条目

# /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="elevator=deadline audit=1 crashkernel=auto rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rd.lvm.lv=rootvg/usrlv transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"

备份 GRUB 配置文件并生成一个新文件以更改

# cp -pv /boot/grub2/grub.cfg /boot/grub2/grub.cfg-bkp
# grub2-mkconfig -o /boot/grub2/grub.cfg

基于 UEFI 的机器,运行以下命令以更改 grub 配置。

# cp -pv /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg-bkp
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

重启、检查

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

方法3 通过调整服务禁用透明大页面

#  grep transparent_hugepage /boot/grub2/grub.cfg
linux16 /vmlinuz-3.10.0-229.el7.x86_64 root=/dev/mapper/vgsystem-root ro rd.lvm.lv=vgsystem/swap rd.lvm.lv= vgsystem/root rhgb quiet numa=off transparent_hugepage=never        

验证

# uname -r
3.10.0-229.el7.x86_64

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never                                 ← THP is enabled 

方法4 吞吐量性能上全局禁用它
备份“ /usr/lib/tuned/throughput-performance/tuned.conf ”,然后将“ transparent_hugepages=always”更改为“ transparent_hugepages=never”。

#cp /usr/lib/tuned/throughput-performance/tuned.conf /usr/lib/tuned/throughput-performance/tuned.conf.bkp_original
#vi /usr/lib/tuned/throughput-performance/tuned.conf
 [vm]
 transparent_hugepages=always
   to 
 [vm]
 transparent_hugepages=never 

重启验证

#cat /sys/kernel/mm/transparent_hugepage/enabled
 always madvise [never]                          ← THP is disabled

方法5 活动调整配置文件上禁​​用

首先确定哪个配置文件处于活动状态。

# tuned-adm active
Current active profile: virtual-guest            ← Virtual-guest is the active profile

编辑"/usr/lib/tuned/virtual-guest/tuned.conf" 文件添加 “transparent_hugepages=never”

#cp /usr/lib/tuned/virtual-guest/tuned.conf /usr/lib/tuned/virtual-guest/tuned.conf.bkp_original
#vi /usr/lib/tuned/virtual-guest/tuned.conf
[main]
include=throughput-performance
[vm]
transparent_hugepages=never     

重启确认

#cat /sys/kernel/mm/transparent_hugepage/enabled
 always madvise [never]                          ← THP is disabled

其他 UEK 内核版本中的 THP 状态

UEK3 默认禁用。

[root@ol6 ~]# grep -i CONFIG_TRANSPARENT_HUGEPAGE /boot/config-3.8.13-118.6.2.el6uek.x86_64
# CONFIG_TRANSPARENT_HUGEPAGE is not set  

默认启用 UEK4。

[root@ol7 ~]# grep -i CONFIG_TRANSPARENT_HUGEPAGE /boot/config-4.1.12-37.2.2.el7uek.x86_64
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
  • Redhat
    https://access.redhat.com/solutions/1320153

  • 参考:

ALERT: Disable Transparent HugePages on SLES11, RHEL6, RHEL7, RHEL8, OL6, OL7, OL8 and UEK2 and above (Doc ID 1557478.1)

Oracle Linux 7 & 8: How to Disable Transparent HugePages ? (Doc ID 2066217.1)

https://access.redhat.com/solutions/1320153

十、设置大页

  • 关闭AMM

  • 检查

grep Hugepagesize /proc/meminfo

Oracle Linux: HugePages What It Is… and What It Is Not… (Doc ID 361323.1)

Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1)

Oracle Linux: HugePages on Oracle Linux 64-bit (Doc ID 361468.1)

#!/bin/bash
#
# hugepages_settings.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
# on Oracle Linux
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
#
# This script is provided by Doc ID 401749.1 from My Oracle Support
# http://support.oracle.com

# Welcome text
echo "
This script is provided by Doc ID 401749.1 from My Oracle Support
(http://support.oracle.com) where it is intended to compute values for
the recommended HugePages/HugeTLB configuration for the current shared
memory segments on Oracle Linux. Before proceeding with the execution please note following:
 * For ASM instance, it needs to configure ASMM instead of AMM.
 * The 'pga_aggregate_target' is outside the SGA and
   you should accommodate this while calculating the overall size.
 * In case you changes the DB SGA size,
   as the new SGA will not fit in the previous HugePages configuration,
   it had better disable the whole HugePages,
   start the DB with new SGA size and run the script again.
And make sure that:
 * Oracle Database instance(s) are up and running
 * Oracle Database 11g Automatic Memory Management (AMM) is not setup
   (See Doc ID 749851.1)
 * The shared memory segments can be listed by command:
     # ipcs -m

Press Enter to proceed..."

read

# 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}'`
if [ -z "$HPG_SZ" ];then
    echo "The hugepages may not be supported in the system where the script is being executed."
    exit 1
fi

# Initialize the counter
NUM_PG=0

# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | 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

RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`

# An SGA less than 100MB does not make sense
# Bail out if that is the case
if [ $RES_BYTES -lt 100000000 ]; then
    echo "***********"
    echo "** ERROR **"
    echo "***********"
    echo "Sorry! There are not enough total of shared memory segments allocated for
HugePages configuration. HugePages can only be used for shared memory segments
that you can list by command:

    # ipcs -m

of a size that can match an Oracle Database SGA. Please make sure that:
 * Oracle Database instance is up and running
 * Oracle Database 11g Automatic Memory Management (AMM) is not configured"
    exit 1
fi

# 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') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '3.10') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '4.14') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '4.18') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    '5.4') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
    *) echo "Kernel version $KERN is not supported by this script (yet). Exiting." ;;
esac

# End

十、SELINUX禁用

11.2.0.2之后的版本虽然支持,但还是禁用为好,有bug

echo "SELINUX=disabled" >> /etc/selinux/config
echo "#SELINUXTYPE=targeted " >> /etc/selinux/config
setenforce 1
systemctl stop firewalld.service
systemctl disable firewalld.service

十一、禁用 AVAHI 守护程序

/etc/init.d/avahi-daemon stop
/sbin/chkconfig  avahi-daemon off

在 Oracle Linux/Redhat Linux 上, /etc/sysconfig/network 中加入“NOZEROCONF=yes”
第三方 zeroconf mD​​NS 进程会导致节点驱逐后无法加入,也会出现高CPU time。

CSSD Fails to Join the Cluster After Private Network Recovered if avahi Daemon is up and Running (Doc ID 1501093.1)

十二、主机nproc限制

有时候在/etc/security/limits.conf中加入了nproc限制,但是ulimit -a任然显示不足,原因是oracle linux6中还有另外一个文件配置nproc限制

cat /etc/security/limits.d/90-nproc.conf

十四、网络注意

net.core.rmem_default=262144
net.core.rmem_max=4194304(对于 11g 和所有 RDS 实现)
net.core.rmem_max=2097152(对于 10g)
net.core.wmem_default=262144
net.core.wmem_max=1048576(对于 RDS至少使用 2097152)

十五、Linux Bonding

在实现 Linux Bonding 驱动程序时,必须避免模式 3(用于互连)和模式 6(用于连接和公共网络):

专用连接模式 3 的测试证明它复制所有 UDP 数据包并在每条路径上传输它们。这增加了处理来自互连的数据的 CPU 开销,从而降低了互连的效率。模式 3 绑定导致的重复 UDP 数据包导致了未发布的 Bug 7238620 (ORA-600 [2032]) 和未发布的 Bug 9081436 (GC CR REQUEST WAIT CAUSING SESSIONS TO WAIT)。尽管模式 3 的已知问题与互连隔离,但由于上述模式 3 的低效率,也不鼓励将模式 3 用于公共网络。

模式 6 绑定具有固有的竞争条件,浮动 IP 地址会导致 VIP、SCAN VIP 和 HAIP 出现故障转移问题。

十六、反向过滤

互连数据包可能会在多互连系统上被阻止/丢弃。为避免这种情况,将专用互连 NIC 的 rp_filter 内核参数设置为值 0(禁用)或 2(松散)

在Linux中,网络包被发送到一个目标地址时,系统会根据路由表中的信息确定该网络包应该从哪个接口发送出去。反向路径过滤是一种网络安全机制,用于防止网络攻击者伪造源地址欺骗网络设备。当开启rp_filter时,内核会检查接收到的网络包的源地址是否可以通过与路由表匹配的接口发送出去,如果不能,则该网络包将被丢弃。这样可以防止攻击者使用伪造的源地址发送网络包,从而保护网络的安全。rp_filter的默认值为1,表示开启反向路径过滤。如果你的网络环境比较复杂,例如有多个网卡或多个路由表,可能需要根据实际情况调整rp_filter的值。

rp_filter for multiple private interconnects and Linux Kernel 2.6.32+ (Doc ID 1286796.1)

net.ipv4.conf.ib1.rp_filter = 2
net.ipv4.conf.ib0.rp_filter = 2
net.ipv4.conf.all.rp_filter = 0

或者

net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

十七、Jumbo Frames

Recommendation for the Real Application Cluster Interconnect and Jumbo Frames (Doc ID 341788.1)

IPC Send timeout/node eviction etc with high packet reassembles failure (Doc ID 2008933.1)

Troubleshooting gc block lost and Poor Network Performance in a RAC Environment (Doc ID 563566.1)

Top 11 Things to do NOW to Stabilize your RAC Cluster Environment (Doc ID 1344678.1)

当应用程序发送大于 1500 字节 (MTU) 的消息时,它会从一个端点到另一个端点分成 1500 字节或更小的帧。在 Oracle RAC 中,DB_BLOCK_SIZE 的设置乘以 MULTI_BLOCK_READ_COUNT 决定了全局缓存消息的最大大小,PARALLEL_EXECUTION_MESSAGE_SIZE 决定了并行查询中使用的消息的最大大小。这些消息大小的范围可以从 2K 到 64K 或更大,因此使用较低/默认的 MTU 会变得更加碎片化。

巨型帧引入了以太网帧超过其 IEEE 802 指定的最大传输单元 1500 字节到最大 9000 字节的能力。尽管巨型帧在大多数 NIC 和数据中心类托管交换机中广泛可用,但它不是 IEEE 批准的标准。虽然好处很明显,但某些现有网络设备无法保证巨型帧的互操作性。尽管可以为专用集群互连实施巨型帧,但需要非常仔细的配置和测试才能实现其优势。在许多情况下,由于不正确的设置、驱动程序或交换机软件中的错误,可能会发生故障或不一致,这可能导致次优性能和网络错误。

为了使巨型帧在集群互连网络中正常工作,需要在主机、其网络接口卡和交换机级别进行仔细配置:

主机的网络适配器必须配置为 9000 的持久 MTU 大小(它将在重新启动后继续存在)。
例如ifconfig -mtu 9000 后接ifconfig -a 表示设置完成。

某些 NIC 需要额外的硬件配置。
例如,某些 Intel NIC 需要配置特殊的描述符和缓冲区,巨型帧才能正常工作。

还必须正确配置 LAN 交换机以增加 MTU 以支持巨型帧。确保所做的更改是永久性的(在电源循环后仍然存在)并且两个“Jumbo”指的是相同的大小,建议使用 9000(某些交换机不支持此大小)。

由于缺乏巨型帧标准,交换机之间的互操作性可能存在问题,需要高级网络技能才能进行故障排除。给定网络路径中任何设备使用的最小 MTU 决定了沿该路径传输的所有流量的最大 MTU(MTU 上限)。未能在集群和交换机的所有节点中正确设置这些参数可能会导致不可预测的错误以及性能下降。

  • 测试
[node01] $ traceroute -F node02-priv 9000
traceroute to node02-priv (10.x.x.2), 30 hops max, 9000 byte packets
1 node02-priv (10.x.x.2) 0.232 ms 0.176 ms 0.160 ms

[node01] $ traceroute -F node02-priv 9001
traceroute to node02-priv (10.x.x.2), 30 hops max, 9001 byte packets
traceroute: sendto: Message too long
1 traceroute: wrote node02-priv 9001 chars, ret=-1

[node01]$ ping -c 2 -M do -s 8972 node02-priv
PING node02-priv (10.x.x.2) 1472(1500) bytes of data.
1480 bytes from node02-priv (10.x.x.2): icmp_seq=0 ttl=64 time=0.220 ms
1480 bytes from node02-priv (10.x.x.2): icmp_seq=1 ttl=64 time=0.197 ms

[node01]$ ping -c 2 -M do -s 8973 node02-priv
From node02-priv (10.x.x.1) icmp_seq=0 Frag needed and DF set (mtu = 9000)
From node02-priv (10.x.x.1) icmp_seq=0 Frag needed and DF set (mtu = 9000)
--- node02-priv ping statistics ---
0 packets transmitted, 0 received, +2 errors

对于 RAC 互连流量,为 Jumbo Frame 正确配置的设备通过减少 TCP、UDP 和以太网开销来提高性能,这些开销在必须将大消息分解为较小的标准以太网帧时发生。因为可以发送一个较大的数据包,所以消除了各种较小数据包之间的数据包间延迟。在需要高吞吐量和带宽的情况下以及系统受 CPU 限制时,性能的提高最为明显。

使用巨型帧时,需要更少的缓冲区传输,这是减少 IP 堆栈中碎片和重组的一部分,因此对减少 Oracle 块传输的延迟有影响。

如测试部分所示,任何不正确的设置都可能会阻止实例启动或对性能产生非常负面的影响。

设置较小会导致大量gc block lost、gc cr multiblock requests

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论