ICTSC2023 本戦 問題解説: [ZMR] 行って帰ってiperf
ICTSC2023 本戦 問題解説: 行って帰ってiperf
問題文
概要
1Gbpsの速度のLANケーブルの速度測定をしようとして、サーバーにあるLANポート二つにLANケーブルの両端を接続しました。
この状態でNIC2からNIC1へiperfでスピードテストをしようとしたところ、20Gbpsの速度が出ました。現実的に考えると何かおかしいので、正しく速度が計測する方法(実行するコマンド等)を見つけて報告してください。
またなぜそれで動くようになったのか原因に触れてください。
再起動した後でも動くように永続化する必要はありません。
サーバーを起動
iperf --server --bind 198.18.0.1
別窓からスピードテスト
iperf --client 198.18.0.1 --bind 198.18.0.2
前提条件
- IPアドレス・サブネットを他のものに変えてはいけない
- iperfを他のマシンで動かしてはいけない
- 必ず用意したLANケーブルを使わなければいけない
初期状態
- iperfの結果が20Gbpsを超える
終了状態
- きちんとLANケーブルで通信が行われiperfコマンドの出力が1Gbps程度になる
- ↑に必要な手順・コマンドを説明している
- 原因を究明して説明している
解説
NIC1とNIC2を一台のマシンにさしてその間の速度を図りたいとする。
それぞれにIPアドレスをアサインしてiperfのsrc ipとserver bind portを設定する場合、スピードテストで物理のケーブル以上の速度が出る。
原因としては、たとえNIC 1のIPからNIC 2のIPへ通信しようともLinuxは内部で転送してしまい実際にNICからは出ないという問題。
そのためnet namespaceなどをNICごとに作成するときちんとNICに差したケーブルを使ってくれるようになる。
解決方法としては、virt1というnetnsを作り、片方のNICをそれに属させてからiperfする。
netnsを二つ作ってそれぞれに属させても良い。
sudo ip netns add virt1
sudo ip link set eth2 netns virt1
sudo ip -n virt1 link set eth2 up
sudo ip -n virt1 addr add 198.18.0.2/24 dev eth2
sudo ip netns exec virt1 iperf -s -B 198.18.0.2
iperf -c 198.18.0.2
採点基準
満点: 100点
- 20点 カーネル内の通信が行われていること、netnsを使うことに報告書で言及している。
- 60点 ↑を踏まえた上で問題環境で速度制限に成功している
- 10点 報告書の内容通りのコマンドを打つだけで問題が解決する
- 10点 報告書の内容通りのコマンドが問題環境に入っている
- 減点
- -5点 IPアドレスを他のものに変更している
- -5点 clientやserverのコマンドを省略している
講評
わかる人間にとってはすぐにLinuxの内部ルーティングを疑えるが、知らないと気づけない問題。
解答が来たチームはほとんどこれに気づいていた。
今回はL2の話なのでVRFは関係なく、代わりにnetwork namespaceを利用する必要がある。