微软的私有云存储协议SMB 3.0的多通道应用

  1. 云栖社区>
  2. 博客>
  3. 正文

微软的私有云存储协议SMB 3.0的多通道应用

余二五 2017-11-07 13:40:00 浏览851
展开阅读全文

Repost》》》》》

鉴于之前用心写的这个博客可能比较冷僻,但是我感觉又很有用,因此放上我在Technet网络广播中针对这个题材课程以及演示下载链接,供大家参考。

http://technet.microsoft.com/zh-cn/hh763481.aspx

SMB简介

服务器消息块 (SMB) 协议是微软开发实践的网络文件共享协议,通过该协议可以让应用程序读取和写入文件以及从计算机网络中的服务器程序请求服务。
SMB 协议可在其 TCP/IP 协议或其他网络协议上使用。使用 SMB 协议时,应用程序(或应用程序用户)可访问远程服务器上的文件或其他资源。这让应用程序可以读取、创建和更新远程服务器上的文件。它还可以与任何设置为接收 SMB 客户端请求的服务器程序通信。
简单来说,SMB与基于TCP/IP网络实现块存储的iSCSI或FCoE存储协议不同的是,它是一种高效文件访问协议,类似的协议是NFS协议,这种协议被广泛的应用在NAS存储中;通过类似协议组织存储具有低成本和极大的配置灵活性和可扩展性,尤其是大型的集群环境和云环境。对于共享型存储的环境,你不再需要为每个连接端配置昂贵的HBA卡或FCoE卡,更不必特意构建昂贵的光纤连接,而且对于存储配置变更你也不必为了一个存储组的配置反复修改上联端的WWN,避免的复杂造成出错的可能性等等。
 
因此在Windows Server 2012 引入了全新 3.0 版的 SMB 协议,增加了对虚拟化以及SQL数据库的支持并增加了一系列的性能增强和特性后,让这个协议和应用更有吸引力更有应用的场景;其中些核心的特性功能如下:
  • SMB 高可用透明故障转移
  • SMB 高可用横向扩展
  • SMB 多通道
  • SMB RDMA直连方式
  • 用于服务器应用程序的性能计数器
  • 性能优化
  • SMB-专用 Windows PowerShell cmdlet
  • SMB 加密
  • SMB 目录租用 
     
这其中其实有很多非常有特色的功能,例如通过过透明故障转移和横向扩展,多通道等功能,近乎就是用Windows Server 2012“软件定义存储”方式实现了一个高可用横向扩展的存储集群;今天我们就来探讨一下其中多通道这个必不可少的通道端的功能。
 

SMB多通道简介

关于多通道技术,类似于在块存储中的多路径MPIO技术,那么既然是SMB可以基于以太网络实现,可以简单理解就是通过端到端的多个网络适配器组成的多条通道组合后实现:
  • 整体吞吐能力提高。如果单纯增加主机节点固然可以提高处理能力,但单节点的吞吐往往依赖于其IO系统的能力,可以并行传输的多通道功能显然是必不可少的。
  • 网络故障转移能力实现。某个网卡出现故障时其他网卡可以透明接管实现故障转移。
微软的SMB 3.0版本多通道技术还可以实现网络可用路径的自动识别和自动添加,这样可以大大的简化管理的难度。
 

前提条件

实现多通道特性需要以下两个条件:
1. 需要服务器端为Windows Server 2012, SMB客户端为Windows Server 2012 或Windows 8。
2. 需要多块最好为同一规格网络适配器(可以不同品牌)。例如:可以都为千兆网卡或都为万兆, 条件好的还可以考虑都采用具有RDMA功能的万兆融合卡或Infiniband卡。
 

配置方法

对于Windows Server 2012和Windows 8的操作系统,其实并不需要额外配置, SMB多通道功能默认是启用的,作为SMB客户端来说会自动判断SMB会话状态和版本,如果为3.0则会自动像服务器端申请可以参与多通道的适配器列表,会根据性能以及是否为同一规格自动协商用于多通道的适配器组。
一般来说并不需要单独启用或禁用多通道功能,不过若果你确实希望屏蔽或启用该功能,可以通过Powershell CMDLET实现,并且通过查看SMB配置确认多通道的开关。

服务器端:

禁用启用查看
Set-SmbServerConfiguration -EnableMultiChannel $false
Set-SmbServerConfiguration -EnableMultiChannel $true
Get-SmbServerConfiguration | Select-Object EnableMultiChannel
 
 
 

 

客户端:

禁用启用查看
Set-SmbClientConfiguration -EnableMultiChannel $false
Set-SmbClientConfiguration -EnableMultiChannel $true
Get-SmbClientConfiguration | Select-Object EnableMultiChannel

 

常见应用场景

常用的多通道连接有大致以下几种方式。
1. 单个接收端扩展技术网卡
这种配置需要在服务器端和客户端配置一块10GbE NIC。如果没有SMB多通道技术,如果在服务器端和客户端建立一个SMB会话,SMB只能使用单个TCP/IP连接,因此只有一个CPU核心参与。如果有很多小的IO操作,又是10GbE网络,那么CPU核心很可能成为封包解包的性能瓶颈。所以,现在大多数网卡都支持一种被称为接收端扩展技术(RSS),这项技术允许多个CPU核心处理多个连接,注意如果没有多通道技术对于如下图的单连接,RSS也无能为力,因此必须借助多通道技术才可以完全利用RSS的能力,SMB会为单个会话建立多个TCP/IP连接,这样可以充分调度多个CPU核心的能力因此可以非常有效的避免由于小IO操作造成的CPU端的性能瓶颈。
image
2. 多网卡多SMB通道方式
如下图所示,如果不启用SMB多通道模式,尽管在服务器端和客户端有多个网络连接,仍然只能通过一个物理网络连接并且只有一个会话,这样即损失了性能又无法实现高可用性。有利多通道技术,SMB会对每个会话建立多个TCP/IP连接,这样不但可以充分提高整个链路的吞吐而且可以提供高可用的功能。
image
 
3. 多通道和网络聚合组合模式
也许大家看过之前我写的一篇关于Windows Server 2012网卡汇聚的功能,这个功能当然也是在网络层提供高可用和负载均衡能力的,对于非SMB的流量这个功能是有灰常效果的,可是在SMB应用中,如果没有多通道的帮助,如下图所示,还是只有一个NIC一个CPU核心会参与SMB通信,这样除了可用性那么负载均衡是无法是真正实现的。所以在已经做了网卡聚合的网络上,我们仍然可以通过启用SMB的多通道功能,进一步平衡负载,不但可以使用所有的网络适配器,并且可以对于单个会话可以建立多个TCP/IP连接,这样多个CPU核心也被调用,如何?可用性和带宽都可以最大化得到使用,并且对于SMB和非SMB流量都可以得到优化。
image
 
 

常用命令

通常对于SMB的多通道配置是主机环境自动调节的,如果你发现SMB的功能没有如约兑现,可以做一些简单的初步判断:
1. 首先检查网卡的配置信息,判断网卡的规格速率,是否启用了RSS等,需要在SMB的服务器端和客户端分别运行。
Get-NetAdapter
Get-NetAdapterAdvancedProperty
Get-NetAdapterRSS
Get-NetAdapterHardwareInfo
 

 
 
2. 检查SMB的配置信息,确认多通道功能没有禁用,确认SMB已经准确识别网络适配器。
在SMB客户端的Powershell中通过
Get-SmbClientConfiguration | Select EnableMultichannel
Get-SmbClientNetworkInterface
在SMB服务器端的Powershell中通过
Get-SmbServerConfiguration | Select EnableMultichannel
Get-SmbServerNetworkInterface
 
3. 确认SMB的会话连接
在SMB客户端的Powershell中运行
Get-SmbConnection
可以确认会话建立状态和版本等信息。
Get-SmbMultichannelConnection
基本上是个人最喜欢的确认多通道会话连接的命令,如果你尝试查看多通道的自动屏蔽和加入失效网络的状态,这是一个非常有效的命令。
(你可以拷贝一个大的文件或者通过SQLIO等工具持续的创建一些底层IO,在此期间启用禁用网卡并通过这个命令查看多通道的状态)
 

常见问题

1. 网卡都符合要求但就是无法加入到SMB的多通道中?
在我的测试环境中,我发现如果在Windows Server 2012中启用了Hyper-V角色,并且Hyper-V虚拟交换机为来宾虚拟机或管理网络设置了上行端口所用网络适配器,那么该适配器是不参与到SMB多通道网络中的。这是因为为了隔离存储网络和虚拟机网络,我理解SMB的角色本来和Hyper-V的角色要最好分开,例如你建立一个SMB的存储集群也不能回环支持同时在其上构建一个Hyper-V的集群,因此Hyper-V和SMB最好不要放到一起。
 
2. 单网络适配器可支持的SMB连接数
SMB多通道对于单网络适配器支持的连接数不同,对于支持RSS的网卡(根据我的理解10GbE)单会话支持4个TCP/IP连接,其他网卡支持1个。官方说法每个服务器客户端组最多支持8个
Get-SmbClientConfiguration | select maximumconnnectioncountperserver
(我怎么在我的环境看到默认是32个?)
当然这个值也是可以修改的:
Set-SmbClientConfiguration –MaximumConnectionCountPerServer <n>
 
3. 网卡支持RSS可是千兆网卡,怎么看到SMB多通道连接对于一块网卡始终是1个连接?
对于千兆卡来说无论是否支持并启用了RSS,对于CPU来说都不会产生很大的负载需要用到多线程分布,因此除非你在底层启用了网卡聚合,对于单网卡就是一个连接。
 
4. 怎样限定多通道仅使用某个或某几个网络适配器?
首先,通常并不建议在使用的SMB的环境中启用限制功能,如果你确实需要,可以通过客户端打开Powershell利用CMDLET实现。
例如,在我的环境中,如果希望对Deepdivesvr03这台SMB服务器在客户端限制仅仅通过4块网络适配器中的2个(网卡索引14,15)实现多通道。
New-SmbMultichannelConstraint –ServerName Deepdivesvr03 -InterfaceIndex 14, 15
 
5. SMB多通道技术的负载均衡算法是什么?
据我所知,是根据参与多通道的物理网络适配器的动态队列深度来进行负载均衡的,因此并不是通过简单的RR策略。









本文转自 翟老猫 51CTO博客,原文链接:http://blog.51cto.com/3387405/1118659,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注