背景
100Gbit Ethernet がデータセンターネットワーク(NW機器)では当たり前に使われるようになり、旬な AI 機械学習基盤では 400G から早くも 800G に移行しつつある昨今ですが、今回初めて 100G NIC(Intel E810-CQDA2)を搭載したサーバをセットアップしたら色々ハマったのでメモとして残しておきます。
私の理解が間違っているところがあるかもしれません。ご容赦を。
いつも通り Ubuntu を入れたら速度が出ない
いつも通り Ubuntu20.04 を入れて iperf で速度試験をしたら 40Gbps 弱ぐらいしか出ない・・・
MTU を 9000 にしろ
的なことはいろいろなところで書かれているがどうやらそれだけではなさそう。
データシートを見る限りショートパケットでも 100G 出ることになっている。
なぜだろう。
対応ポイントはいくつも
以下順を追って簡単に。
- OS (Kernel)の選択
- ドライバ
- NIC 設定
- トランシーバー
- ベンチマーク(iperf)
- NIC 選定
OS (Kernel)の選択
結論から言うと Ubuntu20.04 LTS をいつも通り入れたが、まずコレがよくなかった。
Ubuntu22.04 LTS 以降を使うべき。
更に細かく言うと標準カーネルを使うべき。(low latency ではない方が良い)
これは後の ドライバ、 NIC 設定に関連する。
ドライバ
Ubuntu に含まれている標準 ICE ドライバはNG。
パフォーマンスが悪く、パケットドロップが発生する。
NIC ベンダー純正(Intel)のドライバが必要で、コンパイルしてインストールする。
https://www.intel.co.jp/content/www/jp/ja/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html
Ansible で構築を自動化する場合これがちょっと面倒。
自分で dkms 対応のパッケージを作るか、都度コンパイルするように Playbook を書くか。
NIC 設定
上記の OS 選択と Intel 純正 ICE ドライバのインストールができたらようやく環境が整う。
NIC の設定で 割り込みの統合
を設定する。
この設定が Ubuntu20.04 だと出来ない。
また low latency kernel も選択しがちだ。これは高スループットの通信よりもリアルタイム性が高い(高頻度の割り込みが必要な)場合に使用する。100G NIC の場合はむしろ速度低下につながる。
ethtool -C eth0 adaptive-rx on adaptive-tx on
ethtool -C eth1 adaptive-rx on adaptive-tx on
トランシーバー
これは未だ未解決。
速度というよりはパケットドロップの話。
Intel 純正の SR4 トランシーバーなのに E810-CQDA2 との組み合わせでドロップが発生する。
ベンダーサポートで交換してもらっても再発する。
他のトランシーバーに替えると直るので闇深そう?
ベンチマーク(iperf)
iperf 自体がボトルネックになるので注意が必要。
いろいろなところで MTU 9000 とか、iperf を並列実行(-P オプションではなく)とか書かれているが -Z, --zerocopy オプションが重要。CPU 負荷が下がりスループットが上がる。
iperf3 を使った試験では iperf3 自体の並列実行、 -P オプションによる同時コネクション数設定、 -Z オプションの3つ併用で 100G を計測できた。 MTU 9000 は使っていない。
NIC 選定
E810-CQDA2 は 100G x2 port だが、2ポート合計(カード全体)で 100G しか出ない。
2ポート合計 200G のモデルは E810-2CQDA2 というのが存在する。
この点は気がつかなかったし、データシートをしっかり読まないとわからない。(英語で数千ページある)
最後に
まだ未解決のトランシーバー問題があるが、とりあえず 100G は出た。
速度でてないなーと思ったらとりあえずこの辺を確認するのがよさそう。