eBayでX520-DA2(互換品)を買った
実験用にSFP+が2本刺さるNICをeBayで購入しました。 富士通のD2755-A11というものです。 Intel 82599Eが載っていて、X520-DA2と事実上同じもののようです。 3月末に注文したのですが、 さすがにコロナウィルスの影響か、遅れに遅れ、6月中旬になってやっと到着しました。
早速箱から出してみると、PCI Expressバスの信号線のAC結合キャパシタが一つ無くなっていることに気が付きました。
調べてみると、x8バスのうち、7番目のペアのようだったので、x4ではリンクすると予想し、 PCのx16スロットに挿して起動してみたところ、案の定x4で動作しました。 Linuxのログに次のように出力されています。
ixgbe 0000:03:00.0: Multiqueue Enabled: Rx Queue count = 6, Tx Queue count = 6 XDP Queue count = 0
ixgbe 0000:03:00.0: PCI Express bandwidth of 16GT/s available
ixgbe 0000:03:00.0: (Speed:5.0GT/s, Width: x4, Encoding Loss:20%)
ixgbe 0000:03:00.0: This is not sufficient for optimal performance of this card.
ixgbe 0000:03:00.0: For optimal performance, at least 20GT/s of bandwidth is required.
ixgbe 0000:03:00.0: A slot with more lanes and/or higher speed is suggested.
ixgbe 0000:03:00.0: MAC: 2, PHY: 16, SFP+: 5, PBA No: D2755A-011
次に、AC結合キャパシタとして0.1uFを実装して、再度起動させてみたところ、やはり同じメッセージです。 使っているマザーボードはZ370 Gaming plusなのですが、 こちらの記事を見ると、2番目のx16 PCIeスロットは、 どうやらx4接続のようです。というわけで、このマザーボードだと、x16を2個は事実上使えないのでした。
x4でもGen3 (8Gbps)接続であれば帯域は不足しないと思いますが、 X520-DA2はそもそもGen2 (5Gbps)までしか対応していないようです。したがって、このボードはx8のバスに刺さない限り最大限の性能を出せません。
とりあえず最大帯域の追求は置いておいて、次にループバックの実験をしてみることにしました。 2つあるSFP+ポートにモジュールを刺して、光ケーブルで接続します。
それぞれのインタフェースに別々のIPアドレスを割り当てて、iperfに-Bオプションを付けて、一方はサーバ、もう一方はクライアントで動作させました。 しかし、結果として帯域が60Gbps近く出たりしています。明らかにおかしい。調査してみたところ、Linuxが最適化しているせいで、 実際にNICからパケットが出ていかず、内部で通信が完結してしまっていたのでした。
Force local IP traffic to an external interfaceに、まさにドンピシャなやり方が書いてありました。 network namespacesを使うと、内部で転送されてしまうことを回避できるそうです。Thomas Tannhäuserさんの回答にならって、
ip netns add ns_server
ip netns add ns_client
ip link set enp3s0f0 netns ns_server
ip netns exec ns_server ip addr add dev enp3s0f0 192.168.2.2/24
ip netns exec ns_server ip link set dev enp3s0f0 up
ip link set enp3s0f1 netns ns_client
ip netns exec ns_client ip addr add dev enp3s0f1 192.168.2.3/24
ip netns exec ns_client ip link set dev enp3s0f1 up
とします(各行はrootで実行)。次いで、
ip netns exec ns_server iperf -s -B 192.168.2.2
ip netns exec ns_client iperf -c 192.168.2.2 -B 192.168.2.3
とすることで、NICが使用されるようです。帯域として、9.4Gbits/sec程度の値が得られました。 サーバ側はTCP window sizeは128KByte, クライアント側はTCP Window size 85KByteと表示されていました。 テスト中も、6コアいずれも30%も行っていませんでしたので、まだまだ余裕がありそうです。
上記9.4Gbits/secはデフォルトのMTU 1500の場合でした。
ip netns exec ns_server ip link set mtu 9000 dev enp3s0f0
ip netns exec ns_client ip link set mtu 9000 dev enp3s0f1
としてMTUを9000に設定してから再度iperfを行ったところ、9.8Gbits/sec以上の速度となりました。調子が良いと9.9Gbits/secまで出ました。
マザーボードを買い換えないで最大帯域の実験をするには、とりあえずGPUを抜いて試すか、 Gen3 x4で動作するX710-DA2あたりを調達するしか無さそうです。