100GbEをテストする 計測編 Mellanox ConnectX-5

Mellanox ConnectX-5 (MCX555A-ECAT)

今回、検証に当たって以下のマシンを2台お借りしたので、100GbEにおいて性能測定ツールが帯域を使用しきれるのか、調べてみました。

詳細
CPU AMD EPYC 7232P 8-Core Processor
Memory DDR4 ECC RDIMM 64GB
NIC Mellanox ConnectX-5 100Gb(InfiniBand/Ethernet) MCX555A-ECAT

目次

準備

今回は、Ubuntu 20.04.1 を使用しました。
Ubuntuに最初から入っているドライバは使用せず、Mellanox公式から取得したドライバを使用することにします。
今回は、MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgzを使用しました。

取得したファイルを解凍します。

$ tar zxvf MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64.tgz
$ cd MLNX_OFED_LINUX-5.1-0.6.6.0-ubuntu20.04-x86_64/

解凍されたディレクトリの中にある、mlnxofedinstallを実行します。

$ ls
common_installers.pl            DEBS    LICENSE                     RPM-GPG-KEY-Mellanox
common.pl                       distro  mlnx_add_kernel_support.sh  src
create_mlnx_ofed_installers.pl  docs    mlnxofedinstall             uninstall.sh
$ ./mlnxofedinstall

実行後、新しいドライバを使用するにはopenibdの再起動が必要な旨のメッセージが表示されますので、指示に従います。

Installation passed successfully
To load the new driver, run:
/etc/init.d/openibd restart
$ sudo /etc/init.d/openibd restart

IPアドレスについて、今回は10.0.0.1/2410.0.0.2/24を使用し、以下のように直結することにします。

10.0.0.1/24 ---------- 10.0.0.2/24

OSインストール時にIPアドレスの設定はしていませんので、 Interface は Down な状態になっています。
そこで Interface を Up にしますが、設定を保存しておく必要はないので今回はipコマンドを使用しました。

$ sudo ip link set enp65s0 up

Inteface にIPアドレスの割り当てを行います。(この場合、該当のインタフェースはenp65s0です)

$ sudo ip addr add <ip> dev enp65s0

DACを接続し100Gbpsでリンクしているか確認します。

$ ethtool enp65s0
Settings for enp65s0:
        Supported ports: [ Backplane ]
        Supported link modes:   1000baseKX/Full
                                10000baseKR/Full
                                40000baseKR4/Full
                                40000baseCR4/Full
                                40000baseSR4/Full
                                40000baseLR4/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
                                50000baseCR2/Full
                                50000baseKR2/Full
                                100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: None BaseR RS
        Advertised link modes:  1000baseKX/Full
                                10000baseKR/Full
                                40000baseKR4/Full
                                40000baseCR4/Full
                                40000baseSR4/Full
                                40000baseLR4/Full
                                25000baseCR/Full
                                25000baseKR/Full
                                25000baseSR/Full
                                50000baseCR2/Full
                                50000baseKR2/Full
                                100000baseKR4/Full
                                100000baseSR4/Full
                                100000baseCR4/Full
                                100000baseLR4_ER4/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: RS
        Link partner advertised link modes:  Not reported
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 100000Mb/s
        Duplex: Full
        Port: Direct Attach Copper
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
Cannot get wake-on-lan settings: Operation not permitted
        Current message level: 0x00000004 (4)
                               link
        Link detected: yes

Speed: 100000Mb/sとなっているので、100Gbpsで正しくリンクアップしていることが確認できました。

計測(MTU1500)

まずは、MTU1500で計測してみます。

iperf3 Single Thread

$ iperf3 -c 10.0.0.1
Connecting to host 10.0.0.1, port 5201
[  5] local 10.0.0.2 port 41020 connected to 10.0.0.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  2.24 GBytes  19.2 Gbits/sec    0   1.05 MBytes
[  5]   1.00-2.00   sec  2.25 GBytes  19.3 Gbits/sec    0   1.05 MBytes
[  5]   2.00-3.00   sec  3.47 GBytes  29.8 Gbits/sec  371   1.01 MBytes
[  5]   3.00-4.00   sec  3.44 GBytes  29.5 Gbits/sec    1   1.01 MBytes
[  5]   4.00-5.00   sec  2.82 GBytes  24.3 Gbits/sec    3   1.01 MBytes
[  5]   5.00-6.00   sec  2.68 GBytes  23.0 Gbits/sec    2   1.01 MBytes
[  5]   6.00-7.00   sec  2.65 GBytes  22.8 Gbits/sec    1   1.01 MBytes
[  5]   7.00-8.00   sec  2.65 GBytes  22.8 Gbits/sec    0   1.01 MBytes
[  5]   8.00-9.00   sec  2.65 GBytes  22.8 Gbits/sec    0   1.01 MBytes
[  5]   9.00-10.00  sec  2.65 GBytes  22.8 Gbits/sec    0   1.23 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  27.5 GBytes  23.6 Gbits/sec  378             sender
[  5]   0.00-10.00  sec  27.5 GBytes  23.6 Gbits/sec                  receiver

iperf Done.

23.6 Gbits/sec

iperf3 10 Threads.

$ iperf3 -P 10 -c 10.0.0.1
--<中略>--
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec  181             sender
[  5]   0.00-10.00  sec  3.10 GBytes  2.67 Gbits/sec                  receiver
[  7]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec   17             sender
[  7]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[  9]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec   36             sender
[  9]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 11]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec  185             sender
[ 11]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 13]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec    0             sender
[ 13]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 15]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec   13             sender
[ 15]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 17]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec    0             sender
[ 17]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 19]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec   24             sender
[ 19]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 21]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec   45             sender
[ 21]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[ 23]   0.00-10.00  sec  3.11 GBytes  2.67 Gbits/sec    4             sender
[ 23]   0.00-10.00  sec  3.10 GBytes  2.66 Gbits/sec                  receiver
[SUM]   0.00-10.00  sec  31.1 GBytes  26.7 Gbits/sec  505             sender
[SUM]   0.00-10.00  sec  31.0 GBytes  26.6 Gbits/sec                  receiver

iperf Done.

26.6 Gbits/sec

iperf2 Single Thread.

$ iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[  3] local 10.0.0.2 port 46778 connected with 10.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  26.5 GBytes  22.8 Gbits/sec

22.8 Gbits/sec

iperf2 10 Threads.

$ iperf -c 10.0.0.1 -P 10
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 1.80 MByte (default)
------------------------------------------------------------
[ 12] local 10.0.0.2 port 46800 connected with 10.0.0.1 port 5001
[  7] local 10.0.0.2 port 46794 connected with 10.0.0.1 port 5001
[  9] local 10.0.0.2 port 46792 connected with 10.0.0.1 port 5001
[ 10] local 10.0.0.2 port 46796 connected with 10.0.0.1 port 5001
[  4] local 10.0.0.2 port 46784 connected with 10.0.0.1 port 5001
[  6] local 10.0.0.2 port 46786 connected with 10.0.0.1 port 5001
[  3] local 10.0.0.2 port 46782 connected with 10.0.0.1 port 5001
[  8] local 10.0.0.2 port 46790 connected with 10.0.0.1 port 5001
[  5] local 10.0.0.2 port 46788 connected with 10.0.0.1 port 5001
[ 11] local 10.0.0.2 port 46798 connected with 10.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[ 12]  0.0-10.0 sec  11.6 GBytes  9.92 Gbits/sec
[  7]  0.0-10.0 sec  7.99 GBytes  6.86 Gbits/sec
[  9]  0.0-10.0 sec  7.15 GBytes  6.14 Gbits/sec
[ 10]  0.0-10.0 sec  11.1 GBytes  9.53 Gbits/sec
[  4]  0.0-10.0 sec  10.8 GBytes  9.26 Gbits/sec
[  6]  0.0-10.0 sec  13.5 GBytes  11.6 Gbits/sec
[  3]  0.0-10.0 sec  7.58 GBytes  6.51 Gbits/sec
[  8]  0.0-10.0 sec  10.1 GBytes  8.63 Gbits/sec
[  5]  0.0-10.0 sec  13.4 GBytes  11.5 Gbits/sec
[ 11]  0.0-10.0 sec  6.85 GBytes  5.88 Gbits/sec
[SUM]  0.0-10.0 sec  99.9 GBytes  85.8 Gbits/sec

85.8 Gbits/sec

表にしてみると以下のようになりました。

計測方法 実測値
iperf3 Single Thread 23.6 Gbits/sec
iperf3 10 Threads 26.6 Gbits/sec
iperf2 Single Thread 22.8 Gbits/sec
iperf2 10 Threads 85.8 Gbits/sec

iperf3よりもiperf2の方が計測時に速度が出ていることが分かります。
この結果は、CRS326-24S+2Q+RMでの40GbEのスループットをテストしてみた!でも同様の傾向がみられました。

計測(MTU9000)

続いて、MTUを9000にして再度計測を行ってみます。

$ sudo ip link set dev enp65s0 mtu 9000

iperf3 Single Thread

$ iperf3 -c 10.0.0.1
Connecting to host 10.0.0.1, port 5201
[  5] local 10.0.0.2 port 41070 connected to 10.0.0.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  4.29 GBytes  36.8 Gbits/sec   42   1.71 MBytes
[  5]   1.00-2.00   sec  3.49 GBytes  30.0 Gbits/sec    4   1.71 MBytes
[  5]   2.00-3.00   sec  3.56 GBytes  30.6 Gbits/sec    3   1.71 MBytes
[  5]   3.00-4.00   sec  3.57 GBytes  30.7 Gbits/sec    1   1.71 MBytes
[  5]   4.00-5.00   sec  3.57 GBytes  30.7 Gbits/sec    1   1.72 MBytes
[  5]   5.00-6.00   sec  3.29 GBytes  28.3 Gbits/sec    6   1.72 MBytes
[  5]   6.00-7.00   sec  3.39 GBytes  29.1 Gbits/sec    3   1.72 MBytes
[  5]   7.00-8.00   sec  3.39 GBytes  29.1 Gbits/sec   18   1.08 MBytes
[  5]   8.00-9.00   sec  3.33 GBytes  28.6 Gbits/sec    0   1.08 MBytes
[  5]   9.00-10.00  sec  3.37 GBytes  28.9 Gbits/sec    2   1.08 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  35.2 GBytes  30.3 Gbits/sec   80             sender
[  5]   0.00-10.00  sec  35.2 GBytes  30.3 Gbits/sec                  receiver

iperf Done.

30.3 Gbits/sec

iperf3 10 Threads.

$ iperf3 -P 10 -c 10.0.0.1
--<中略>--
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   41             sender
[  5]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[  7]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   24             sender
[  7]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[  9]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   70             sender
[  9]   0.00-10.00  sec  4.24 GBytes  3.64 Gbits/sec                  receiver
[ 11]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   30             sender
[ 11]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[ 13]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   65             sender
[ 13]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[ 15]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   44             sender
[ 15]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[ 17]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   34             sender
[ 17]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[ 19]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   75             sender
[ 19]   0.00-10.00  sec  4.24 GBytes  3.65 Gbits/sec                  receiver
[ 21]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   72             sender
[ 21]   0.00-10.00  sec  4.24 GBytes  3.64 Gbits/sec                  receiver
[ 23]   0.00-10.00  sec  4.25 GBytes  3.65 Gbits/sec   45             sender
[ 23]   0.00-10.00  sec  4.24 GBytes  3.64 Gbits/sec                  receiver
[SUM]   0.00-10.00  sec  42.5 GBytes  36.5 Gbits/sec  500             sender
[SUM]   0.00-10.00  sec  42.4 GBytes  36.4 Gbits/sec                  receiver

iperf Done.

36.4 Gbits/sec

iperf2 Single Thread.

$ iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 2.13 MByte (default)
------------------------------------------------------------
[  3] local 10.0.0.2 port 46828 connected with 10.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  40.0 GBytes  34.4 Gbits/sec

34.4 Gbits/sec

iperf2 10 Threads.

$ iperf -c 10.0.0.1 -P 10
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 1.90 MByte (default)
------------------------------------------------------------
[ 12] local 10.0.0.2 port 46848 connected with 10.0.0.1 port 5001
[  8] local 10.0.0.2 port 46838 connected with 10.0.0.1 port 5001
[  7] local 10.0.0.2 port 46840 connected with 10.0.0.1 port 5001
[ 11] local 10.0.0.2 port 46846 connected with 10.0.0.1 port 5001
[  5] local 10.0.0.2 port 46834 connected with 10.0.0.1 port 5001
[  6] local 10.0.0.2 port 46836 connected with 10.0.0.1 port 5001
[ 10] local 10.0.0.2 port 46842 connected with 10.0.0.1 port 5001
[  4] local 10.0.0.2 port 46832 connected with 10.0.0.1 port 5001
[  9] local 10.0.0.2 port 46844 connected with 10.0.0.1 port 5001
[  3] local 10.0.0.2 port 46830 connected with 10.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[ 12]  0.0-10.0 sec  8.39 GBytes  7.21 Gbits/sec
[  8]  0.0-10.0 sec  8.72 GBytes  7.49 Gbits/sec
[  7]  0.0-10.0 sec  22.3 GBytes  19.1 Gbits/sec
[ 11]  0.0-10.0 sec  8.59 GBytes  7.38 Gbits/sec
[  5]  0.0-10.0 sec  9.57 GBytes  8.22 Gbits/sec
[  6]  0.0-10.0 sec  21.7 GBytes  18.6 Gbits/sec
[ 10]  0.0-10.0 sec  8.56 GBytes  7.35 Gbits/sec
[  4]  0.0-10.0 sec  9.24 GBytes  7.93 Gbits/sec
[  9]  0.0-10.0 sec  8.87 GBytes  7.62 Gbits/sec
[  3]  0.0-10.0 sec  9.19 GBytes  7.90 Gbits/sec
[SUM]  0.0-10.0 sec   115 GBytes  98.8 Gbits/sec

98.8 Gbits/sec

表にしてみると以下のようになりました。

計測方法 実測値
iperf3 Single Thread 30.3 Gbits/sec
iperf3 10 Threads 36.4 Gbits/sec
iperf2 Single Thread 34.4 Gbits/sec
iperf2 10 Threads 98.8 Gbits/sec

先ほどと同様に、こちらもiperf3よりiperf2の方が計測時に速度が出ていることが分かります。

まとめ

先ほどの結果をまとめて表にしてみると以下のようになりました。

計測方法 MTU 1500 MTU 9000
iperf3 Single Thread 23.6 Gbits/sec 30.3 Gbits/sec
iperf3 10 Threads 26.6 Gbits/sec 36.4 Gbits/sec
iperf2 Single Thread 22.8 Gbits/sec 34.4 Gbits/sec
iperf2 10 Threads 85.8 Gbits/sec 98.8 Gbits/sec

これらの結果を踏まえると、それぞれの計測方法においてMTU9000の方が計測値が速いことから、ジャンボフレームはある程度の効果があると考えられます。
また、iperf2において-Pオプションを使用して並列実行することで、98.8 Gbits/secと100Gbps近い数値が出ています。

iperf2-Pオプションを使用して計測することでソフトウェア側のボトルネックをある程度解消できることは、以前計測を行った際の結果から予想していましたが、せいぜい40Gbps程度が限界だろうと思っていたので、100Gbpsという理論値に近い数値が出たことは予想外でした。

テスト結果が信頼できるかどうかという点については不明ですが、正しい結果であるとすれば、100GbEにおいてもiperf2-Pオプションと併用することで帯域テストを行うことは十分可能なのではないでしょうか。

今回は 100GbE 環境をマシンごと利用できる機会があったので、検証を行ってみました。
本環境で100Gbps出せるという事が確認できました。

40GbE環境や100GbE環境でiperf2iperf3を使用して帯域テストを行う際には、ソフトウェア側がボトルネックになる可能性を考慮する必要があります。

参考になれば幸いです。

About

インフラエンジニア
主に作業ログ

About Me

Archives