あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Raspberry Pi 5に10GbE NICを乗せたやつを2台並べてiperf3で計測すると……

明日はオープンソースカンファレンス 2024 Tokyo/Springです。この記事の物体を展示予定なのでお近くの方はぜひ。

event.ospn.jp

OSCに10GbE NICのデモを持ち込みたい

これの続き。

akkiesoft.hatenablog.jp

10GbE NICが動くことがわかったので、OSCでデモをしたら映えるかなと思い、会社からNICを借りてきました。適当に余っているIntel X520を連れ出そうとしたら、部長から「そんな古いんじゃ消費電力デカくね?YOUこれ持っていきなよ(意訳)」と、Mellanox ConnectX-4 Lxを授かりました。社内的にはもう箪笥の肥やしになっていたものですが、10GbEどころか25GbEもいけるNICです。はげしい。<写真>

というわけで、これを持ち帰ってカーネルコンパイルを済ませ(mlx5_coreを有効にしました)、動作も確認できました。

手持ちのSolarFlareのカードがiperf3で3Gbps止まりだったのに対して、ConnectX-4は6Gbps==750MB/sを叩き出したので、PCIe 3.0x1が理論値8.0Gbpsなのと、NVMeがシーケンシャル700MB/sくらい出していることを考えると、ちゃんとPi 5のPCIeの性能を使えている感じがしますね。VERY GOOD.

対向のマシンがほしい

上記のテストはあくまで(10GbEスイッチを介して)自宅サーバーの10GbEとテストした結果です。OSCに持ち込むには対向のマシンが必要ですし、できればコンパクトな方が良いです。

手としては、ラズピッピで前回のブログで使えないと書いた安物PCIe変換をリトライするか、CM4のIOボードでやるかという感じでしたが、カーネルコンパイルして試した結果、

(1) どちらも共通して、/boot/firmware/cmdline.txtに「pcie_ports=compat pcie_aspm=off」を追加しないと、PCIeのリンクエラーが大量に出てなんかシステムがめちゃくちゃ不安定になったりする
(2) (1)の対策後、安物PCIe変換は動きそうだったのに対して、CM4はやはりダメそう

というわけで、Pi 5と安物PCIe変換のリトライで行く方向にしました。

なお、この間にながいずみさんからMisskey.ioでお声がけいただき、超立派なM.2→PCIe変換とATX電源のセットを譲って頂いたのですが、可搬性の都合から一旦見送りました。OSCが終わってから遊びたい所存。

misskey.io

やっていき

構成はこんなかんじ。会社から借りてきすぎだろ。

  • 10GbE NICを搭載したPi 5(私物)を2台用意してiperf3をかけてあそぶ環境
    • ケーブルは会社からずっと借りっぱなしのDAC(余してるのでヨシ!)
    • 安物PCIe変換の方には外部電源として昔CD-ROMドライブを動かすのに使っていた電源を使用
  • iperf3を実行したり、デスクトップのデモとして使用するための、NVMe SSDを搭載したPi 5(会社でVPNサーバーにしようと調達していたものを拝借)を1台

Pi 5の公式電源が、ユーザー会のサンプル1つしかないため、これはNVMeの方に割り当てます。10GbE環境は5V3Aで動かすことになりますが、まあなんか動いたので良しとしつつ、OSはMicroSDカードにして省電力&挿しっぱなしにして現地での設営の手間を削減していきます。

MicroSDカードのOSセットアップは、コンパイル済みの環境に合わせてRPi OS(64-bit)を選択して、コンパイル済みのファイルをコピーして展開しました。

$ tar xzf pi-kernerl-pcie.tgz
$ sudo cp boot/firmware/initramfs_2712 boot/firmware/kernel_2712.img /boot/firmware/
$ sudo rsync -a lib/modules/6.1.77-v8-16k+ /lib/modules/
$ sudo reboot

起動してNICが認識しているのを確認したら、nmcliでIPアドレスを適当に固定します。

$ ip a
(略)
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 24:8a:07:XX:XX:Xa brd ff:ff:ff:ff:ff:ff
5: eth2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 24:8a:07:XX:XX:Xb brd ff:ff:ff:ff:ff:ff

$ nmcli con
NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  db957665-1d22-36da-a7ae-2103d0958e43  ethernet  eth0   
preconfigured       e62b271f-03bf-4a79-b9db-8238d6f2b4e3  wifi      wlan0  
lo                  51f50ece-5d00-435e-a865-842930898cd4  loopback  lo     
Wired connection 2  09b5f6c9-5da5-3c17-aecb-1df3dc85f32a  ethernet  --     
Wired connection 3  fcaa7110-709b-3ca6-b07d-9e4c375d1eff  ethernet  --

$ sudo nmcli con mod "Wired connection 2" ipv4.method manual ipv4.addresses 192.168.10.2/24

もう一台も同じ作業を繰り返して(IPアドレスを適宜変更)構築は完了です。

iperf3実行用のデスクトップ環境の用意

デスクトップ環境と言いつつ、適当なスイッチングハブがなかったので、10GbE環境へのアクセスのために、USB-LAN変換を2本挿してオンボードのやつとブリッジポートにしました。nmcliでブリッジを作る手順は以下を参考にしました。

enakai00.hatenablog.com

# ブリッジつくるやつ
$ sudo nmcli con add type bridge ifname br0
$ sudo nmcli con modify bridge-br0 bridge.stp no
$ sudo nmcli con modify bridge-br0 ipv4.method auto

# ブリッジにぶら下げるやつ
$ sudo nmcli con add type bridge-slave ifname eth0 master bridge-br0
$ sudo nmcli con add type bridge-slave ifname eth1 master bridge-br0
$ sudo nmcli con add type bridge-slave ifname eth2 master bridge-br0

# オンボードポートの設定をとばすやつ
$ sudo nmcli con del "有線接続 1"

あとはOSCでやる練習も兼ねてKVMも揃える感じで配線。デスクトップ環境はモバイルルーターに接続する感じでやっていくこととして、これの無線経由でワンチャンMacとかからもアクセスできる想定としました。そんなわけで、ひととおり完成です。


iperf3を実行してみよう

片方をサーバーにしておいといて、

akkie@tengbe1:~ $ iperf3 -s

もう片方からテストを実行します。

akkie@tengbe2:~ $ iperf3 -c 192.168.10.1
Connecting to host 192.168.10.1, port 5201
[  5] local 192.168.10.2 port 60458 connected to 192.168.10.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   757 MBytes  6.35 Gbits/sec    1   1.56 MBytes       
[  5]   1.00-2.00   sec   758 MBytes  6.35 Gbits/sec    0   1.56 MBytes       
[  5]   2.00-3.00   sec   756 MBytes  6.34 Gbits/sec   12   1.56 MBytes       
[  5]   3.00-4.00   sec   758 MBytes  6.35 Gbits/sec    8   1.56 MBytes       
[  5]   4.00-5.00   sec   760 MBytes  6.38 Gbits/sec    0   1.56 MBytes       
[  5]   5.00-6.00   sec   759 MBytes  6.36 Gbits/sec    0   1.56 MBytes       
[  5]   6.00-7.00   sec   760 MBytes  6.38 Gbits/sec    0   1.56 MBytes       
[  5]   7.00-8.00   sec   759 MBytes  6.36 Gbits/sec    0   1.56 MBytes       
[  5]   8.00-9.00   sec   760 MBytes  6.38 Gbits/sec    0   1.56 MBytes       
[  5]   9.00-10.00  sec   759 MBytes  6.36 Gbits/sec    0   1.56 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  7.41 GBytes  6.36 Gbits/sec   21             sender
[  5]   0.00-10.00  sec  7.41 GBytes  6.36 Gbits/sec                  receiver

6.36Gbpsの結果が出ました。は、はええよ。サーバー側の10回の実行結果も6.36Gbpsで合っていますね。MB/sにすると795MB/sなので、まあ早い。

[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  7.41 GBytes  6.36 Gbits/sec                  receiver

昨晩環境ができた直後は5Gbps台に落ちる回もあったので、発熱とか電源の兼ね合いもあるともちろんあると思われますが、それでも早いので、感動の性能ですね。

ちなみに、ここで片方のPi 5を手持ちのSolarFlareのカードにすると、やはり3Gbps台に落ちるようだったので、ドライバー的な問題かもしれませんし、だいぶ古いので、まあしょうがないかなという気はします。

まとめ&あしたの告知

  • Pi 5にMellanox ConnectX-4を乗せたものを2台用意して1:1でiperf3を実行すると6.36Gbps==795MB/sくらい出る
  • 手持ちのSolarFlareのカードは古すぎるので3Gbpsくらいしか出ない

というわけで、なんとか動く環境が作れたので、明日はOSCでこれの展示ができそうです。ヨカッタァ。

明日のOSCは去年と同じく浅草です。展示物は10GbEをメインにするので、今年一年回して来たものはいくつか引っ込めの予定です。また、tnishinagaさんがPi 5のJTAGデバッグデモをしに来てくれるそうなので、そちらもお楽しみに。なお、Pi 5のデバッグの話はraspi.jpのほうにも記事を寄稿いただきました。ありがてえありがてえ!

www.raspi.jp

www.raspi.jp

さぁ、機材を荷造りするか……。