Install Open vSwitch with DPDK

Open vSwitchのDPDK版をインストールしてみる。

準備

DPDKはv1.8.0を使う. 最近のmasterはDPDK-v2.0.0しか対応していないので、v1.8.0をサポートしているコミットでcheckoutする。

dpdk

$ wget http://dpdk.org/browse/dpdk/snapshot/dpdk-1.8.0.zip
$ unzip dpdk-1.8.0.zip

ovs

$ git clone http://github.com/openvswitch/ovs
$ git checkout 66cabc46ecc09eeae536277a0fc7d5e44836f845

setup

DPDK

  • hugepageは1Gにしないとだめらしい。(デフォルトは2M)
    • /etc/default/grub に設定する.

grubの更新

$ diff /etc/default/grub ./grub.orig
11c11
< GRUB_CMDLINE_LINUX_DEFAULT="default_hugepagesz=1G hugepagesz=1G hugepages=8"
---
> GRUB_CMDLINE_LINUX_DEFAULT=""

grubのアップデート

$ sudo update-grub
$ sudo reboot

dpdk-の設定 - 通常利用するパッケージに追加でlibfuse-devが必要.

$ sudo apt-get install libfuse-dev
$ diff --git a/config/common_linuxapp b/config/common_linuxapp
index 2f9643b..cf211b8 100644
--- a/config/common_linuxapp
+++ b/config/common_linuxapp
@@ -81,7 +81,7 @@ CONFIG_RTE_BUILD_SHARED_LIB=n
 #
 # Combine to one single library
 #
-CONFIG_RTE_BUILD_COMBINE_LIBS=n
+CONFIG_RTE_BUILD_COMBINE_LIBS=y
 CONFIG_RTE_LIBNAME="intel_dpdk"

 #
@@ -372,7 +372,7 @@ CONFIG_RTE_KNI_VHOST_DEBUG_TX=n
 # fuse-devel is needed to run vhost.
 # fuse-devel enables user space char driver development
 #
-CONFIG_RTE_LIBRTE_VHOST=n
+CONFIG_RTE_LIBRTE_VHOST=y
 CONFIG_RTE_LIBRTE_VHOST_DEBUG=n

 #

dpdkのインストール

$ export RTE_SDK=<Absolute Path of Intel DPDK>
$ export RTE_TARGET="x86_64-native-linuxapp-gcc"
$ cd $RTE_SDK
$ make config T=${RTE_TARGET}
$ make install T=${RTE_TARGET}

Setup Open vSwitch

./configure && make && make install。makeにCFLAGS='-O3 -march=native'のオプションをつけると速いらしい。

./configure --with-dpdk=/home/vsw/hibi/dpdk-1.7.1/x86_64-native-linuxapp-gcc/
make   # make CFLAGS='-O3 -march=native'
sudo make install

以下、とりあえずREADMEをコピペ実行

sudo mkdir -p /usr/local/etc/openvswitch
sudo mkdir -p /usr/local/var/run/openvswitch
sudo rm /usr/local/etc/openvswitch/conf.db
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db         /usr/local/share/openvswitch/vswitch.ovsschema

実行

ovsdbの実行。よくわからないのでREADMEをコピペ実行。

sudo ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock     --remote=db:Open_vSwitch,Open_vSwitch,manager_options     --private-key=db:Open_vSwitch,SSL,private_key     --cer\
tnificate=Open_vSwitch,SSL,certificate     --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach

SSL周りのオプションを外したver

sudo ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach

スイッチの設定。ovs-vswitchdの--dpdk以後がdpdkのコア割当とメモリチャネル数っていうのが推察できる。その後ろのポートのアサインは不明。dpdk0、dpdk1で順番にアサインされたっぽいので、そういう仕様かと。

sudo ovs-vsctl --no-wait init
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
sudo ovs-vswitchd --dpdk -c 0xfff -n 4 -- unix:$DB_SOCK --pidfile --detach
sudo ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
sudo ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
sudo ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk
sudo ovs-ofctl show br0
sudo ovs-ofctl dump-flows br0
sudo ovs-vsctl set bridge br0 other-config:datapath-id=0000000000000001
sudo ovs-vsctl set-controller br0 tcp:127.0.0.1:6633
sudo ovs-vsctl set bridge br0 protocols=OpenFlow13
sudo ovs-ofctl dump-flows br0 --protocol=OpenFlow13

PMD(Poll mode driver)のコア割当を増やすこともできるっぽい. Lookup等の処理自体を並列化する方法は不明.other_config:pmd-cpu-maskの値がPMDに使うコアの割当っぽそう.

sudo ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=ffff