2012年8月9日木曜日

OpenBlocks AX3でOpenFlowを試してみる

本文中に記載のLinuxソースコードは、開発段階のものです。
実際にお試しになる場合は、正式公開するバージョンに適宜読み替えて下さい。
また検証環境では、ストレージ併用モードを使用しています。


◆はじめに

以前OpenBlocks 600DにOpenvSwitchを導入しました。今回はOpenBlocks AX3に導入してみてどの程度の性能がでるか確認を行います。
さらに、以前OpenFlow ControllerとしてTremaを試してみましたが、今回はOepnFlowコントローラのNOXおよびPOXを試してみます。


◆OpenBlocks AX3へのOpen vSwitch導入

まずはopenvswitchコンパイルの準備としてlibssl-dev, pkg-configパッケージをインストールします。
 # aptitude install libssl-dev pkg-config
openvswitchの転送処理は前回同様カーネルモジュールで行うため、まずはlinuxカーネルのソースツリーが必要となります。
そこでソースを取得してbuildを行います。ちなみに、openvswitchのカーネルモジュールはlinux 3.3以降ではカーネルに含まれるようになりましたが、OpenBlocks AX3で採用しているlinux 3.0.6ではまだ含まれていませんので別途モジュール作成が必要となります。
 $ cd /tmp
 $ wget ftp://ftp.plathome.co.jp/pub/OBSAX3/CURRENT-20120703/source/ax3/linux-3.0.6.tar.gz
 $ su
 # cd /usr/src
 # tar zxvf /tmp/linux-3.0.6.tar.gz
 (今回はAX3上でtarの展開がうまく行かなかったため他のマシンで展開したものをコピーして利用しました)
 # ln -s linux-3.0.6 linux
 # cd linux
 # make obsax3_defconfig
 # make menuconfig
 # make uImage modules
 # make modules_install
つぎにopenvswitchのソースを取得してbuildを行います。今回は7月29日時点での最新版の1.6.1を使用しました。
 $ wget http://openvswitch.org/releases/openvswitch-1.6.1.tar.gz
 $ tar zxvf openvswitch-1.6.1.tar.gz
 $ cd openvswitch-1.6.1
 $ ./configure --with-linux=/lib/modules/`uname -r`/build
 $ make
makeが問題なく通ったらmake installを行います。/usr/local以下にインストールされます。
さらに作成したモジュールをinsmodします。
 $ su
 # make install
 # insmod datapath/linux/openvswitch_mod.ko
特にエラーメッセージ等が出なければ準備完了となります。

次にopenvswitchの基本動作を確認します。
まずはデータベースを新たに作成しデータベースサーバを起動、初期化をします。
続いてovs-vswitchdデーモンを起動します。
 # mkdir -p /usr/local/etc/openvswitch
 # ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
 2012-07-30T02:18:38Z|00001|lockfile|INFO|/usr/local/etc/openvswitch/.conf.db.~lock~: lock file does not exist, creating

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

 # ovs-vsctl --no-wait init

 # ovs-vswitchd --pidfile --detach
 2012-07-30T02:19:50Z|00001|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connecting...
 2012-07-30T02:19:50Z|00002|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connected
基本動作としてeth0, eth1, eth2, eth3をブリッジさせる動作を確認します。
 # ovs-vsctl add-br br0
 # ovs-vsctl add-port br0 eth0
 # ovs-vsctl add-port br0 eth1
 # ovs-vsctl add-port br0 eth2
 # ovs-vsctl add-port br0 eth3
 # ifconfig br0 up
ここまでで準備は完了です。


◆OpenBlocks AX3でのOpen vSwitch性能測定

検証用のネットワーク構成は以下のようにします。
















OBSAX3#1でopenvswitchを動作させた状態でOBSAX3#2からPC#1へのpingやsshできることを確認します。

基本動作が確認できたところでOBSAX3#1のopenvswitchの性能測定を行います。
OBSAX3#2とPC#1間でnuttcpを使用して確認します。なお確認はmtu 1500のみで行いました。

まずPC#1でnuttcpをサーバモードで起動します。
 PC-1# nuttcp -S
そして、OBSAX3#2ではnuttcpをクライアントモードで起動し、10秒間測定します。
 obsax3-2# nuttcp -i1 -T10 192.168.111.14
 1119.3750 MB /  10.02 sec =  937.1064 Mbps 35 %TX 24 %RX 0 retrans 0.75 msRTT
結果は上記のように約940Mbpsの性能となりました。openvswitchなしでPC#1とobsax3#2を直結した場合でもほぼ同様の結果となりました。
測定に使用した機材の関係上この性能までしか確認できませんでしたががまだ余力がありそうな感じです。


◆Openflowパケット解析用のwireshark pluginをインストール

Openflowパケット解析のためにwiresharkのpluginをインストールします。
その前にまずはwiresharkパッケージをインストールします。
 $ su
 # aptitude install wireshark
次にpluginのソースを取得しbuildします。
 $ git clone git://gitosis.stanford.edu/openflow.git
 $ cd openflow/utilities/wireshark_dissectors/
 $ make
 # make install
make installを行うと/usr/lib/wireshark/plugins/packet-openflow.so
がインストールされwireshark, tsharkコマンドでこのpluginが利用可能となります。


◆OpenFlowコントローラNOXとPOXについて

NOXは最近VMware社に買収されたことでも話題になったNicira社がオープンソースとして公開しているOpenFlowコントローラです。
以前はC++およびPythonをサポートしていましたが、最近はC++のみのNOX、PythonのみのPOXと別物になっています。
以前のC++,Python両方をサポートしたNOXはNOX Classicという名前になっています。


















新しいNOX(C++版)をbuildするためにはlibtbbが必要となります。ところがlibtbbはIntelプロセッサのみのサポートとなっていますので、ARMプロセッサのOpenBlocks AX3では利用できません。
そこで今回は、NOX ClassicおよびPOXの二つのコントローラを試してみることにします。
なお、今回もOpen vSwitchを動作させるマシンとOpenflowコントローラを動作させるマシンは同一のマシン(OBSAX3#1)とします。


◆NOX Classicの導入

まずはNOX Classicのコンパイルに必要なパッケージをインストールします。
 $ su
 # aptitude install doxygen build-essential autoconf automake make g++ libtool python libssl-dev libboost-dev
 # aptitude install libboost-filesystem-dev libboost-test-dev libboost-serialization-dev python-twisted swig
続いてNOX Classicのソースをダウンロードしてbuildします。
今回利用したバージョンはcommit aee2a3fb696a497a87a30cfc3285d142a464cbc0 です。
 $ cd ~
 $ git clone http://github.com/noxrepo/nox-classic.git
 $ cd nox-classic
 $ ./boot.sh
 $ mkdir build
 $ cd build
 $ ../configure
 $ make
 $ cd src
 $ make check
make checkで特に問題なければ導入は完了です。


◆NOX Classicを動かしてみる

NOXにはスイッチ動作を行うサンプルが附属しているので試してみます。
C++版は ~/nox-classic/build/src/nox/coreapps/switch/ にあります。
 $ cd ~/nox-classic/build/src
 $ ./nox_core -v -i ptcp:6633 switch
これでOpenflowコントローラが起動しました。
次にOpen vSwitchをOpenflowコントローラに接続します。
 $ su
 # ovs-vsctl set-controller br0 tcp:127.0.0.1
OBSAX3#2からPC#1へpingを行って応答が返ることを確認します。
 obsax3-2$ ping -n 192.168.111.14
 PING 192.168.111.14 (192.168.111.14) 56(84) bytes of data.
 64 bytes from 192.168.111.14: icmp_req=1 ttl=64 time=8.05 ms
 64 bytes from 192.168.111.14: icmp_req=2 ttl=64 time=0.502 ms
 64 bytes from 192.168.111.14: icmp_req=3 ttl=64 time=0.347 ms
 64 bytes from 192.168.111.14: icmp_req=4 ttl=64 time=0.348 ms
このときtsharkでOpenflowパケットを観察してみると以下のようになりました。
 $ su
 # tshark -R of -i lo port 6633
   1.089456 PlatC2_00:05:35 -> Broadcast    OFP+ARP Packet In (AM) (BufID=8105) (78B) => Who has 192.168.111.14?  Tell 192.168.111.221
   1.089771    127.0.0.1 -> 127.0.0.1    OFP Packet Out (CSM) (BufID=8105) (24B)
   1.090701 XX:XX:XX:XX:XX:XX -> PlatC2_00:05:35 OFP+ARP Packet In (AM) (BufID=8106) (78B) => 192.168.111.14 is at XX:XX:XX:XX:XX:XX
   1.090953    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
   1.092047 192.168.111.221 -> 192.168.111.14 OFP+ICMP Packet In (AM) (BufID=8107) (116B) => Echo (ping) request
   1.092298    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
   1.093204 192.168.111.14 -> 192.168.111.221 OFP+ICMP Packet In (AM) (BufID=8108) (116B) => Echo (ping) reply
   1.093452    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)

◆POXの導入

POXの利用には正式にはPython 2.7が必要なようですが、OpenBlocks AX3(Debian Squeeze)にインストールされているPython 2.6.6 でも動くようなのでこれを利用します。

Python版のPOXはC++版のNOXに比べて必要なものが少ないため導入が簡単です。
POXのソースをダウンロードします。今回利用したものはcommit f95dd1a81584d716823bbf565fa68254416af603 です。
 $ cd ~
 $ git clone http://github.com/noxrepo/pox.git
全てpythonなのでコンパイルは不要ですぐに使用できます。


◆POXを動かしてみる

まずはOpen vSwitchをNOXから切り離しNOXをCtrl-Cで中断します。
 $ su
 # ovs-vsctl del-controller br0

 # ./nox_core ... (Ctrl-C)
準備ができたのでPOXに附属のl2スイッチを試してみます。
参考までにソースは~/pox/pox/forwarding/l2_learning.py です。
 $ cd ~/pox
 $ ./pox.py forwarding.l2_learning
 POX 0.0.0 / Copyright 2011 James McCauley
 DEBUG:core:POX 0.0.0 going up...
 DEBUG:core:Running on CPython (2.6.6/Dec 27 2010 21:57:32)
 INFO:core:POX 0.0.0 is up.
 This program comes with ABSOLUTELY NO WARRANTY.  This program is free software,
 and you are welcome to redistribute it under certain conditions.
 Type 'help(pox.license)' for details.
 DEBUG:openflow.of_01:Listening for connections on 0.0.0.0:6633
 Ready.
 POX>
これでOpenflowコントローラPOXが起動しました。
次にOpen vSwitchをOpenflowコントローラに接続します。
 $ su
 # ovs-vsctl set-controller br0 tcp:127.0.0.1
OBSAX3#2からPC#1へpingを行って応答が返ることを確認します。
 obsax3-2$ ping -n 192.168.111.14
 PING 192.168.111.14 (192.168.111.14) 56(84) bytes of data.
 64 bytes from 192.168.111.14: icmp_req=1 ttl=64 time=33.9 ms
 64 bytes from 192.168.111.14: icmp_req=2 ttl=64 time=0.787 ms
 64 bytes from 192.168.111.14: icmp_req=3 ttl=64 time=0.482 ms
 64 bytes from 192.168.111.14: icmp_req=4 ttl=64 time=0.471 ms
このときPOXを起動したコンソールには以下のようにDEBUGメッセージが表示されます。
 DEBUG:forwarding.l2_learning:installing flow for 00:0a:85:00:05:35.1 -> XX:XX:XX:XX:XX:XX.4
 DEBUG:forwarding.l2_learning:installing flow for XX:XX:XX:XX:XX:XX.4 -> 00:0a:85:00:05:35.1
またtsharkでOpenflowパケットを観察してみると以下のようになりました。
  4.554923 PlatC2_00:05:35 -> Broadcast    OFP+ARP Packet In (AM) (BufID=281) (78B) => Who has 192.168.111.14?  Tell 192.168.111.221
  4.580751    127.0.0.1 -> 127.0.0.1    OFP Packet Out (CSM) (BufID=281) (16B)
  5.554998 PlatC2_00:05:35 -> Broadcast    OFP+ARP Packet In (AM) (BufID=282) (78B) => Who has 192.168.111.14?  Tell 192.168.111.221
  5.590975    127.0.0.1 -> 127.0.0.1    OFP Packet Out (CSM) (BufID=282) (24B)
  5.591595 XX:XX:XX:XX:XX:XX -> PlatC2_00:05:35 OFP+ARP Packet In (AM) (BufID=283) (78B) => 192.168.111.14 is at XX:XX:XX:XX:XX:XX
  5.595215    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
  5.595942 192.168.111.221 -> 192.168.111.14 OFP+ICMP Packet In (AM) (BufID=284) (116B) => Echo (ping) request
  5.595998 192.168.111.221 -> 192.168.111.14 OFP+ICMP Packet In (AM) (BufID=285) (116B) => Echo (ping) request
  5.600189    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
  5.600744 192.168.111.14 -> 192.168.111.221 OFP+ICMP Packet In (AM) (BufID=286) (116B) => Echo (ping) reply
  5.604300    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
  5.604831 192.168.111.14 -> 192.168.111.221 OFP+ICMP Packet In (AM) (BufID=287) (116B) => Echo (ping) reply
  5.608876    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
  5.639848    127.0.0.1 -> 127.0.0.1    OFP Flow Mod (CSM) (80B)
コントローラにはARPやICMPが2個ずつ届いていますがNOXとほぼ同様のフローとなっています。


◆まとめ

OpenBlocks AX3でOpen vSwitchを動作させてみました。転送性能は約940Mbpsであることを確認しました。
またOpenflowコントローラのNOX ClassicおよびPOXをOpenBlocks AX3上で動作できることを確認しました。

0 件のコメント:

コメントを投稿