本文中に記載の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-configopenvswitchの転送処理は前回同様カーネルモジュールで行うため、まずはlinuxカーネルのソースツリーが必要となります。
そこでソースを取得してbuildを行います。ちなみに、openvswitchのカーネルモジュールはlinux 3.3以降ではカーネルに含まれるようになりましたが、OpenBlocks AX3で採用しているlinux 3.0.6ではまだ含まれていませんので別途モジュール作成が必要となります。
(今回はAX3上でtarの展開がうまく行かなかったため他のマシンで展開したものをコピーして利用しました)$ 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
# ln -s linux-3.0.6 linuxつぎにopenvswitchのソースを取得してbuildを行います。今回は7月29日時点での最新版の1.6.1を使用しました。
# cd linux
# make obsax3_defconfig
# make menuconfig
# make uImage modules
# make modules_install
makeが問題なく通ったらmake installを行います。/usr/local以下にインストールされます。$ 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
さらに作成したモジュールをinsmodします。
特にエラーメッセージ等が出なければ準備完了となります。$ su# make install# insmod datapath/linux/openvswitch_mod.ko
次にopenvswitchの基本動作を確認します。
まずはデータベースを新たに作成しデータベースサーバを起動、初期化をします。
続いてovs-vswitchdデーモンを起動します。
# mkdir -p /usr/local/etc/openvswitch基本動作としてeth0, eth1, eth2, eth3をブリッジさせる動作を確認します。
# 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
ここまでで準備は完了です。# 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をサーバモードで起動します。
そして、OBSAX3#2ではnuttcpをクライアントモードで起動し、10秒間測定します。PC-1# nuttcp -S
結果は上記のように約940Mbpsの性能となりました。openvswitchなしでPC#1とobsax3#2を直結した場合でもほぼ同様の結果となりました。obsax3-2# nuttcp -i1 -T10 192.168.111.141119.3750 MB / 10.02 sec = 937.1064 Mbps 35 %TX 24 %RX 0 retrans 0.75 msRTT
測定に使用した機材の関係上この性能までしか確認できませんでしたががまだ余力がありそうな感じです。
◆Openflowパケット解析用のwireshark pluginをインストール
Openflowパケット解析のためにwiresharkのpluginをインストールします。
その前にまずはwiresharkパッケージをインストールします。
$ su次にpluginのソースを取得しbuildします。
# aptitude install wireshark
$ git clone git://gitosis.stanford.edu/openflow.gitmake installを行うと/usr/lib/wireshark/plugins/packet-openflow.so
$ cd openflow/utilities/wireshark_dissectors/
$ make
# make install
がインストールされ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続いてNOX Classicのソースをダウンロードしてbuildします。
# 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
今回利用したバージョンはcommit aee2a3fb696a497a87a30cfc3285d142a464cbc0 です。
$ cd ~make checkで特に問題なければ導入は完了です。
$ git clone http://github.com/noxrepo/nox-classic.git
$ cd nox-classic
$ ./boot.sh
$ mkdir build
$ cd build
$ ../configure
$ make
$ cd src
$ make check
◆NOX Classicを動かしてみる
NOXにはスイッチ動作を行うサンプルが附属しているので試してみます。
C++版は ~/nox-classic/build/src/nox/coreapps/switch/ にあります。
$ cd ~/nox-classic/build/srcこれでOpenflowコントローラが起動しました。
$ ./nox_core -v -i ptcp:6633 switch
次にOpen vSwitchをOpenflowコントローラに接続します。
$ suOBSAX3#2からPC#1へpingを行って応答が返ることを確認します。
# ovs-vsctl set-controller br0 tcp:127.0.0.1
obsax3-2$ ping -n 192.168.111.14このときtsharkでOpenflowパケットを観察してみると以下のようになりました。
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
$ 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 ~全てpythonなのでコンパイルは不要ですぐに使用できます。
$ git clone http://github.com/noxrepo/pox.git
◆POXを動かしてみる
まずはOpen vSwitchをNOXから切り離しNOXをCtrl-Cで中断します。
$ su準備ができたのでPOXに附属のl2スイッチを試してみます。
# ovs-vsctl del-controller br0
# ./nox_core ... (Ctrl-C)
参考までにソースは~/pox/pox/forwarding/l2_learning.py です。
$ cd ~/poxこれでOpenflowコントローラ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>
次にOpen vSwitchをOpenflowコントローラに接続します。
$ suOBSAX3#2からPC#1へpingを行って応答が返ることを確認します。
# ovs-vsctl set-controller br0 tcp:127.0.0.1
obsax3-2$ ping -n 192.168.111.14このときPOXを起動したコンソールには以下のようにDEBUGメッセージが表示されます。
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
DEBUG:forwarding.l2_learning:installing flow for 00:0a:85:00:05:35.1 -> XX:XX:XX:XX:XX:XX.4またtsharkでOpenflowパケットを観察してみると以下のようになりました。
DEBUG:forwarding.l2_learning:installing flow for XX:XX:XX:XX:XX:XX.4 -> 00:0a:85:00:05:35.1
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コントローラにはARPやICMPが2個ずつ届いていますがNOXとほぼ同様のフローとなっています。
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)
◆まとめ
OpenBlocks AX3でOpen vSwitchを動作させてみました。転送性能は約940Mbpsであることを確認しました。
またOpenflowコントローラのNOX ClassicおよびPOXをOpenBlocks AX3上で動作できることを確認しました。
0 件のコメント:
コメントを投稿