Oracle RAC集群操作系统最佳实践OS Best Practices

这部分主要讨论操作系统具体的调优和配置相关的问题, 例如使用用户模式的IPC和其他相关操作系统的配置问题。(askmac.cn)

 

1 连接和IPC

1.1 私有连接

无论IPC协议是否使用, 一个私有网络仅用于RAC和CSS/CRS,也就是这个连接不会用于其他通信, 例如DATA Guard实例的归档日志。在10g中,RAC和CRS的私有网络通信信息存储在OCR。RAC和CRS总是使用相同的私有IP地址。你需要确保信息通信和数据库传输确实使用私有连接,而不是错误的使用公共网络。

 

如果你不确定经由UDP正用于RAC相关通信的IP地址/NFC, 在SQL*Plus中运行:

 

select INST_ID,PUB_KSXPIA,PICKED_KSXPIA,NAME_KSXPIA,IP_KSXPIA

from x$ksxpia;

 

INST_ID PUB_KSXPIA PICKED_KSX NAME_ IP_KSXPIA

———- ———- ———- —– —————-

1 N          OCR        eth3  140.87.150.21

 

这个视图将显示哪个IP地址和接口被实例使用,同时显示从哪儿获得信息(OCR,OSD或者CI) 。

另一种比较老的方法是运行

 

SQL> oradebug setmypid

SQL> oradebug ipc

SQL> oradebug tracefile_name

 

USER_DUMP_DEST中被写入跟踪文件的信息将显示被使用的IP地址信息;如果是用户模式IPC协议,跟踪文件不会显示IP地址因为可能不是通过IP 传输。

 

SSKGXPT 0xd8158fc flags SSKGXPT_READPENDING     info for network 0

socket no 7     IP 140.87.150.21        UDP 58031

sflags SSKGXPT_UP

 

为了鉴别用于CRS/CSS的IP地址,运行“ocrdump /tmp/bla” 命令并在转储文件定位”SYSTEM.css.node_numbers.node<n>.privatename”.

1.2 集群连接

自从连接信息存储在OCR中之后,10g不再需要设置cluster_interconnects参数。尽管这个参数支持指定接口间的负载平衡,但是不提供故障转移功能,如果一个接口失效,会当作全部失效并踢出实例。

 

你仍然可以使用cluster_interconnects 如果是一个IP 地址, 举例来说. 解决网络选择的问题或者出于测试目的对特殊实例使用指定的NIC。

 

 

1.3 NIC 故障转移和负载均衡

上文提到的,我们不建议在客户环境中使用cluster_interconnects来负载均衡。另外,CRS也不支持负载均衡或者故障转移功能。因此,操作系统供应商应该提供一个负载均衡和故障转移的解决方案。我们不知道NIC 配对/结合/中继测试内部是如何执行的,因此没有配置指南或类似的东西。

就目前为止的这些故障转移和负载均衡解决方案来看,基本上都是预故障转移解决方案和故障转移&负载均衡解决方案,后者是首选之一。底层技术由操作系统供应商Cisco授权, 它可以有不同的名字:HP的Autoport aggregation, IBM的Etherchannel, SUN的Trunking 等等。这些解决方案提供一个逻辑IP给最终用户,他们可以指定RAC和CRS的私有连接信息在安装/DBCA过程中。

1.4 用户模式IPC协议

在过去,使用IPC协议而不是UDP或者TCP,前者的低延迟是首选它的原因。但这都是过去的事儿了, 事实表明使用HP的HMP 或者SUN的 RSM IPC协议有着一长串的问题,因此我们不再使用这些IPC协议和硬件技术。HP的 RDG (原Compaq Tru64) 运行良好, 推荐我们使用。

 

因此,通常和首选的建议是使用UDP千兆以太网,HP/UX上的HMPSolaris上的RSM不鼓励使用。

1.5 使用交换机?

 

另一种推荐的网络设置是使用一个交换机即使是2个节点的环境。尽管使用交叉电缆代替交换机比较便宜, 一套多余的交换机可以确保更高的可用性.

1.6 大型尺寸的以太网帧(巨型帧)

 

为了获得重大的性能提升使用IP基础协议,强烈推荐使用巨型帧。然而, 需要主机网卡和交换机支持9K-frame尺寸。 一个大型尺寸的以太网帧避免了包的分片和重组并且相应的内核CPU开销比更小的信息少。

 

在主机上, 巨型帧设置:

 

ifconfig <adapter> mtu 9000

e.g. ifconfig eth2 mtu 9000

 

这里有两种方法检测和确认9K-framesize是否被使用。例如,运行“ifconfig <adapter>” 在主机上会显示MTU:9000.  接下来的命令也适用于9K-framesize已经被设置。运行 “ping” 和 “traceroute”,通过包大小增加,可以探查MTU的大小。运行 “tracepath”, 它跟踪目的地的路径并沿着路径报告MTU。

Oracle RAC集群操作系统最佳实践OS Best Practices

例如:

 

$ ping –s <packet size> –M do <host>[1]

 

举例来说

 

$ ping –s 8972 –M do 10.1.1.5, 应该成功并返回:

PING 10.1.1.5 (10.1.1.5) from 10.1.1.4 : 8972(9000) bytes of data.

8980 bytes from 10.1.1.5: icmp_seq=0 ttl=255 time=455 usec

 

$ ping –s 8973 –M do 10.1.1.5, 应该失败并返回:

PING 10.1.1.5 (10.1.1.5) from 10.1.1.4 : 8973(9001) bytes of data.

ping: sendto: Message too long

 

 

$ traceroute <host> <packet size>

 

举例来说

 

$ traceroute 10.1.1.5 9000, 应该成功并返回:

traceroute to 10.1.1.5 (10.1.1.5), 30 hops max, 9000 byte packets

1  hprr-5_san (10.1.1.5)  0.335 ms    0.282 ms   0.275 ms

 

$ traceroute 10.1.1.5 9001, 应该失败并返回:

traceroute to 10.1.1.5 (10.1.1.5), 30 hops max, 9000 byte packets

traceroute: sendto: Message too long

1 traceroute: wrote 10.1.1.5 9000 chars, ret=-1

 

$ tracepath <host>

 

举例来说

 

$ tracepath 10.1.1.5, should report pmtu 9000 along the path and return:

1: [LOCALHOST]     pmtu 9000

1: hprr-5_san (10.1.1.5)                 0.325ms reached

Resume: pmtu 9000 hops 1 back 1

 

注意正确的IP地址应该由上面的查询提供,例如,如果私有网络设置MTU 9000,那么私有网络必用来代替公共IP地址。

 

注意实例可能启动失败如果网络的一个组件不支持大型尺寸的帧。虽然使用不规则的MTU尺寸仍然可以发送和接收大小小于1500 bytes,但是大的数据包交换还是会挂起或者失败。

 

1.7 spray

我们知道’spray’ 工具可以帮助鉴别网络性能问题是由于一个糟糕的网卡还是一个配置错误的网卡。. ‘spray’ 发送大量的宝(包的数量和大小可以通过命令行参数定于)。如果有大量的包丢失,你应该检查网络配置。 ‘spray’工具可以在Solaris 和 HP/UX.上使用。

 


2 其它的操作系统建议

2.1 NTP 协议

 

我们强烈建议在所有集群节点设置网络时间协议(NTP), 甚至是你在安装RAC之前。这个服务将同步所有节点的时间,并且促进分析基于时间戳的跟踪信息。此外,可能出现一些问题在版本10.2.0.1, 远程复制会出现警告如果远程的节点时间时间提前. 注意调整时间大于15分钟会引起实例被踢出。 强烈建关闭所有实例在时间日期调整之前。.

 

 

 

下面部分提供了指定平台的配置和练习:

 

 

3 HP-UX

3.1 使用异步I/O

因为数据库通常放在裸设备上,防止操作系统不支持集群文件系统强烈建议安装异步I/O设备(asyncdsk) ,创建设备 /dev/async , 并配置内核参数MAX_ASYNC_PORTS 为同时打开的asyncdsk 端口的最大数量,也就是说 MAX_ASYNC_PORTS 限制同时使用/dev/async 的进程的最大数量。作为参考,设置这个参数为参数文件中的PROCESSES+后台进程的数量的和。后台进程在实例启动时会打开/dev/async 两次. 如果达到MAX_ASYNC_PORTS的值,后面的进程会使用同步I/O。

 

3.2 使用 UDP

UDP/IPC 也可以用于像HyperFabric 的硬件. HMP 协议不鼓励使用。.

 

 


4 HP Tru64 Unix

4.1 可靠数据报 (RDG) 协议

 

RDG是Oracle10g默认的IPC协议除了在HP Tru64 Unix 上的RAC环境之外。RDG已经专门的设计和优化来消除通常协议(像TCP和UDP)的性能方面的限制。

 

RDG相关的系统参数使用下面的命令查询:

# /sbin/sysconfig -q rdg

 

最重要的参数设置成:

 

参数 参数值
rdg_max_auto_msg_wires 必须设置成0。
max_objs 应设置成至少 <Oracle 进程数量 * 5> 至多为10240或 <Oracle 进程数量 * 70>.

比如: 5120

msg_size 需要设置成至少<db_block_size>,但是我们建议设置成32768, 因为我们支持每个表空间有不同的数据块大小。
max_async_req 至少设置成100但256+可能提供更好的性能。
max_sessions 应该设置成最少< Oracle 进程数量 + 20>。

比如: 500

Table 19: RDG 相关参数

 

如果因为一些原因UDP必须被取代, 下面的命令展示如何启用/禁用不同的IPC协议。

 

  • 启动 Oracle10g RAC (RDG 默认)

 

cd $ORACLE_HOME/rdbms/lib

make -f ins_rdbms.mk rac_on ioracle

 

 

  • 使用 UDP 作为 IPC 协议

 

cd $ORACLE_HOME/rdbms/lib

make -f ins_rdbms.mk rac_on ipc_udp ioracle

 

alert.log 会指明使用什么协议:

 

cluster interconnect IPC version:Oracle RDG

IPC Vendor 1 proto 2 Version 1.0

 

或者

 

cluster interconnect IPC version:Oracle UDP/IP

IPC Vendor 1 proto 2 Version 1.0

 

 

4.2 集群文件系统(CFS)

 

在5.1或者更高版本的系统中, Tru64 支持 CFS 在集群系统中. CFS 是在AdvFS之上, 所以它继承了许多非集群系统的特点。CFS 也支持并发的直接I/O模式为RAC所用。

4.3 操作系统设置

4.3.1 改善 gettimeofday()的性能

 

除了为了得到时间统计(包括RAC统计值)而设置init.ora参数STATISTICS_LEVEL为TYPICAL (默认)之外, /dev/timedev 设备需要创建在聚群的每个节点(如果节点不存在这设备)

 

# mknod /dev/timedev c 15 0

# chmod ugo+r /dev/timedev (or chmod 644 /dev/timedev)

 

使用/dev/timedev 也可以避免因为Tru64上的NTP问题导致的实例被踢出的潜在威胁 。

 

注意:

 

从Tru64 UNIX V5.1开始, 一个叫做/dev/sysdev0的系统文件可以提供上述功能. 此外, 从Oracle for Tru64 UNIX 9.2.0.4开始, sltrg OSD 被修改打开/dev/sysdev0文件如果 /dev/timedev是无效的话。因此,/dev/timedev不再是必须要创建的设备文件了。

 

4.3.2 异步I/O操作系统参数

 

Tru64 UNIX V5.1 或更高版本, 进程指定参数AIO_TASK_MAX_NUM 应该设置成8193。DBWR I/O 操作的最大默认值是8192, 除非另外指定隐藏参数_DB_WRITER_MAX_WRITES。如果你没有设置这个操作系统参数至少为8193,Oracle性能会减少并且可能发生I/O错误。8193这个值是需要的,因为操作系统储备一个AIO请求为自己本身。

注意:

 

在崩溃恢复和实例恢复中, 我们提交64K异步恢复读。因此,为了更好的恢复性能,我们推荐设置AIO_TASK_MAX_NUM 至少8193.

4.3.3其它操作系统参数

 

Tru64 UNIX V5.1A PK6 或更高 和 Tru64 UNIX V5.1B PK2 或 更低, 你必须编辑接下来的/etc/sysconfigtab中的参数:

 

vfs: fifo_do_adaptive = 0

vm: new_wire_method = 0

vm: vm_bigpg_enabled = 0 (这是默认的)

 

 

Tru64 UNIX V5.1B PK4 或者更高的版本, 你必须在/etc/sysconfigtab编辑下列参数:

 

vfs: fifo_do_adaptive = 0

vm: new_wire_method = 1 (这是默认的)

vm: vm_bigpg_enabled = 0

 

NEW_WIRE_METHOD = 1 已经认证了上面的操作系统版本和补丁包。

 

注意:

 

客户不应该运行Oracle在Tru64 UNIX V5.1B PK3上。同时, 设置FIFO_DO_ADAPTIVE = 0 改善bequeath连接的性能,因为它禁用通过管道批处理数据。最后, 如果NEW_WIRE_METHOD 没有设置成1在上面指定的操作系统版本, AIO 性能会显著下降。实际性能下降50%使用NEW_WIRE_METHOD = 0在Tru64 UNIX V5.1B PK4 或更高版本。

4.4 Init.ora 参数

 

  • MAX_COMMIT_PROPAGATION_DELAY (在2弃用):

 

参考Part I, 部分“13 SCN propagation”.

 

  • _SPIN_COUNT:

 

从Oracle在Tru64 UNIX 9.2.0.5以来, _SPIN_COUNT的默认值开始增长按照下面:
640 * < CPU的数量> Wildfire类型系统

320 * < CPU的数量> Marvel 类型系统

512 * < CPU的数量> 所有其他的系统
高于正常闩的休眠和等待时间可能是由于_SPIN_COUNT设置太低。


5 Sun Solaris

5.1 UDP 协议

我们推荐使用UDP通过千兆以太网在Solaris系统上。在过去使用UDP通过SCI网络表现出性能问题并且不支持也不推荐即使是Sun公司。

 

参考 Part I, 章节 “2.7 gc cr multi block request timeouts and slow performance” 关于UDP缓冲区大小

 

 

6 IBM AIX

6.1 UDP 协议

截至今天AIX 不支持用户模式IPC协议,所以只能选UDP 。这路有一些命令显示和修改UDP发送和接收缓冲区设置:

 

  • 显示所有网络可调整参数的当前值

 

no -a

 

  • 更改UDP发送/接收缓冲区大小

 

no -o udp_sendspace=65536

no -o udp_recvspace=262144

 

将这些添加到/etc/rc.net确保参数生效在每个重启后。Oracle将信任配置并不再内部调整UDP缓冲区大小。如果udp_sendspace 设置太低, 实例将启动失败并报错“ORA-27301: OS failure message: Message too long”。如果你想设置TCP或UDP相关参数(*_sendspace, *_recvspace) 大于64K, 这些需要参数rfc1323设置成1,举例来说

 

rfc1323=1

tcp_sendspace=262144

tcp_recvspace=262144

udp_sendspace=65536

udp_recvspace=262144

 

 


7 Linux

7.1 IPC 协议

Oracle10g 支持 UDP IPC 和 TCP IPC. 我们推荐只使用UDP IPC。

7.1.1 UDP IPC

 

为了最好的连接性能,需要增加UDP相关参数, 因为定义的默认值和最大值会禁止SKGXP 进一步增加:

 

$ /sbin/sysctl net.core.rmem_max

net.core.rmem_max = 131071

$ /sbin/sysctl net.core.wmem_max

net.core.wmem_max = 131071

$ /sbin/sysctl net.core.rmem_default

net.core.rmem_default = 65535

$ /sbin/sysctl net.core.wmem_default

net.core.wmem_default = 65535

 

推荐这些参数至少 256k:

 

# sysctl -w net.core.rmem_max=262144
# sysctl -w net.core.wmem_max=262144
# sysctl -w net.core.rmem_default=262144
# sysctl -w net.core.wmem_default=262144

 

在某些情况下, 例如DB_BLOCK_SIZE>=8k 和 DB_FILE_MULTIBLOCK_READ_COUNT=16, 需要增加参数到 512k。

 

7.2 异步 I/O

Redhat 2.1 AS 和更高版本支持操作系统核心异步I/O 在文件系统和裸设备上。内部测试发现在使用异步I/O时, I/O吞吐量巨大增加. 更多关于启动/禁用异步 I/O, 请参考WebIV Note 205259.1.

 

默认情况下,Oracle10gR1 禁用异步I/O。然而,由于一个bug, 异步 I/O在10.1.0.2将不会启用即使异步 I/O 选项如下 (make -f ins_rdbms.mk async_on).

 

直到10.1.0.3,变通方案是使用下面命令:

 

$ make PL_ORALIBS=-laio -f ins_rdbms.mk async_on

 

7.3 裸设备

对于更大的数据库,需要记住至今为止,RedHat Linux只支持255原始设备。

 

7.4 参考

更多关于linux上的oracle信息可以从[email protected][email protected]   (https://listman.redhat.com/mailman/listinfo/oracle-list) 获取。

 

 

 

8 其它平台

OS/390或VMS与RAC相关的认证和其他信息,访问rac.us.oracle.com 或 WebIV.

[1] In order to use Ping to verify the MTU sizes, “-M do” must be used to prohibit fragmentation. Otherwise, no matter the value of <packet size>, Ping always succeeds.


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *