#7 CentOS 7.3でのOpen vSwitch 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
初期設定
続いて、設定をしていきます。ソースコードに含まれる下記のドキュメントを参考に行いました。
以下では/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-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を用いました。
また、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 |
testpmd |
Linux |
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に接続してみます。