<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; Mellanox</title>
	<atom:link href="https://zohead.com/archives/tag/mellanox/feed" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>SMB 3.0 over RDMA 性能测试</title>
		<link>https://zohead.com/archives/smb3-over-rdma-performance/</link>
		<comments>https://zohead.com/archives/smb3-over-rdma-performance/#comments</comments>
		<pubDate>Fri, 13 Jul 2012 17:23:33 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[存储]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[Infiniband]]></category>
		<category><![CDATA[Mellanox]]></category>
		<category><![CDATA[NetPIPE]]></category>
		<category><![CDATA[OpenSM]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[RDMA]]></category>
		<category><![CDATA[SMB]]></category>
		<category><![CDATA[SMB2]]></category>
		<category><![CDATA[Win8]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[共享]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=275</guid>
		<description><![CDATA[关于 SMB 3.0 over RDMA Windows Server 2012 （之前的名字就是 Windows Server 8）即将到来，近日看到原来 Windows Server 8 中新增的 SMB 2.2 文件共享协议也有了新的官方名称：SMB 3.0，看看这个介绍说明： http://blogs.technet.com/b/windowsserver/archive/2012/04/19/smb-2-2-is-now-smb-3-0.aspx SMB 3.0 相对于 Windows Server 2003 以及以前的操作系统中的 SMB 1.0 协议增加了很多新的特性： 精简 S [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>关于 SMB 3.0 over RDMA</h2>
<p>Windows Server 2012 （之前的名字就是 Windows Server 8）即将到来，近日看到原来 Windows Server 8 中新增的 SMB 2.2 文件共享协议也有了新的官方名称：SMB 3.0，看看这个介绍说明：</p>
<p><a href="http://blogs.technet.com/b/windowsserver/archive/2012/04/19/smb-2-2-is-now-smb-3-0.aspx" target="_blank">http://blogs.technet.com/b/windowsserver/archive/2012/04/19/smb-2-2-is-now-smb-3-0.aspx</a></p>
<p>SMB 3.0 相对于 Windows Server 2003 以及以前的操作系统中的 SMB 1.0 协议增加了很多新的特性：</p>
<ul>
<li>精简 SMB 1.0 中繁多的命令，减少 ACK 提高效率；</li>
<li>支持流水线机制，可以在上一个 SMB 命令未完成之前发新的命令；</li>
<li>支持符号链接，支持更大的文件块大小提高大块文件读写的性能；</li>
<li>更好的 oplock 机制；</li>
<li>更像真正的文件系统，原来不能安装在 SMB 共享中的程序（例如：SQL Server）也可以使用了；</li>
<li>支持通过 RDMA（Remote Direct Memory Access） 远程直接访问数据提高在 Infiniband 等环境下的性能；</li>
<li>多通道支持，通过多网络通道提高性能，而且支持错误容忍和集群。</li>
</ul>
<p>刚好旁边有两张 Mellanox 的 Infiniband 卡，顺便就来看看 SMB 3.0 over RDMA 的实际读写性能怎么样咯。由于 SMB 3.0 只有 Windows Server 8 或者 Windows Server 2012 才支持，因此用 Windows Server 8 的测试 ISO 安装并拷贝了一份系统（服务器和客户端都必须支持 SMB 3.0）。</p>
<h2>测试环境</h2>
<p>服务器：</p>
<hr size="1" />
<p>Intel S5500BC 服务器主板；<br />
Intel Xeon E5506 CPU * 1；<br />
Kingston DDR3 1066 4G 服务器内存 * 1；<br />
Mellanox MHQH29B ConnectX®-2 系列 32Gbps Infiniband 卡（PCI-E x 8 插槽）；<br />
Adaptec RAID 51645 PCIe SAS RAID卡；<br />
WD WD10EVDS 1TB SATA 监控硬盘 * 16；<br />
Windows Server 8 Beta Datacenter Build 8250 64位中文版；<br />
IPoIB 网卡 IP 地址：<strong><span style="color: #008000;">192.168.3.196（MTU：4092）<br />
</span></strong></p>
<p>客户端：</p>
<hr size="1" />
<p>TYAN S7002 服务器主板；<br />
Intel Xeon E5506 CPU * 1；<br />
Kingston DDR3 1066 2G 服务器内存 * 1；<br />
Mellanox MHQH19B ConnectX®-2 系列 32Gbps Infiniband 卡（PCI-E x 16 插槽）；<br />
Windows Server 8 Beta Datacenter Build 8250 64位中文版；<br />
IPoIB 网卡 IP 地址：<strong><span style="color: #008000;">192.168.3.172（MTU：4092）</span></strong></p>
<p>其它环境：</p>
<hr size="1" />
<p>由于没有 Infiniband 交换机，故测试时服务器和客户端的 Infiniband 卡通过 Mellanox MCC4Q30C-003 QSFP 线缆直连，而且客户端的 Infiniband 卡只有一个接口，所以也只测试了单口的性能，没有测试 SMB 3.0 多通道下的性能。</p>
<p>测试软件：</p>
<hr size="1" />
<p>IBM Tivoli SANergy（测试大块文件连续读写）；<br />
Iometer（测试大块文件并发读写）；<br />
NetPIPE（测试 IPoIB （IP over Infiniband） 的纯粹网络性能）；<br />
Mellanox 驱动程序中的 IB Tools（启动 SM 并测试纯粹 Infiniband 性能）</p>
<h2>测试步骤及结果</h2>
<h3>安装 Mellanox Infiniband 驱动程序</h3>
<p>虽然 Windows Server 8 中已经自动 Mellanox Infiniband 的驱动，但为了更新 firmware 并能使用上软件 SM（没 Infiniband 交换机滴说 -_-#），必须更新官方的驱动，到下面的网址下载新驱动：</p>
<p><a href="http://www.mellanox.com/content/pages.php?pg=products_dyn&amp;product_family=129&amp;menu_section=34" target="_blank">http://www.mellanox.com/content/pages.php?pg=products_dyn&amp;product_family=129&amp;menu_section=34</a></p>
<p>安装 Mellanox OFED for Windows Server 2012，建议安装时按照下面的提示更新卡的 firmware 以免带来不必要的问题：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/mlnx-firmware.png" target="_blank"><img class="alignnone" title="更新 Mellanox firmware" src="https://zohead.com/wp-content/uploads/smb3oib/mlnx-firmware.png" alt="更新 Mellanox firmware" width="514" height="393" /></a></p>
<p>安装完成之后重启服务器和客户端，你会发现 “网络连接” 里已经有了 Mellanox 的 IPoIB 网卡，但是是 “未连接” 的状态，因为 Infiniband 网络里还没有配置 SM（Subnet Manager）。</p>
<p>先来简单了解下 Infiniband 的 Subnet Manager：</p>
<p>Infiniband（IB） 网络中需要使用 Subnet Manager（SM）来初始化 IB 硬件并允许其在 IB 架构中通信。每个 IB 子网必须有至少一个 SM，并且每个 SM 在 IB 架构中要有清楚的 ID。IB 架构就包含已经定义好的子网。IB 交换机和 IB 卡一样有自己的 GUID，主机适配卡（HCA）的端口被称为 port GUID，当一个 HCA 或者它的端口需要与子网中的另一个进行通信就需要分配网络地址，这些网络地址被称为 LID，而 IB 中的 SM 就负责为子网中的成员分配 LID，LID 只是对子网而言的，而 GUID 则是对整个 IB 架构中所有子网相同的。</p>
<p>IB 交换机一般就可以充当 SM 的角色，对于我这没有 IB 交换机的环境，幸好咱们还是有穷人的方法的，使用免费的 OpenSM 软件可以让两个机器中的任意一台做软件 SM。</p>
<h3>在服务器中启用 OpenSM</h3>
<p>OpenSM 在安装 Mellanox 驱动程序时已经自带，下面会用到的 ibstat、ibnetdiscover、ibping 等命令属于的 Mellanox IB Tools 也在安装驱动时一并安装了，里面包含了一堆实用的 IB 调试工具哦。</p>
<p>打开 Windows Server 8 中默认就自带的 Windows PowerShell，输入下面的命令进行安装，有关 Windows Server 8（2012）的 PowerShell 帮助信息请猛击 [<a href="http://technet.microsoft.com/en-us/library/hh801904" target="_blank">这里</a>]：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/install-opensm-win8.png" target="_blank"><img class="alignnone" title="安装 OpenSM" src="https://zohead.com/wp-content/uploads/smb3oib/install-opensm-win8.png" alt="安装 OpenSM" width="640" height="150" /></a></p>
<p>如图所示，先用 <strong>sc query opensm</strong> 命令查询 OpenSM 服务是否安装了。如果没有安装就使用 PowerShell 中的 <strong>New-Service</strong> 命令创建 OpenSM 服务并设置为开机自动启动，服务路径在 Mellanox 驱动安装路径下。</p>
<p>最后运行 <strong>Start-Service OpenSM</strong> 命令启动 OpenSM 服务，启动成功之后 Mellanox IPoIB Adapter 网卡的状态就变为 “已连接” 了哦。</p>
<p>在服务器和客户端中分别给 IB 网卡配置固定的 IP 地址，假设服务器 IP 地址为 <strong><span style="color: #008000;">192.168.3.196</span></strong>，客户端 IP 地址为 <strong><span style="color: #008000;">192.168.3.172</span></strong>。</p>
<p>在设备管理器或者网络连接中 IB 网卡的高级属性中可以看到 IB 网卡的详细信息：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/mlnx-ipoib-adapter.png" target="_blank"><img class="alignnone" title="IPoIB 网卡状态" src="https://zohead.com/wp-content/uploads/smb3oib/mlnx-ipoib-adapter.png" alt="IPoIB 网卡状态" width="479" height="545" /></a></p>
<p>其中可以看到 PCI-E 插槽的速度，Infiniband 卡型号，MAC 地址，IP地址，连接速度（本次测试中我用到的 IB 卡的速度就是 32Gbps 的哦）等信息。</p>
<h3>检查 Infiniband 连接</h3>
<p>在任意一台主机上运行 <strong>ibstat</strong> 命令可以看到本机的 IB 端口状态，其中包括 HCA 卡上不同端口的连接状态、GUID、SM LID 等信息：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/ibstat-guid.png" target="_blank"><img class="alignnone" title="ibstat 查看 IB 端口状态" src="https://zohead.com/wp-content/uploads/smb3oib/ibstat-guid.png" alt="ibstat 查看 IB 端口状态" width="640" height="525" /></a></p>
<p>运行 <strong>ibstat -p</strong> 命令可以只查看本机的 IB 端口 GUID 列表。</p>
<p>同样在 PowerShell 中运行 <strong>ibnetdiscover</strong> 命令检查是否能看到连接到本机的其它 IB 主机：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/ibnetdiscover-output.png" target="_blank"><img class="alignnone" title="ibnetdiscover 查找 IB 网络" src="https://zohead.com/wp-content/uploads/smb3oib/ibnetdiscover-output.png" alt="ibnetdiscover 查找 IB 网络" width="640" height="213" /></a></p>
<p>可以看到输出中除了自己（WIN-31E0THJOKV3 主机）之外还有客户端（WINSVR8-FULL 主机），这里也能看到各自 IB 端口的 GUID 哦（分别为 2c903000d2031 和 2c903000dcf23）。</p>
<p>通过 <strong>ibnetdiscover</strong> 知道对方的 GUID 之后就可以使用 <strong>ibping</strong> 命令 PING 对方主机的 GUID 能是否能连通：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/ibping-output.png" target="_blank"><img class="alignnone" title="ibping 检查是否连通" src="https://zohead.com/wp-content/uploads/smb3oib/ibping-output.png" alt="ibping 检查是否连通" width="506" height="160" /></a></p>
<p>可以看到普通 ping 命令类似的输出，能看到正确的响应时间，证明 IB 网络已经通啦。</p>
<h3>测试纯粹 Infiniband 性能</h3>
<p>我们先来测试下不走 IP 协议情况下纯粹的 Infiniband 的性能，使用 Mellanox IB Tools 中的工具可以完成此测试，同样都在 PowerShell 中完成。</p>
<p>在服务器中运行 <strong>ib_read_bw</strong> 命令（不加任何参数），在客户端中运行 <strong>ib_read_bw 192.168.3.196</strong> 开始进行 Infiniband 读带宽的测试（<strong><span style="color: #008000;">192.168.3.196</span></strong> 为服务器的 IB 网卡的 IP 地址）。类似的使用 <strong>ib_write_bw</strong> 命令可以测试写带宽的性能。</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/ib-read-write-bw.png" target="_blank"><img class="alignnone" title="测试纯粹 Infiniband 带宽" src="https://zohead.com/wp-content/uploads/smb3oib/ib-read-write-bw.png" alt="测试纯粹 Infiniband 带宽" width="640" height="352" /></a></p>
<p>可以看到读带宽为 <strong><span style="color: #008000;">2275.69 MB/s</span></strong>，写带宽为 <strong><span style="color: #008000;">2850.94 MB/s</span></strong>，这个速度已经和 32Gbps 的 IB 理论连接速度有点接近了，算是能满足要求了。</p>
<p>再来看看纯粹 Infiniband 的读写延迟，使用 <strong>ib_read_lat</strong> 和 <strong>ib_write_lat</strong> 命令进行测试，使用方式和上面的类似。</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/ib-read-write-lat.png" target="_blank"><img class="alignnone" title="测试纯粹 Infiniband 延迟" src="https://zohead.com/wp-content/uploads/smb3oib/ib-read-write-lat.png" alt="测试纯粹 Infiniband 延迟" width="640" height="305" /></a></p>
<p>可以看到读延迟为 <strong><span style="color: #008000;">2.40 微秒</span></strong>，写延迟为 <strong><span style="color: #008000;">1.44 微秒</span></strong>，这个表示还是比较令人满意的。 ^_^</p>
<h3>测试 IPoIB 的纯粹网络性能</h3>
<p>看到了上面不错的纯粹 Infiniband 性能数据，对 IPoIB 的表现有点期待了。</p>
<p>刚开始没找到比较好的 Windows 下的 IPoIB 测试软件，就先直接用原来一直用的 Windows 下的 iperf 测试软件来测试 TCP 连接时的纯粹网络性能了。</p>
<ul>
<li>做 iperf 服务端的机器运行：<strong>iperf -s -w 1m</strong>（指定测试时的 TCP window 大小为 1MB）；</li>
<li>做 iperf 客户端的机器运行：<strong>iperf -c 192.168.3.196 -w 1m -t 30</strong>（假设 192.168.3.196 为 iperf 服务器机器的 IB 网卡的 IP 地址，指定测试时的 TCP window 大小为 1MB，持续 30 秒钟写数据）。</li>
</ul>
<p>iperf 的最终测试结果如下：</p>
<hr size="1" />
<p>SMB 服务器做 iperf 的服务端：<strong><span style="color: #008000;">7.29 Gbps</span></strong><br />
SMB 客户端做 iperf 的服务端：<strong><span style="color: #008000;">5.48 Gbps</span></strong></p>
<hr size="1" />
<p>有点不满意这结果，后来终于找到一个比较好的 IPoIB 测试软件：NetPIPE，NetPIPE 可以实现协议无关的测试，支持 RDMA、IPoIB、TCP/IP 等。NetPIPE 软件虽然也是 Unix 系统下的，但已经有热心的网友将其 TCP（IPoIB）版的程序 NPtcp 稍作修改移植到 Windows 上了。</p>
<p>有关 NetPIPE 的介绍请参考其官网：<a href="http://www.scl.ameslab.gov/netpipe/" target="_blank">http://www.scl.ameslab.gov/netpipe/</a></p>
<p>NPtcp 的 64 位和 32 位 Windows 移植版本我已经搬运回来，到下面的网址下载即可（Windows Server 8 只有 64 位的就用其 64 位版本 NPtcp64.exe 了）：</p>
<p><a href="http://miseal.googlecode.com/files/NPtcp-windows.zip" target="_blank">http://miseal.googlecode.com/files/NPtcp-windows.zip</a></p>
<p>NetPIPE 使用起来很简单：</p>
<ul>
<li>做服务端的机器不带任何参数运行 <strong>NPtcp64</strong>；</li>
<li>做客户端的机器上运行 <strong>NPtcp64 -h 192.168.3.196</strong> 即可得到测试结果。</li>
</ul>
<p>NetPIPE 在测试时会从 1 开始一直往上增加网络读写操作的块值。</p>
<p>IPoIB 的纯粹网络性能测试结果如下图所示：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/netpipe-ipoib-server.png" target="_blank"><img class="alignnone" title="服务器做 NetPIPE 服务端 IPoIB 的网络性能" src="https://zohead.com/wp-content/uploads/smb3oib/netpipe-ipoib-server.png" alt="服务器做 NetPIPE 服务端 IPoIB 的网络性能" width="615" height="425" /></a></p>
<p>上图的测试结果为 SMB 服务器做 NetPIPE 服务端时的结果，当网络读写的块值达到 1048576 也即 1MB 时，网络性能达到最高峰 <strong><span style="color: #008000;">7686.283 Mbps</span></strong>，在 1MB 读写块值的旁边性能会有所下降。</p>
<p>SMB 客户端做 NetPIPE 服务端时的网络性能与上面差不多一直，这里就不再列出来了。</p>
<p>从 NetPIPE 的测试结果来看，其还算是符合 iperf 的测试结果的，但与纯粹 Infiniband 的速度相差的确实在太多（有 3~4 倍了），看来 IPoIB 的性能损失确实是比较大的。</p>
<h3>确认 SMB 3.0 over RDMA 是否可用</h3>
<p>为了最大程度上体现 SMB 3.0 over RDMA 的性能，这里我们在检查 RDMA 是否可用的基础上又检查了 RSS（Receive Side Scaling 接收端缩放处理数据）、NetworkDirect 等是否可用，这样如果你的硬件环境充足，完全可以让 SMB 3.0 的多通道测试正常跑起来。如果你只需要和我一样测试 SMB 3.0 over RDMA，那可以忽略 RSS 之类的检查。</p>
<p>简单说下 SMB 3.0 的多通道需要的条件：</p>
<ul>
<li>两台计算机必须都为 Windows Server 8 或者 2012；</li>
<li>必须都有多个网卡，网卡速度需要一致；</li>
<li>其中一个或多个网卡支持 RSS 或者 NIC Teaming（网卡绑定）或者 RDMA。</li>
</ul>
<p>首先在 PowerShell 下通过 <strong>Get-NetAdapter</strong> 命令得到所有网卡列表，输出中包含网卡序号、型号、连接速度、连接状态、MAC 地址等信息：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter.png" target="_blank"><img class="alignnone" title="Get-NetAdapter 得到网卡列表" src="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter.png" alt="Get-NetAdapter 得到网卡列表" width="640" height="89" /></a></p>
<p>通过 <strong>Get-NetOffloadGlobalSetting</strong> 命令检查 Network Direct 设置是否已启用：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-check-networkdirect.png" target="_blank"><img class="alignnone" title="检查 Network Direct 是否已启用" src="https://zohead.com/wp-content/uploads/smb3oib/psh-check-networkdirect.png" alt="检查 Network Direct 是否已启用" width="628" height="48" /></a></p>
<p>Network Direct 是一种从 Windows HPC Server 2008 系统开始引入的新的低延迟 RDMA API，一般默认都是启用的，SMB 3.0 over RDMA 就是基于 Network Direct API 来实现的。</p>
<p>通过 <strong>Get-NetAdapterRDMA</strong> 命令检查本机的网卡上是否已启用 RDMA：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter-rdma.png" target="_blank"><img class="alignnone" title="检查 RDMA 是否已启用" src="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter-rdma.png" alt="检查 RDMA 是否已启用" width="597" height="96" /></a></p>
<p>从上面可以明显的看出来此机器上的两个 IB 端口都已经默认启用 RDMA。</p>
<p>通过 <strong>Get-NetAdapterRSS</strong> 命令检查本机的网卡上是否已启用 RSS：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter-rss.png" target="_blank"><img class="alignnone" title="检查 RSS 是否已启用" src="https://zohead.com/wp-content/uploads/smb3oib/psh-getadapter-rss.png" alt="检查 RSS 是否已启用" width="640" height="452" /></a></p>
<p>已启用 RSS 的网卡的 IndirectionTable 中会有有效的信息，由于这台服务器上有一个 IB 网卡没有接线缆，因此上面的 IB 网卡没有启用 RSS。</p>
<p>通过 <strong>Get-SmbServerConfiguration</strong> 和 <strong>Get-SmbClientConfiguration</strong> 命令分别在服务器和客户端上检查 SMB 多通道是否已启用：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/smb-multichannel.png" target="_blank"><img class="alignnone" title="检查 SMB 多通道是否已启用" src="https://zohead.com/wp-content/uploads/smb3oib/smb-multichannel.png" alt="检查 SMB 多通道是否已启用" width="575" height="79" /></a></p>
<p>SMB 多通道默认在系统中都是启用的，无特殊原因都不需要禁用。</p>
<p>在客户端中用 <strong>Get-SmbClientNetworkInterface</strong> 命令检查用于 SMB 的网卡列表是否启用 RSS 和 RDMA：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-getsmbclient-interface.png" target="_blank"><img class="alignnone" title="检查 SMB 客户端网卡是否启用 RSS 和 RDMA" src="https://zohead.com/wp-content/uploads/smb3oib/psh-getsmbclient-interface.png" alt="检查 SMB 客户端网卡是否启用 RSS 和 RDMA" width="640" height="118" /></a></p>
<p>从上面的输出中可以看到客户端中的第一个网卡（即 32Gbps 的 IPoIB 网卡）已经启用 RSS 和 RDMA，而已经接了网线的最后两个千兆网卡则只启用了 RSS 但 RDMA 没有作用（本身硬件不支持哦）。</p>
<p>类似的可以在服务器中用 <strong>Get-SmbServerNetworkInterface</strong> 命令检查用于 SMB 的网卡列表是否启用 RSS 和 RDMA：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/psh-getsmbserver-interface.png" target="_blank"><img class="alignnone" title="检查 SMB 服务器网卡是否启用 RSS 和 RDMA" src="https://zohead.com/wp-content/uploads/smb3oib/psh-getsmbserver-interface.png" alt="检查 SMB 服务器网卡是否启用 RSS 和 RDMA" width="640" height="82" /></a></p>
<p>可以看到 IPoIB 网卡的 RSS 和 RDMA 已启用，两个千兆网卡中一个 RSS 已启用，而另一个则不支持。</p>
<p>由于本次主要测试目的在 RDMA 测试，多通道 RDMA 暂时也没有条件，最终可以在服务器上用 <strong>netstat -xan</strong> 命令查看 SMB RDMA 端口是否已经在正确的监听处理了：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/check-smb-rdma-port.png" target="_blank"><img class="alignnone" title="检查 SMB RDMA 端口" src="https://zohead.com/wp-content/uploads/smb3oib/check-smb-rdma-port.png" alt="检查 SMB RDMA 端口" width="640" height="41" /></a></p>
<p>通过输出可以看到在服务器上，系统已经在 445（SMB 服务端口）上处理 RDMA 数据了。</p>
<h3>测试 SMB 3.0 over RDMA 性能</h3>
<p>此时环境已经全部准备好了，在服务器上用 16 个硬盘建 RAID0，启用所有缓存以求达到最高性能。接着在创建好的 RAID0 磁盘阵列上建 NTFS 分区，并建立 SMB 文件共享。</p>
<p>首先在服务器上使用 IBM Tivoli SANergy 软件测试 RAID0 磁盘阵列本地连续读写的性能：</p>
<hr size="1" />
<p>1MB 连续写性能：<strong><span style="color: #008000;">735.80 MB/s</span></strong><br />
1MB 连续读性能：<strong><span style="color: #008000;">956.77 MB/s</span></strong></p>
<hr size="1" />
<p>与预期的比较接近，然后在客户端上通过映射网络驱动器映射 SMB 共享，可以在客户端 PowerShell 下使用下面的命令确定 SMB 是否确实使用 RDMA：</p>
<p><strong>Get-WinEvent -LogName Microsoft-Windows-SMBClient/Operational | ? Message -match "RDMA"</strong></p>
<p>这条命令会在事件日志中查找 SMBClient 的包含 “RDMA” 字符串的日志并显示出来。</p>
<p>你也可以直接打开 “事件查看器”，然后打开 “应用程序和服务日志” - “Microsoft” - “Windows” - “SMBClient” 子项，在其 “Operational” 事件日志中可以找到 SMB 客户端连接时的日志，如果使用了 RDMA，会很容易看出来，如下图所示：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/smbclient-rdma-event.png" target="_blank"><img class="alignnone" title="通过 SMB 连接日志确认 RDMA 连接" src="https://zohead.com/wp-content/uploads/smb3oib/smbclient-rdma-event.png" alt="通过 SMB 连接日志确认 RDMA 连接" width="640" height="362" /></a></p>
<p>图中就表示从本机连接 SMB 服务器 <strong><span style="color: #008000;">192.168.3.196</span></strong> 时使用了 RDMA。</p>
<p>确认客户端和服务器之间的 SMB 连接使用 RDMA 之后，就可以开始测试了。首先使用 IBM Tivoli SANergy 软件测试下大块文件的连续读写，结果如下：</p>
<hr size="1" />
<p>1MB 连续写性能：<strong><span style="color: #008000;">501.98 MB/s</span></strong><br />
1MB 连续读性能：<strong><span style="color: #008000;">626.02 MB/s</span></strong></p>
<hr size="1" />
<p>和刚才的 RAID0 本地读写速度相比，读写性能损失又有不少，但勉强能接受。</p>
<p>贴上连续读写时 SMB 服务器的 CPU 占用图：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/server-cpu-usage-normal.png" target="_blank"><img class="alignnone" title="连续读写时 SMB 服务器的 CPU 占用" src="https://zohead.com/wp-content/uploads/smb3oib/server-cpu-usage-normal.png" alt="连续读写时 SMB 服务器的 CPU 占用" width="500" height="290" /></a></p>
<p>从测试时的 CPU 占用曲线来看，SMB 服务器的 CPU 占用在 3% ~ 5% 之间，RDMA 的效果还是比较明显的。</p>
<p>下面则是用 Iometer 软件来看看连续并发读写情况下的性能：</p>
<hr size="1" />
<p>1MB 连续并发写性能：<strong><span style="color: #008000;">958.81 MB/s</span></strong><br />
1MB 连续并发读性能：<strong><span style="color: #008000;">784.95 MB/s</span></strong></p>
<hr size="1" />
<p>这个好歹能和纯粹的 IPoIB 网络性能接近了，SMB 3.0 over RDMA 的测试可以交差了。</p>
<p>这是并发读写时 SMB 服务器的 CPU 占用图：</p>
<p><a href="https://zohead.com/wp-content/uploads/smb3oib/server-cpu-usage-outstanding.png" target="_blank"><img class="alignnone" title="并发读写时 SMB 服务器的 CPU 占用" src="https://zohead.com/wp-content/uploads/smb3oib/server-cpu-usage-outstanding.png" alt="并发读写时 SMB 服务器的 CPU 占用" width="512" height="290" /></a></p>
<p>客户端 Iometer 在做并发读写测试时，SMB 服务器的 CPU 占用在 8% ~ 11% 之间，也还是非常不错的。</p>
<p>Windows Server 8 上的 Infiniband 和 SMB 搞定，至此测试结束。</p>
<h2>总结</h2>
<p>从结果来看，Windows Server 8 上 Mellanox 的 Infiniband 卡本身的性能和延迟还是比较不错，但 IPoIB 的性能确实是相对比较差，但和上次在 Linux 上 IPoIB 的结果来看表现还是略胜一筹，而 SMB 3.0 over RDMA 对比上次在 Linux 上的 SRP 的测试性能也是比较接近的，总体看来微软新推出的 SMB 3.0 还是比较值得期待的（PS：微软已经为嵌入式 Linux 提供 SMB 2.0 的工具和 SDK 了）。</p>
<p>参考链接：</p>
<ul>
<li><a href="http://www.mellanox.com/pdf/whitepapers/WP_Deploying_Windows_Server_IB.PDF" target="_blank">http://www.mellanox.com/pdf/whitepapers/WP_Deploying_Windows_Server_IB.PDF</a></li>
<li><a href="http://technet.microsoft.com/en-us/library/dd391826(v=ws.10)" target="_blank">http://technet.microsoft.com/en-us/library/dd391826(v=ws.10)</a></li>
<li><a href="http://blogs.technet.com/b/josebda/archive/2012/05/14/the-basics-of-smb-multichannel-a-feature-of-windows-server-2012-and-smb-3-0.aspx" target="_blank">http://blogs.technet.com/b/josebda/archive/2012/05/14/the-basics-of-smb-multichannel-a-feature-of-windows-server-2012-and-smb-3-0.aspx</a></li>
</ul>
<p>本次性能测试为笔者为 SMB 3.0 over RDMA 特意做的，没有考虑到通用性，文中有任何错误或问题欢迎指正咯 ^_^</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/smb3-over-rdma-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
