Windows10 + Mellanox で SMB Directを利用するまでの手順

Destroyer Yūdachi

SMB Directとは?(´・-・`)

ファイル共有などで使われる仕組みをSMB、古くはCIFSと言ったりしますが、ネットワークを通してやりとりされるデータは一端CPUを介してメモリーに入り、そのあと実際のストレージに書き込まれます。通信速度が上がっていくと、ここがボトルネックになるため、仮想化、IaaSが盛り上がったときにiSCSIなどでパフォーマンスを出すには工夫が必要となった背景があって、CPUを介さずにデバイス間でダイレクトに処理するRDMAという手法をネットワークに盛り込むことが行われたのですが、「Windowsのファイル共有機能でホスティングできるストレージが速くなればみんな幸せ」ということになり生まれたのがSMB Direct(てきとう

10GbE環境を手に入れたら、やっぱりチューニングもしたい!という気持ち。

とりあえず動くまでに行った手順

最初にお断りを入れておくと、このブログに書く手順は、本質的には正しい手順ではありません。Mellanoxのホワイトペーパーなどを見るとわかりますが、そもそもMellanox製品を使ったSMB Directは、RoCEという技術要素の上にあります。類似技術としてiWARPというものがありますが、iWARPが既存のTCP/IPにおけるPatch(Layer4で動作する)であって、RoCEは”RDMAトランスポートプロトコルである”というMellanox側の主張にみられるように、その技術要素にはLayer2での輻輳制御が含まれます。そのため、Peer to Peerでも無い限り、QoSを正しく動作させるために、本来ならDCB(Data Center Bridging)に対応したスイッチを使用する必要があるのですが、その機材を使用しないことを前提にしています。結果、輻輳制御が正しく行われない可能性があります。RoCEが掲げるロスレス転送にはならない可能性があるということです。言い方を変えれば、輻輳が生じるようなシビアな通信量の環境じゃないから目をつぶる、という方針が元になっています。”動作はするが、システムとしてあるべき姿ではない”と言うことは留意下さい。私が使用しているCRS328はDCBに対応していません。

前提条件として、次のものを用意する必要あり

  • クライアントはWindows 10 Pro for WorkstationあるいはEnterprise、サーバーはWindows Server 2012以降。SMB Directは元々Windows Serverと企業向けクライアントOSであるEnterpriseにのみ実装されていた歴史的経緯があり、その後、コンシューマ向けWindows 10にも盛り込まれたのだが、Workstationでしか機能が有効となりません。また、サーバー側の実装については、2012が限定的な実装にとどまりますので、2016以降がおすすめです。
  • Mellanox Connect X-3シリーズ以降のイーサネットカードが、クライアントとサーバーの両方に装着されていること。片方だけでは駄目。
  • SFPあるいはSFP+を装備したL2スイッチとTwinaxかファイバーケーブル。本来はPFC QoS対応スイッチを使う必要があるが、ここでは使わない。
  • クライアントとサーバーの両方に同じ設定を入れます。片方だけでは動作しません。

L2スイッチとConnect X-3のフローコントールをオフにする

後々、Windowsの役割インストールでPFC QoSを扱うための機能(データセンターブリッジ)をインストールしますが、通常、このPFCが優先されるため、本質的にはドライバーのフローコントロールを明示的にオフにする必要はありません。しかし、当手順ではPFC QoS対応スイッチなどを使用しないので、ドライバー側のフローコントロールがオンになっているとSMB Directが正しく動作しないため、明示的にオフにします。また、そうではないとしてもオフにしておくとトラブルシューティングがしやすいという側面があります。

具体的なオフにするやり方ですが、ネットワークアダプタのプロパティを開いて、詳細設定から行います。

RDMAを有効にする

コマンドプロンプトかPowerShellコンソールで次のコマンドを実行する。

Set-NetOffloadGlobalSetting -NetworkDirect Enabled

Enable-NetAdapterRdma -Name “インターフェース名”

SMB Directを動作させるインターフェース名を入力します。

データセンターブリッジ(Data Center Bridge)の役割をインストールする。

サーバーマネージャー、あるいはWindows10ならば「Windowsの機能の有効化または無効化」(オプション機能の管理)から役割をインストールします。あるいは、PowerShellで次のコマンドを入力することでもインストール可能です。

Install-WindowsFeature Data-Center-Bridging

https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/dcb/dcb-install#install-dcb-in-windows-10

RoCEモードの変更

Mellanoxのドライバーをインストールすると、管理用のコマンドが使えるようになります。それを使い、現在のステータスを確認したり、設定を変更を行います。Connect X-3では、インストール直後はRoCE v1で動いています。これをv2に変えます。v2にする理由ですが、v1はLayer2で動作するのですが、前述のように対応スイッチを使用しない前提なので、Layer3で動作するv2が必要だからです。X-4以降はデフォルトでv2が有効になってます。

Set-MlnxDriverCoreSetting –RoceMode 2

PFCとETSの設定を入れる

ここからは実際に投入するコマンドを中心に書きますが、参考情報として次のページを見ながらやって貰うと良いと思います。

Enable-NetQosFlowControl -Priority 3

Enable-NetAdapterQos -InterfaceAlias ”インターフェース名”

SMB Directを動作させるインターフェース名を入力します。

New-NetQosPolicy “SMB” -PolicyStore ActiveStore –NetDirectPort 445 -PriorityValue8021Action 3

New-NetQosPolicy “DEFAULT” -Default -PolicyStore ActiveStore -PriorityValue8021Action 3

New-NetQosPolicy “TCP” -IPProtocolMatchCondition TCP -PolicyStore ActiveStore -PriorityValue8021Action 0

New-NetQosPolicy “UDP” -IPProtocolMatchCondition UDP -PolicyStore ActiveStore -PriorityValue8021Action 0

New-NetQosTrafficClass -name “SMB class” -priority 3 -bandwidthPercentage 50 -Algorithm ETS

スタートアップスクリプトを作成して配置する

再起動した際にも正しくQoSが設定されるように、スタートアップスクリプトを作成します。

グループポリシーでもローカルポリシーでもどちらでも良いと思いますが、qos.ps1 というようなファイル名にして格納します。

Remove-NetQosTrafficClass
Remove-NetQosPolicy -Confirm:$False
Set-NetQosDcbxSetting -Willing 0
New-NetQosPolicy “SMB” -PolicyStore ActiveStore -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3
New-NetQosPolicy “DEFAULT” -PolicyStore Activestore -Default -PriorityValue8021Action 3
New-NetQosPolicy “TCP” -PolicyStore ActiveStore -IPProtocolMatchCondition TCP -PriorityValue8021Action 0
New-NetQosPolicy “UDP” -PolicyStore ActiveStore -IPProtocolMatchCondition UDP -PriorityValue8021Action 0
Disable-NetQosFlowControl 0,1,2,4,5,6,7
Enable-NetQosFlowControl -Priority 3
Enable-NetAdapterQos -InterfaceAlias “Ethernet 15”
New-NetQosTrafficClass -name “SMB class” -priority 3 -bandwidthPercentage 50 -Algorithm ETS

SMB Directが動作しているかどうかの確認方法

Windowsに元からインストールされているパフォーマンスモニターを起動します。カウンターの追加から、次のようなものを追加します。

  • RDMA Activity
  • SMB Direct Connection

“グラフの種類の変更” から、”レポート”に変えますと見やすくなります。

実際にファイル共有やネットワークドライブとしてマウントしたフォルダーに対して、読み書き動作を発生させます。すると、RDMA Activityカウンタの場合はRDMA AInitiated ConecctionsやActive Connectionsの数値がいくつかありますが、RDMA Inbound、RDMA Outboundといった数値が変化します。このInboundやOutbound数値が0からカウントされないような状態の場合は、SMB Directが動作していません。このとき、SMB Direct Connectionカウンタのレポートも数値が0のまま微動だにしないと思います。そうであれば、何かの手順や用意すべきハードウェアやOSが条件を満たせていません。

Windows10では、タスクマネージャーから表示できるパフォーマンスからイーサネットアダプター毎に通信で消費している帯域がモニタリングできるようになっていますが、SMB Directが動作すると、SMB Directで生じた通信についてはモニターに反映されなくなります。

Microsoft製テストツールを使用する確認方法

GithubのマイクロソフトのRepoに次のツールがあるので、これを使うと簡単に動作確認ができます。

https://github.com/Microsoft/SDN/blob/master/Diagnostics/Test-Rdma.ps1

DiskSpd.exeというツールが必要になるので、併せて取得します。

https://gallery.technet.microsoft.com/DiskSpd-A-Robust-Storage-6ef84e62

DiskSpd.exeのパスがデフォルトではsystem32以下のフォルダになっているので適宜スクリプトを修正して下さい。

具体的な使用方法ですが、実行すると、プログラムを実行したマシンにおけるRDMA転送をチェックするインターフェースインデックスを聞かれるので、事前に route printコマンドなどで調べておきます。そして、クライアントのIPアドレスとサーバーのIPアドレスを入力して実行してしばらく待つと結果が表示されます。

テストをパスしたときの表示例

有効にしてみてどうだった?(´・-・`)

今の我が家のインフラでは、ファイルサーバーとして使用しているWindows Server 2016にマウントされている最速のドライブが単発のSATA3のSSDなので、直ぐにスループットが頭打ちになってしまい、10GbEを最大限に生かせる構成にはなっていません。そのため、SMB Directでスループットが変わったかという点については言及できないのですが、レイテンシは改善したように思えます。特にフォルダ数が多いフォルダをブラウズするときのリスト表示がキビキビになった気がしますが、パフォーマンスカウンタを見る限りでは、リスト取得時にRDMA転送はされていないように見うけられるので、あくまで気がするというものであり、確証バイアスの域を出ていない可能性大です。VHDXファイルなどを格納すると、また違った感想がでてくるかもしれませんが、興味がある方はやってみてください。(´・-・`)ノ