仮想化でプリセールスしてるSEの一日

VMware から Azure まで、インフラや仮想化の最新情報をベンダー色をできるだけ抑えて綴っていきます

Windows Server 2012 R2 のネットワークの注意事項 - SMB Multichannel (3)

f:id:ogawad:20190203195637p:plain:right


Windows Server 2012 以降、SMB Multichannel は既定値は On です。

バグかアルゴリズムを完全に掴めていないか分かりませんが、Multichannel はたまに変な動きをします。SOFS など、少し手の込んだシステムを組んでいる場合は経験があるかもしれません。トラブルを最小限に抑えるためにも、ネットワーク管理者やサーバー管理者は挙動とルールを把握し、安易に "自動" に任せずコントローラブルな状態にしておきたいところです。


SMB Multichannel によって意図しない通信経路になる?

例えば、1 台のサーバーに次のような 4 つの NIC が搭載されているとします。

  • NIC A: 10 Gbps
  • NIC B: 10 Gbps
  • NIC C: 1 Gbps
  • NIC D: 1 Gbps


この場合、NIC A〜D の 4 枚がすべて SMB を有効にしていたとしても、既定の Multichannel On の場合は A と B しか使われません。
Multichannel は最も速い NIC を自動選択します。



より正確に述べると、多種多様な NIC がある場合、速度や機能 (RSS, RDMA, ...) が最も優れている NIC のみが利用されます。
もし、この図において「NIC A は RSS 対応」「NIC B は RSS 非対応」であった場合、A のみの通信となるようです。Active-Active にならないだけでなく、A に障害が発生した場合は B に切り替わらない可能性もあります。


また、この図で A/B は業務系ネットワーク、C/D は管理系ネットワークだったとします。ご存じのとおり、Windows サーバーはドメインログオンなどの関係で管理系でも SMB が必要とされますが、管理系通信をしたいために C/D の IP アドレスに接続しても、勝手に A/B のネットワークで通信されてしまうのです。
このように、アーキテクトの方が時間を掛けてきちんとネットワーク設計を行ったとしても、Windows Server 2012 以降では、既定で有効にされている SMB Multichannel によって意図しない通信経路が使われてしまい、ネットワークバランスが崩れてしまうことがあります。


Hyper-VNIC Team を利用する場合も注意が必要です。
Team や仮想スイッチ配下の仮想 NICRSS などの機能が無効化されることが多々あります。この場合、RSS 対応の物理 NIC とは Multichannel にならず、物理 NIC 側のみが使わてしまいます。トラブルに発展しやすいので注意しましょう。


SMB Multichannel をコントローラブルな状況にする

前述のようなトラブルを回避し、管理者がコントローラブルな状態にしておくために、いくつかの設定方法を残しておきたいと思います。

SMB Multichannel を一切使わない

当たり前ですが、最もシンプルなのは Multichannel を元から切ることです。
前者はネゴシエーション送信の On/Off、後者はネゴシエーション受信の On/Off であり、いずれかを off にすれば Multichannel 通信は行いません。


現在の設定確認

Get-SmbClientConfiguration | fl *Multichannel
Get-SmbServerConfiguration | fl *Multichannel


有効化

Set-SmbClientConfiguration -EnableMultiChannel $true
Set-SmbServerConfiguration -EnableMultiChannel $true


無効化

Set-SmbClientConfiguration -EnableMultiChannel $false
Set-SmbServerConfiguration -EnableMultiChannel $false


実行例

PS C:\> Get-SmbClientConfiguration | fl *Multichannel

EnableMultiChannel : True

PS C:\> Set-SmbClientConfiguration -EnableMultiChannel $false

確認
この操作を実行しますか?
ターゲット 'Modify' で操作 'SMB Client Configuration' を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):
PS C:\> Get-SmbClientConfiguration | fl *Multichannel

EnableMultiChannel : False

PS C:\> Set-SmbClientConfiguration -EnableMultiChannel $true

確認
この操作を実行しますか?
ターゲット 'Modify' で操作 'SMB Client Configuration' を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):
PS C:\> Get-SmbClientConfiguration | fl *Multichannel

EnableMultiChannel : True

PS C:\>

SMB Multichannel の通信経路を制御する

Multichannel を完全に無効にするのではなく、有効にしながら管理下に置きたい場合は、次のコマンドを利用して Multichannel に含めるパスと除外するパスを手動でコントロールしましょう。宛先サーバーごとに静的設定が可能です。


現在の通信経路の確認

Get-SmbMultichannelConnection


Multichannel による通信経路の静的指定

New-SmbMultichannelConstraint -ServerName <接続先> -InterfaceIndex NIC#>


NIC# はカンマ区切りで入力します。
Get-SmbClientNetworkInterface で確認可能です。

PS C:\> Get-SmbClientNetworkInterface | sort *Index

Interface Index  RSS Capable  RDMA Capable  Speed    IpAddresses       Friendly Name
---------------  -----------  ------------  -----    -----------       -------------
14               False        False         0  bps   {fe80::5efe:1...  isatap.{726DB36...
15               False        False         0  bps   {fe80::5efe:1...  isatap.{5D52604...
16               False        False         3 Gbps   {2002:1092:5d...  6TO4 Adapter
19               False        False         0  bps   {fe80::200:5e...  isatap.{845AB79...
21               True         False         0  bps   {192.168.0.1,...  Team (192.168.0...
24               False        False         10 Gbps  {16.146.93.81     vEthernet (16.1...
26               False        False         10 Gbps  {192.168.11.2     vEthernet (192....

PS C:\>


route の静的設定を思い出しますね。
なお、設定は Persistent、つまり、マシンを再起動しても設定が永続的に保持されるそうです。不揮発領域にはレジストリを利用しているとのこと。手動で指定した静的設定をすべてリセットするには、下記のコマンドを利用します。

Get-SmbMultichannelConstraint | Remove-SmbMultichannelConstraint