現在位置: ホーム / みらくるブログ / #7 CentOS 7.3でのOpen vSwitch 2.7.0のインストールと実行

#7 CentOS 7.3でのOpen vSwitch 2.7.0のインストールと実行

前回まではDPDKに付属のパケット転送ツールを使ってきました。今回はDPDKを利用するアプリケーションのひとつであるOpen vSwitchをCentOS 7.3上に導入します。Open vSwitchは、2/27にリリースされたばかりの2.7.0を使ってみました。

インストール

これまで紹介してきたホスト2 (CentOS 7.3)にOpen vSwitch (OVS)をインストールします。DPDKがインストールされている必要があります。まだの場合、第2を参照してインストールしてください。執筆時点で最新のバージョン2.7.0を使ってみます。

$ curl http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz | tar xzvf -
(省略)
$ cd openvswitch-2.7.0/
$ ./configure --with-dpdk=/usr/local
$ make
$ sudo make install

初期設定

続いて、設定をしていきます。ソースコードに含まれる下記のドキュメントを参考に行いました。

Documentation/intro/install/dpdk.rst

以下では/usr/loca/binと/usr/local/sbinにパスが通っていることを前提にします。

# mkdir -p /usr/local/etc/openvswitch
# ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema
# mkdir -p /usr/local/var/run/openvswitch
# ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file

Open vSwitchは、データベースサーバと、スイッチサーバの2つのデーモンで構成されます。上記の一番最後のコマンドで、まず、データベースサーバを起動しました。起動に成功していると、下記のようにovsdb-serverプロセスが稼働しています。

# pgrep -l ovsdb
28863 ovsdb-server

続いて、設定を行います。

# ovs-vsctl --no-wait init
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

以下は、スイッチサーバーの起動です。

# ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock  --pidfile --detach

こちらも成功すると、次のようにovs-vswitchdが常駐しています。

 # pgrep -l ovs-vs
28933 ovs-vswitchd

なお、マシンを再起動しても、ovsdb-serverとovs-vswitchdは、上記の手順では自動で起動しません。必要に応じて起動してください。

OVSブリッジの作成とNICの追加

追加するNICは、これまで通り以下のようにdpdk-devbindを使います。コマンドの詳細は第2回をご参照ください。

# dpdk-devbind -b igb_uio 0000:01:00.0 0000:01:00.1

 次のコマンドでOVSのブリッジを作成します。ブリッジ名はbr0とします。

# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

続いてNICを追加します。ポート名をnic1とnic2とします。

# ovs-vsctl add-port br0 nic1 -- set Interface nic1 type=dpdk options:dpdk-devargs=0000:01:00.0
# ovs-vsctl add-port br0 nic2 -- set Interface nic2 type=dpdk options:dpdk-devargs=0000:01:00.0
OVS 2.7からポート(NIC)の追加方法が変わったようです。2.6以前は、options以降を指定せず、ポート名をdpdk0やdpdk1という固定されたルールに従って命名していました。その場合、どのデバイスがdpdk0かいう対応の確認が必要であったため、今回の改良で大変便利になっています。

次のようにブリッジの構成を確認できます。

# ovs-vsctl show
54e7bf96-649c-4a7d-8839-860b022bbec7
    Bridge "br0"
        Port "nic2"
            Interface "nic2"
                type: dpdk
                options: {dpdk-devargs="0000:01:00.1"}
        Port "br0"
            Interface "br0"
                type: internal
        Port "nic1"
            Interface "nic1"
                type: dpdk
                options: {dpdk-devargs="0000:01:00.0"}

PMD数の設定

OVSでもPMDスレッドの数やQueueとの対応を設定できます。まずは、物理NICが2枚なので、2つのPMDを2つの論理コアで使うように設定します。以下の設定0x6では論理コア1 (2)と論理コア2 (4)の2つを指定しています。

# ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x6

topコマンドを実行すると、2つのPMDが走っているので、CPU使用率が200%になっています。                                                                  

28933 root      20   0 2156668  21916   2580 S 200.7  0.1  25:02.18 ovs-vswitchd    

パケット転送

これまでtestpmdを使って行っていたパケットの転送をOVSでやってみましょう。下図のように、第5回の時と同じく、ホスト1にパケットジェネレータpktgenを用いました。

07-ovs.png

また、OVS起動時のフロールールは、下記のようにNORMALになっています。

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=2809.154s, table=0, n_packets=12327780760, n_bytes=1255183185120, idle_age=0, priority=0 actions=NORMAL

これでも動作しますが、nic1からnic2へのルールを明示した場合も測定してます。NICのポート番号を調べるために以下のコマンドを実行します。

# ovs-ofctl show br0
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000a0369f64cc84
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(nic1): addr:a0:36:9f:64:cc:84
     config:     0
     state:      0
     current:    10GB-FD
     speed: 10000 Mbps now, 0 Mbps max
 2(nic2): addr:a0:36:9f:64:cc:86
     config:     0
     state:      0
     current:    10GB-FD
     speed: 10000 Mbps now, 0 Mbps max
 LOCAL(br0): addr:a0:36:9f:64:cc:84
     config:     PORT_DOWN
     state:      LINK_DOWN
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

水色で示した部分から、nic1がOVSのポート番号1、nic2であることが分かります。以下のようにポート間のフローを明示します。

# ovs-ofctl del-flows br0
# ovs-ofctl add-flow br0 in_port=1,action=output:2
# ovs-ofctl add-flow br0 in_port=2,action=output:1

フロールールを確認してみます。

# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=8.256s, table=0, n_packets=54571236, n_bytes=3274274160, idle_age=0, in_port=1 actions=output:2
 cookie=0x0, duration=4.567s, table=0, n_packets=29888240, n_bytes=1793294400, idle_age=0, in_port=2 actions=output:1

測定結果

以下に結果を示します。単位はGbpsです。OVS (rule)は、フロールールを明示した場合の結果です。第5回第6回で計測したtestpmdを利用した結果、Linux Bridgeを利用した結果も参考に記載します。OVSのどちらも、testpmdを利用した場合よりスループットは低下しています。またフロールールを明示したケースが若干スループットが高いように見えます。

パケット
サイズ

OVS

OVS
(rule)

testpmd
(2Q2P)

Linux
Bridge

64 8.82 9.00 15.5 2.98
128 14.8 16.1 19.4 5.61
256 20.0 20.0 20.0 9.16

次回は、VMをOVSに接続してみます。