抽取与传递数据需要配置和调整的信息的类别
l 需要的带宽
l Oracle Net Service 会话数据单元(session data unit,SDU)大小
l TCP套接字缓冲区大小
l 网络设备队列大小
l SRL文件的I/O调整
需要的带宽
可以根据awr或是alter计算高峰期、稳定状态是产生的redo数据,每秒产生的数据量,比如:12MB/S
这里需要提一下是这个的B是字节,要换算成bit才是网络的速度,因为网络所说的带宽是以bit来计算的
比如数据库产生的redo数据是12MB/S那么换成网络的带宽是12MB/S*8=96Mb/S
这个值是不考虑其他因素比如延迟、阻塞等
有人建议需要超出这个值的 20%,也有人建议超过50%
12*
session data unit (SDU)
session data unit (SDU)
A buffer that Oracle Net uses to place data before transmitting it across the network. Oracle Net sends the data in the buffer either when requested or when it is full.
10.2.0 默认大小为2048 bytes (2KB),最小512、最大32768 bytes (32 KB)
11g 默认是8192 bytes (8KB) 最大32767 bytes (32 KB)
Oracle Net在将数据通过网络传输的时候,会首先将数据放在一个缓存里。只有当需要或者缓存满时才会真正的传输。这个缓存就是SDU
对dataguard的优化说明,因为dataguard传递的redo数据要远大于8k,所以会将数据切片,为了减少数据数据切片,所以设置成最大值,来传输数据,尽量不要使用sqlnet.ora,这是全局的设置,会影响其他的正常访问的客户端的响应速度,建议使用tnsname.ora和listener.ora设置单独设置
如果要修改这个值,有两种方式:
1) 为tnsnames.ora或者listener.ora 指定SDU值,例如:
SID_LIST_listener_name=
(SID_LIST=
(SID_DESC=
(SDU=32767)
(SID_NAME=sales)
(ORACLE_HOME=/usr/oracle)))
这样的设定就针对特定的监听器或session的连接。
2)修改sqlnet.ora的DEFAULT_SDU_SIZE值则会修改所有Oracle Net的连接的SDU默认值。
例如在里边添加:DEFAULT_SDU_SIZE=4096
具体这个值调整为多少才是最优化,还需要根据环境测试。但是Oracle官方给出的说明:
Oracle internal testing of Oracle Data Guard has demonstrated that the maximum setting of32767 performs best.
设比默认值更大的值的目的是:当传输同样大小的redo log时可以使用更少的系统调用过程完成。
Oracle的最佳推荐是设置成最大
TCP套接字缓冲区大小
TCP层的多方面中,最重要的是单个TCP连接可以使用的系统内存量。所有系统都对TCP层的内存量施加了内在限制,称之最大TCP缓冲区空间,这个值由操作系统指定。例如:使用sysctl –a ,可以找到最大读和最大写TCP缓存去大小
# 套接字接收缓冲区大小的缺省值 (262144)
net.core.rmem_default = 1048576
# 套接字接收缓冲区大小的最大值 (262144)
net.core.rmem_max = 1048576
# 套接字发送缓冲区大小的缺省值 (262144)
net.core.wmem_default = 262144
# 套接字发送缓冲区大小的最大值 (262144)
net.core.wmem_max = 262144
在调整套接字时,不必更改默认值和最小值,甚至有时最大值也足以满足要求
那么TCP套接字缓冲区大小实际如何工作呢?一个使用TCP网络连接的应用程序可请求超过默认值的更大套接字缓存区,这将为连接分配更大内存空间,实际上增大了连接的可用带宽。随着数据库开始发送重做数据,TCP将缓慢增大缓冲区,直至达到所设置的大小为止。如果有太多网络拥塞,也会缩小缓存区。这个缓存区确定在服务器停下来然后等待接收包确认信息前可传给网络层的数据量,这将严格限制网络吞吐量。
由于数据库生产大量重做数据,将数据放入网络的速度越快,将数据发送给备用数据库并受到保护的速度也就越快。如果网络延迟时间长,情况尤其如此。
如何确定套接字缓冲区的适当大小呢?此时需要引入带宽延迟积(bandwidth-delay-product,BDP)
Dataguard 的可用带宽本质上受BDP的限制,如果BDP小于延迟×可用带宽,dataguard将填不满网络,因为确认消息的返回速度不够快。基本上,套接字缓存区必须足以容纳TCP的全部BDP,至少还需要加上一些操作系统特有的开销,基本计算公式
BDP=带宽×延迟
当然,考虑到开销、意外的网络拥塞以及一般错误,为了尽量提高速度,需要3倍的BDP
Oracle推荐的socket buffer计算方法如下:
socket buffer size = 3 * bandwidth * delay
3是BDP系数,oracle给出的工程经验值。
BDP =bandwidth * delay,其中bandwidth表示带宽,假设我们的带宽为1000Mbps,delay表示主备库之间的网络延迟,假设我们环境为20ms,那么socket buffer size= 3*1000Mbps*25ms/8 = 7500000bytes
TCP socket buffer参数通过SEND_BUF_SIZE/RECV_BUF_SIZE配置,配置方式同SDU。
SID_LIST_listener_name=
(SID_LIST=
(SID_DESC=
(SDU=32767)
(SEND_BUF_SIZE=7500000)
(RECV_BUF_SIZE=7500000)
(SID_NAME=sales)
(ORACLE_HOME=/usr/oracle)))
网络设备队列大小
为了避免tcp上的缓存溢出,需要增加网络设备的队列大小。以Linux为例,存在两种队列:transmit queue(传送队列)/receive queue(接收队列)。
Linux 下txqueuelen默认是100
Ifcong可以查看
经验:如果延迟时间为100ms的Gb网络,那么将txqueuelen至少设置为10000会到来好出
普遍认为接收队列的长度应介于传送队列的3倍或以上
发送队列由txqueuelen控制,接收队列由netdev_max_backlog控制。
echo 1 > /proc/sys/net/ipv4/route/flush
echo 20000 > /proc/sys/net/core/netdev_max_backlog
ifconfig eth0 txqueuelen 10000
SRL文件的I/O调整
最佳实践:
l 确保oracle能够使用ASYNC I/O。注意,默认情况下oracle数据库配置为支持异步I/O.单还必须正确配置操作系统、主机总线适配器(host bus adapter,HBA)驱动程序和存储阵列
l 在所有I/O堆栈层最大化I/O写大小。这些层包括以下一个或多个:操作系统(包括异步写大小)、设备驱动程序、存储网络传输大小和磁盘阵列
l 将SRL文件布置到ASM磁盘组上,该磁盘组磁盘数量至少与保持住ORL的ASM磁盘组的一样多
l 不要使用(multiplex)SRL文件。因为如果一个SRL文件失效了,dataguard会立即请求归档日志的新副本,实际上没有必要使每个文件有多个副本
l 与使用映像配置的RAID控制器相比,在RAID5中配置的RAID的控制器的写入速度更慢,如果写入到SRL的操作成了瓶颈,应该考虑更改RAID配置
调整恢复速率的六大因素
介质恢复期间,oracle在每个日志边界(日志切换)执行完整的检查点操作并更新所有文件头
建议增加主数据库ORL以及备用数据库SRL的大小,使日志切换至少有15分钟的间隔时间
在托管恢复期间使用并行选项
实现实时应用
这项建议并不直接影响恢复速率,但直接影响(提高)恢复时间目标
介质恢复取决于DBWR尽可能高效地修改过的块从缓冲区高速缓存写入磁盘的能力
DBWR进程拥有足够大的I/O带宽来执行此任务非常重要,要增加DBWR吞吐量,始终通过设置DISK_ASYNC_IO=TURE(默认)来使用本地异步I/O。极少数情况下,异步I/O不可用,则DBWR_IO_SLAVES来提高异步I/O下的数据块的写效率
与所有数据库恢复案例一样,最重要的是I/O带宽
Oracle介质恢复由I/O带宽驱动,并主要取决于I/O带宽,如果没有足够大的I/O带宽,应用进程将停滞
介质恢复极大地依赖oracle缓冲区高速缓存
因此一个大数据库缓存可显著提高介质恢复性能