Windows Server 2012 R2 のネットワークの注意事項 - SMB Multichannel (3)
Windows Server 2012 以降、SMB Multichannel は既定値は On です。
バグかアルゴリズムを完全に掴めていないか分かりませんが、Multichannel はたまに変な動きをします。SOFS など、少し手の込んだシステムを組んでいる場合は経験があるかもしれません。トラブルを最小限に抑えるためにも、ネットワーク管理者やサーバー管理者は挙動とルールを把握し、安易に "自動" に任せずコントローラブルな状態にしておきたいところです。
SMB Multichannel によって意図しない通信経路になる?
例えば、1 台のサーバーに次のような 4 つの NIC が搭載されているとします。
この場合、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-V や NIC Team を利用する場合も注意が必要です。
Team や仮想スイッチ配下の仮想 NIC は RSS などの機能が無効化されることが多々あります。この場合、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