USB – 5Gbps Ethernet アダプタを買ってきた

業務外での技術力向上支援の会社の補助金で、 USB – 5Gbps Ethernet アダプタをいくつか購入し、まずはざっくり普通に繋ぐとどうなるのか試してみたのでメモ。

買ったもの

10G/5G アダプタ

以上の4つ。Solo10G のみ Thunderbolt 接続で 10Gbps だが、他が USB 接続で 5Gbps。なので今のところ、 10Gbps で繋がる相手がいないので、今回はすべて 5Gbps として使用。

ドライバ

Solo10G については 、 Windows 版のドライバをインストールして使用した。Solo10G ドライバとしてダウンロードしたものが、実際に起動したものは Aquantia のドライバインストーラだった。QNAP QNA-UC5G1 と、 StarTech.com のものは、いずれも Windows 10 では OS 標準か Windows Update かでドライバが入った。

Linux には USB の二機種(QNAP、StarTech.com)を接続したが、いずれも Aquantia 製のコントローラが入っているようで、 aqc111 というドライバが提供されている。ただし、 Linux 5.x には標準に同梱されているが、 Linux 4.x だと入っていないのでそのままでは他のドライバが適用される。また、 Linux 5.x 標準のものと、 AQ_USBDongle_LinuxDriver_1.3.3.0.zip (QNAP のウェブページよりリンクされていた、Marvell のサポートページよりダウンロード)で提供されているものは両方 aqc111 という名称で、かつ後者を解凍して出てくる README にも aqc111 Linux 5.x に同梱されているとの表記があるが、 ethtool で見ることができる項目が若干後者の方が多い(Low Power 5G と Thermal throttling が設定可能になる)など、若干の差があるようだ。

Linux 4.x の搭載ドライバ(試した環境は Ubuntu 18.04)でも、 1Gbps を超える転送が可能であり、接続相手からも 5000Mbps リンクとして認識されていた。ただし、ジャンボフレームを有効にした際に、大きなパケットを受信すると以後通信ができなくなるという問題があった。Linux 5.x (Ubuntu 20.04)にすると問題なかった。

クライアント-サーバー直結での性能測定

転送速度については、まずは Solo10G (ThinkPad X1 Extreme (Core i7-8750H 2.20GHz、 Windows 10 1909) に接続) と QNAP QNA-UC5G1T (DS77U5 (Core i5-7200U 2.50GHz、 Ubuntu 18.04/20.04) に接続)をケーブルで直結して測定した。

iperf で接続したところ、まず初期設定の MTU=1500 で、 iperf の並列度も上げずに試したところ、 2.1-2.3Gbps 程度だった(この時は Ubuntu 18.04)。この状態で、 QNAP 側を USB パススルーで Ubuntu 20.04 に見せるようにすると 1.1Gbps 程度まで下がった(これについては qemu のバージョンアップなどでも改善するようで、 Ubuntu 20.04 だと 2.0-2.5Gbps 程度出た)。

この後、 MTU=9000 に変更すると、その時のベンチマークでは iperf の並列度が 1 のままでも 3.63Gbps という転送速度が出た。ただし、前述の 4 系カーネルバンドルのドライバではジャンボフレーム受信が正常に行えない問題により、片方向しか通信できなかった。

さらにここまでの試行錯誤(主にジャンボフレームでトラブっていた時)で、 Solo10G のデバイスマネージャーの設定値で、 Large Send Offload V1, V2 の IPv4 の値をいじっている。結局、これは Disable のほうが当座の iperf でのスループットが出そうなので、今回の調査切ることにした。ただし、 iperf 側で並列化させない直列の転送速度でアプリケーション側込みだと Large Send Offload 有効のほうが速そうに見えたため、この辺りはよく確認したほうがよさそう(まだ詳細は調べていない)。そもそも、普通にしていて遅くなるようなものなら通常は offload しないだろうし。

ここからは、クライアント-サーバー直結での測定は次のような環境で試している。

  • Sonnet Solo10G, ThinkPad X1 Extreme, Core i7-8750H 2.20GHz, Windows 10 1909
  • QNAP QNA-UC5G1T, DS77U5, Core i5-7200U 2.50GHz, Ubuntu 20.04, Ubuntu 同梱 aqc111 ドライバ
  • MTU=9000 (Windows のプロパティの Jumbo Packet では 9014 Bytes)
  • Windows 環境では Large Send Offload V1, V2 (IPv4) を Disable
  • この前の段階でも iperf の並列度(-P) 1 で 3Gbps を超える速度が出たりしていたが、同じ条件でも再度試すと出なかったり、疑問だったので、この条件を決めてからは iperf の並列度は合計の速度が上がらなくなるまで上げる

この状態で、とりあえず 3.4Gbps 程度までは出せることがわかった。USB 側との接続も 5Gbps となるため、そちらで詰まれば製品としての上限がこのあたりに来る可能性はあるが、そこまでは確認していない。

nhirokinet@ds77u5:~$ iperf -c 192.168.150.2
------------------------------------------------------------
Client connecting to 192.168.150.2, TCP port 5001
TCP window size:  715 KByte (default)
------------------------------------------------------------
[  3] local 192.168.150.3 port 34642 connected with 192.168.150.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  4.00 GBytes  3.44 Gbits/sec
nhirokinet@ds77u5:~$ iperf -c 192.168.150.2
------------------------------------------------------------
Client connecting to 192.168.150.2, TCP port 5001
TCP window size:  812 KByte (default)
------------------------------------------------------------
[  3] local 192.168.150.3 port 34646 connected with 192.168.150.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  3.84 GBytes  3.30 Gbits/sec
nhirokinet@ds77u5:~$

また、全二重でも速度が出せるようだった。

ちなみに、 USB パススルーでの転送速度は、 Ubuntu 18.04 -> 20.04 で qemu のバージョンが上がっていることもあり、改善されたが、片方向で 2.0-2.5Gbps、双方向同時ならそれぞれ 1.5-1.7Gbps (あわせて 3Gbps 強)というところだった。

Ubuntu でのパケットの中継

Ubuntu をスイッチとして使ったような場合に、性能上限が変わってくるのか、といったあたりを見たかったため、簡単に試した。

環境は

  • Sonnet Solo10G, ThinkPad X1 Extreme, Core i7-8750H 2.20GHz, Windows 10 1909
  • StarTech.com アダプタ x 2、 DS77U5, Core i5-7200U 2.50GHz, Ubuntu 20.04, Ubuntu 同梱 aqc111 ドライバ
    • Linux 標準のブリッジにより libvirtd 上の仮想マシン(qemu+kvm, 3vCPU, Ubuntu 20.04)に NIC を見せる
    • 二つの StarTech.com は DS77U5 親機側では別物として扱ってブリッジも別々に作り、パケットの転送は VM 側で行う
  • QNAP QNA-UC5G1T, ThinkPad W550s, Core i7-5600U 2.60GHz, Windows 10 1909
  • MTU=9000 (Windows のプロパティの Jumbo Packet では 9014 Bytes)
  • Windows 環境では Large Send Offload V1, V2 (IPv4) を Disable
  • この前の段階でも iperf の並列度(-P) 1 で 3Gbps を超える速度が出たりしていたが、同じ条件でも再度試すと出なかったり、疑問だったので、この条件を決めてからは iperf の並列度は合計の速度が上がらなくなるまで上げる
  • この条件で、 ThinkPad X1 Extreme – Sonnet Solo10G – StarTech.com アダプタ1 – DS77U5 – StarTech.com アダプタ2 – QNAP QNA-UC5G1T – ThinkPad W550s と接続し、 DS77U5 上の VM で 3Gbps 程度でのパケット転送が可能か、試した。

    まず、/etc/sysctl.conf に

    net.ipv4.ip_forward = 1
    

    を追記し、 sysctl -p /etc/sysctl.conf を実施して反映して、別々のサブネット間をそのまま転送したところ、並列度を挙げれば 3.5Gbps 程度まで達した。

    次に、

    iptables -t nat -A POSTROUTING -o ens9 -j MASQUERADE
    

    (ens9 はここでは iperf -s をしているマシンと繋がっている NIC)を実施して、最低限の NAT を行うようにしたところでも、やはり並列度を上げると 3.5Gbps 程度まで達した。3vCPU を付しているものの、 VM の top で見たところでは、(3vCPU 全体を 100% とみなした割合で)3Gbps 以上で NAT 中でも idle が 95% 以上となっていた。

    もちろんこれではファイヤーウォールとしての機能は弱く、ここから iptables の設定を増やせば速度の低下は予想されるものの、この結果からは、ここで購入した機器を利用して、i5-7200U と同等かそれ以下のマシンを利用し、 3Gbps 以上のパケットを転送することができる可能性がありそうに思える。