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/24
と10.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環境でiperf2
やiperf3
を使用して帯域テストを行う際には、ソフトウェア側がボトルネックになる可能性を考慮する必要があります。
参考になれば幸いです。