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を使用しました。

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

1
2
$ 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を実行します。

1
2
3
4
5
$ 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の再起動が必要な旨のメッセージが表示されますので、指示に従います。

1
2
3
4
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コマンドを使用しました。

1
$ sudo ip link set enp65s0 up

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

1
$ sudo ip addr add <ip> dev enp65s0

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ 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.

1
2
3
4
5
6
7
8
$ 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ 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にして再度計測を行ってみます。

1
$ sudo ip link set dev enp65s0 mtu 9000

iperf3 Single Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ 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.

1
2
3
4
5
6
7
8
$ 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ 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を使用して帯域テストを行う際には、ソフトウェア側がボトルネックになる可能性を考慮する必要があります。

参考になれば幸いです。