Date post: | 02-Jul-2015 |
Category: |
Software |
Upload: | lagopus-sdnopenflow-switch |
View: | 576 times |
Download: | 3 times |
小さなマシン
● Mini-ITXなマシン→ふつうに動く。でも大きい
● 候補 o Intel NUC, BRIX →おそらくふつうに動く。つまらん。
o ZOTAC ZBOX →CPUいろいろ、モデルによる。
o Win8タブレット→Linuxだとタッチパネルも無線もダメ。
o Galileo, Edison →メモリが少なすぎる。無理。
● 半日で準備するなら、持ってるしZBOXかな……
ZOTAC ZBOX nano
● Intel NUCみたいなサイズ o 発売はNUCよりもずっと前
● VIAやAMDのプロセッサを載せたモデルもある
● AMD-E350を載せたモデルを数年前に購入 o WiFi内蔵、GbEはRealtekが1本
o ベアボーンにパーツを追加し組み立て
o メモリ 4GB, SSD 32GB
AMD E-350
● 1.6GHz dual core (64bit), GPU内蔵, TDP18W
● ノート用プロセッサ
● MMX, SSE, SSE2, SSE3, SSSE3, SSE4a o SSE4.2やAVXには未対応
● 2011年発売 o 当時のAtom (D525とか) 対抗
o 2014年現在、ひとことでいえば、遅い
AMD E-350でLagopus動くの?
● Intel DPDKが動作するかが問題 o AMD PhenomIIではコンパイルできなかった(1.6.0)
o PCAP PMD等を使えばIntel以外のNICでも動くが……
● DPDKが動作すれば、おそらくLagopusも大丈夫 o スループットはおそらく出ないけど
o メモリはひとまず足りている
● とにかく、動かしてみよう!
OSのインストール
● 今回使ったのは Fedora 20 (amd64) o USB接続のDVDドライブを使う
o とくに問題なく入る
o GUIが基本なのでマウスがないと初期設定大変
Intel DPDKのコンパイル
● DPDK 1.7.0を使ってみる
● コンパイルする→案の定エラーが出る o librte_pmd_i40e
o librte_pmd_ixgbe
o librte_acl
● SSE4.2あるいはAVXが使えない問題
DPDK 1.7.0コンパイルエラーの処置
● i40e, ixgbe→Intel 40GbE NIC, 10GbE NIC o 当該ハードを使わない(使えない)のでconfigから削る
● librte_acl→ACLライブラリ o 現在のLagopusでは使ってないのでconfigから削る
● config/common_linuxappを編集 o CONFIG_RTE_LIBRTE_I40E_PMD=n
o CONFIG_RTE_LIBRTE_IXGBE_PMD=n
o CONFIG_RTE_LIBRTE_ACL=n
その後に出たDPDK 1.7.1
● configの変更をしなくてもコンパイルとおった(!)
● ので、1.7.1を使います
Lagopusのコンパイル
● 必要なライブラリ・ツールはsudo yum install o ncurses-devel, libpcap-devel,
o openssl-devel, expat-devel, gmp-devel,
o byacc, flex
● ふつうにDPDK版のconfigure, make
● とくに問題なく完了
● ビルド時間は4分37秒 o 参考: 手持ちのXeon E3機では30秒でした
Lagopusを動かしてみる前に
● Ryuも入れておく o sudo yum install python-pip
o sudo yum install python-devel
o sudo pip install ryu
Lagopusを動かしてみる前に(その2)
● PCAP PMDを使ってもいいけれど
● 今回は自作したPipe PMDを使ってみます
Pipe PMD
● DPDK portを2つ生やすPMD
● 2ポート1組で、つながっている(port idは連番)
● 同一プロセス内で2ポートをつなぐ
● 内部でrte_ringを2つ使っている
Port id 0 Port id 1
TX
RX TX
RX rte_ring
rte_ring
LagopusとPipe PMD
Lagopusはbridgeを複数作れます
bridgeどうしをつなぐのにPipe PMDを使います
Lagopus
br0 br1 pipe0
pipe1
pipe2
Port1=id 0
Port2=id 2
Port3=id 4
Port1=id 1
Port3=id 5
Port2=id 3
Ryuのcertification testを動かす
● 動かし方 o cd /usr/lib/python2.7/site-packages
o ryu-manager ./ryu/tests/switch/tester.py
● OpenFlowスイッチ(bridge)を2つ使う o DUT: datapath id 1のスイッチ
o 補助スイッチ: datapath id 2のスイッチ
lagopus.conf
interface {
ethernet {
eth0;
eth1;
(中略)
eth5;
}
}
bridge-domains {
br0 {
dpid 0.00:00:00:00:00:01;
port {
eth0 port-no 1;
eth2 port-no 2;
eth4 port-no 3;
}
controller {
127.0.0.1;
}
}
br1 {
dpid 0.00:00:00:00:00:02;
port {
eth1 port-no 1;
eth3 port-no 2;
eth5 port-no 3;
}
controller {
127.0.0.1;
}
}
}
Pipe PMDの組み込み
● 方法はいくつかある o DPDKのツリーに加える
o Lagopusのツリーに加える
o shared lib版DPDKを使いLagopus起動時に加える
● 今回はLagopusの中に入れました o ソースを置いて
o Makefile(.in)に追記するだけ
Lagopus起動コマンドライン
sudo lagopus -d -- -c3 -n1
--vdev eth_pipe0,socket=0
--vdev eth_pipe1,socket=0
--vdev eth_pipe2,socket=0
-- -p3f
結果
● テストトラフィックを流すとコケました。 Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0x7fff715fe700 (LWP 16283)]
0x00007ffff63fa404 in _mm_crc32_u32 (__V=572662306, __C=0)
at /usr/lib/gcc/x86_64-redhat-linux/4.8.3/include/smmintrin.h:815
815 return __builtin_ia32_crc32si (__C, __V);
o DPDKのrte_hash_crc()
o E-350ではCRC32命令がサポートされていない模様
o ソフトで置き換えれば動くかも(さらに遅くなる)
o dpdk-dev MLでもソフトウェア実装が提案されている
再挑戦
● CRC32を使ってる場所は一か所 o フローを複数のworkerコアに振り分ける部分
o E-350のworkerコアは一つ、計算不要
● CRC32計算しないオプションをつけてみる
● --fifoness none o CRC32を使わず受信したらとにかく分散させる
o 複数コアだとフローの順序性が保証されない
o コアが一つなので問題なし
動いた!!
● OK(955) / ERROR(36)
● やっぱり遅い
● error内訳
o eth_type(1)
o ip_proto(8)
o meter(27)
遅い理由
● ハードウェアがそもそも遅い o クロック1.6GHz
● dual coreでLagopusは速くない o I/O,OpenFlowを1core 1threadで交互に処理する
o I/Oとworker間接続は1threadでもrte_ring経由
● チューニングにより多少は改善可能