Ubuntu Weekly Recipe

第539回 LXDのコンテナからSR-IOV対応デバイスを利用する

この記事を読むのに必要な時間:およそ 8 分

複数のコンテナでSR-IOVデバイスを利用する

もう一台コンテナを作成して,同じPhysical Function enp4s0f0を親に持つ別のVirtual Functionを割り当ててみましょう。コンテナ名はshimarinとします。

$ lxc launch ubuntu:18.04 shimarin
Creating shimarin
Starting shimarin

$ lxc config device add shimarin eth1 nic nictype=sriov parent=enp4s0f0
Device eth1 added to shimarin

コマンドはnadeshikoeth1を割り当てた時とコンテナ名が異なるだけです。LXDが未使用のVirtual Functionを選んでコンテナに割り当てるため,ユーザーはVirtual Functionの利用状況を意識せずに済みます。

コンテナshimarineth1にはIPアドレス172.16.1.13/24を設定します。

$ lxc exec shimarin ip address add 172.16.1.13/24 dev eth1
$ lxc exec shimarin ip link set dev eth1 up

$ lxc list -c ns4
+-----------+---------+-----------------------+
|   NAME    |  STATE  |         IPV4          |
+-----------+---------+-----------------------+
| nadeshiko | RUNNING | 172.16.1.12 (eth1)    |
|           |         | 10.150.118.16 (eth0)  |
+-----------+---------+-----------------------+
| shimarin  | RUNNING | 172.16.1.13 (eth1)    |
|           |         | 10.150.118.237 (eth0) |
+-----------+---------+-----------------------+

shimarinにもiperf3をインストールし,nadeshikoshimarinの2台で対向のIPアドレス 172.16.1.11のマシン間のスループットを計測してみましょう。対向のマシンではサーバーモードのiperf3を2プロセス,それぞれポート5201,5202で待ち受けさせています。nadeshikoからポート5201宛に,shimarinからポート5202宛に,iperf3のクライアントモードで同時に接続します。実行タイミングがずれると正確な転送スピードが測れないため,ここではsystemd-runコマンドを使用してホスト上のsystemd(systemd.timer)から同時刻にiperf3を実行してみます。

$ systemd-run --user --timer-property=AccuracySec=1s --on-calendar='2018-09-25 22:55:00 JST' \
  lxc exec nadeshiko -- /bin/sh -c 'iperf3 -c 172.16.1.11 -i 0 -p 5201 > nadeshiko.iperf3.txt'

$ systemd-run --user --timer-property=AccuracySec=1s --on-calendar='2018-09-25 22:55:00 JST' \
  lxc exec shimarin  -- /bin/sh -c 'iperf3 -c 172.16.1.11 -i 0 -p 5202 > shimarin.iperf3.txt'

--user --timer-property=AccuracySec=1s --on-calendar='2018-09-25 22:55:00 JST'までがsytemd.timerの設定です。--userでユーザー権限での登録,--timer-property=AccuracySec=1sでタイマー精度を1秒に指定(デフォルトは1分)⁠--on-calendar='2018-09-25 22:55:00 JST'でコマンドの実行開始時刻を指定しています。lxc exec以降が各コンテナ内でのiperf3実行部分です。コンテナ内でiperf3の出力をファイルにリダイレクトする都合上,/bin/shコマンドの-cオプションでシェルプロセスとして実行しています。

指定した実行開始時刻になると,ホスト上のsystemd.timerから各lxc execコマンドが実行されます。実行終了まで待って結果を見てみましょう。

コンテナnadeshikoの実行結果です。

$ lxc exec nadeshiko -- ls -l nadeshiko.iperf3.txt
-rw-r--r-- 1 root root 534 Sep 25 22:55 nadeshiko.iperf3.txt

$ lxc exec nadeshiko -- cat nadeshiko.iperf3.txt
Connecting to host 172.16.1.11, port 5201
[  5] local 172.16.1.12 port 48584 connected to 172.16.1.11 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-10.00  sec  5.48 GBytes  4.71 Gbits/sec   17    714 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.00  sec  5.48 GBytes  4.71 Gbits/sec   17             sender
[  5]   0.00-10.00  sec  5.48 GBytes  4.71 Gbits/sec                  receiver

iperf Done.

コンテナshimarinの実行結果です。

$ lxc exec shimarin -- ls -l shimarin.iperf3.txt
-rw-r--r-- 1 root root 534 Sep 25 22:55 shimarin.iperf3.txt

$ lxc exec shimarin -- cat shimarin.iperf3.txt
Connecting to host 172.16.1.11, port 5202
[  5] local 172.16.1.13 port 34928 connected to 172.16.1.11 port 5202
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-10.00  sec  5.49 GBytes  4.71 Gbits/sec    2    691 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.00  sec  5.49 GBytes  4.71 Gbits/sec    2             sender
[  5]   0.00-10.00  sec  5.48 GBytes  4.71 Gbits/sec                  receiver

iperf Done.

nadeshikoshimarinのどちらも4.71 Gbits/sec程度,合計9.42 Gbits/secの転送スピードが出ています。10GbEのほぼ全帯域を2コンテナで半分ずつ利用できていることがわかります。

コンテナからSR-IOVデバイスを削除する

コンテナからSR-IOVデバイスを削除する方法は,他の種類のデバイスを削除する場合と変わりません。

$ lxc config device remove shimarin eth1
Device eth1 removed from shimarin

nictype=sriovのデバイスを削除すると,そのコンテナに割り当てられていたVirtual FunctionはLXDによりリリースされ,他のコンテナから利用可能になります。同様に,コンテナ自体を削除した場合も,LXDが自動的にVirtual Functionを回収してくれます。

著者プロフィール

大田晃彦(おおたあきひこ)

Ubuntuでアニメを録画したり積んだりしながら暮らしています。全体的に浅いです。

コメント

コメントの記入