频道栏目
读书频道 > 数据库 > Oracle > Oracle Exadata技术详解
3.3.3 SDP协议
2015-11-03 15:11:44     我来说两句
收藏   我要投稿

本文所属图书 > Oracle Exadata技术详解

本书作为国内第一本关于Oracle Exadata一体机的中文教程,偏重于实践方面,同时加入了更多V2版本以后的新内容。全书可分为三个部分。第一部分为基础篇(1~5章),主要介绍了Oracle Exadata一体机的配置、架构  立即去当当网订购

知道并且使用过RDS协议的人不少,但是可能有不少人都没有听过SDP协议。SDP的全称是Sockets Direct Protocol(套接字直接协议),它是InfiniBand Trade Association (IBTA)制定的基于infiniband的一种协议,它允许用户将已有的使用TCP/IP协议的程序运行在高速的infiniband之上。之所以引入SDP,主要的原因有两点。

SDP协议能够将已有的基于sockets的程序透明地运行在infiniband之上;

SDP协议在充分利用infiniband的高带宽的同时保持很低的开销。

基于此,SDP的整体架构相比TCP/IP协议栈更加精简,如图3-5所示。


 

Oracle早在10g时代就支持SDP协议了,只是没有专门的文档说明具体应该如何实现,究其原因主要是infiniband在Oracle 10g那个时代并不普及,所以在这个版本中SDP属于试验性的功能。从Oracle Database 11g开始,Oracle 开始正式支持SDP协议。通过一个Oracle Application Server端的驱动,SDP协议可以与TCP/IP协议栈进行透明转换。

Oracle支持两种不同版本的SDP协议:Transparent SDP和Native SDP。Transparent SDP是指在应用程序端无须任何修改就能使用的SDP协议。它的实现方式是将TCP连接转化为SDP连接,故在应用程序层面无需进行任何修改,在数据库层面也只需要进行一些很简单的配置。有兴趣的读者可以参考HP InfiniBand solution for Oracle Application Server这篇文章进行配置,这里不再详述。Native SDP是Oracle Database 10gR2的新特性。Native SDP是指在listener和TNS中显式指明使用的协议为SDP,例如加上关键字protocol=sdp,Native SDP协议的配置方法可以在Oracle Net High-Speed Interconnect Support白皮书中找到。如果更早的版本需要使用SDP协议,就只能使用Transparent SDP。

除此以外,Transparent SDP和Native SDP的最大区别就是:Transparent SDP只支持同步I/O(Synchronous I/O),而Native SDP则支持异步I/O(Asynchronous I/O)。所以理论上Native SDP可以提供更好的性能,而Transparent SDP相对于Native SDP来说性能较差,但是其优势在于无需应用程序端做任何修改。即便如此,目前使用Transparent SDP的inf

iniband依然要比基于TCP/IP的以太网提供更高的带宽/速率。

目前Transparent/Native SDP支持的驱动包括:

Oracle Call Interface drivers;
JDBC OCI driver;
JDBC thin driver(Oracle 10g的Native SDP不支持JDBC thin driver)。

图3-6左侧是传统以太网TCP/IP协议栈的拓扑结构,右侧是infiniband使用SDP协议的拓扑结构。读者可以通过对比发现其异同。

SDP在传输数据的过程中也有两种I/O模式,即Buffer Copy(Bcopy)和Zero Copy(Zcopy),如图3-7所示。
   

 

那么到底什么是Buffer Copy,什么是Zero Copy,两者有什么区别呢?这就需要先回顾操作系统中的知识了。

Linux操作系统为例(其他操作系统类似),如图3-8所示,Linux的传统I/O操作实际上是一种缓冲I/O,在进行数据传输时通常需要在缓冲区中经过多次数据拷贝。传统的操作系统在将数据发送到网卡的过程中都需要经过两次CPU Copy(见图3-8,实际上将数据从hard driver拷贝到kernel buffer需要一次DMA copy,将数据从socket buffer拷贝到protocol engine也需要一次DMA copy。所以整个过程一共需要进行四次copy操作)。

在应用程序态开辟一段user buffer,然后将位于内核态的kernel buffer拷贝过来,这个过程是通过调用read()函数来完成的。

将user buffer的数据拷贝发送到网络堆栈相关的socket buffer上,socket buffer是位于内核态的。这个过程通过write()函数来完成。


 

每进行一次CPU Copy操作,CPU都需要为此进行一次上下文切换(context switch)。而这些上下文操作在操作系统中的开销是比较高的,大量数据的传输必然会带来相当程度的CPU消耗。

Zero Copy则可以绕过内核态与用户态的交互,直接实现内核态与内核态的拷贝。所以拷贝的效率比Buffer Copy高很多。

图3-9所示的是Zero Copy最简单的一种场景:将数据发送到网卡的过程中,只需要一次CPU Copy,即直接从kernel buffer拷贝到socket buffer,这个过程相比于Buffer Copy,能节省两次CPU的上下文切换(context switch)。由此可见,Zero Copy不仅能利用infiniband的介质提高带宽和传输速率,同时也降低了CPU的功耗。


 

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.3.2 RDS协议
下一篇:3.3.4 iDB协议
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站