Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Lagos running on small factor machine

1,509 views

Published on

Lagopusを小箱でうごかしてみました。

Published in: Software
  • Be the first to comment

Lagos running on small factor machine

  1. 1. Lagopus running on small factor machine Nov 18, 2014 Masaru OKI @masaru0714 m-oki@stratosphere.co.jp
  2. 2. 小さなマシン ●Mini-ITXなマシン→ふつうに動く。でも大きい ●候補 oIntel NUC, BRIX →おそらくふつうに動く。つまらん。 oZOTAC ZBOX →CPUいろいろ、モデルによる。 oWin8タブレット→Linuxだとタッチパネルも無線もダメ。 oGalileo, Edison →メモリが少なすぎる。無理。 ●半日で準備するなら、持ってるしZBOXかな……
  3. 3. ZOTAC ZBOX nano ●Intel NUCみたいなサイズ o発売はNUCよりもずっと前 ●VIAやAMDのプロセッサを載せたモデルもある ●AMD-E350を載せたモデルを数年前に購入 oWiFi内蔵、GbEはRealtekが1本 oベアボーンにパーツを追加し組み立て oメモリ 4GB, SSD 32GB
  4. 4. AMD E-350 ●1.6GHz dual core (64bit), GPU内蔵, TDP18W ●ノート用プロセッサ ●MMX, SSE, SSE2, SSE3, SSSE3, SSE4a oSSE4.2やAVXには未対応 ●2011年発売 o当時のAtom (D525とか) 対抗 o2014年現在、ひとことでいえば、遅い
  5. 5. AMD E-350でLagopus動くの? ●Intel DPDKが動作するかが問題 oAMD PhenomIIではコンパイルできなかった(1.6.0) oPCAP PMD等を使えばIntel以外のNICでも動くが…… ●DPDKが動作すれば、おそらくLagopusも大丈夫 oスループットはおそらく出ないけど oメモリはひとまず足りている ●とにかく、動かしてみよう!
  6. 6. OSのインストール ●今回使ったのは Fedora 20 (amd64) oUSB接続のDVDドライブを使う oとくに問題なく入る oGUIが基本なのでマウスがないと初期設定大変
  7. 7. Intel DPDKのコンパイル ●DPDK 1.7.0を使ってみる ●コンパイルする→案の定エラーが出る olibrte_pmd_i40e olibrte_pmd_ixgbe olibrte_acl ●SSE4.2あるいはAVXが使えない問題
  8. 8. DPDK 1.7.0コンパイルエラーの処置 ●i40e, ixgbe→Intel 40GbE NIC, 10GbE NIC o当該ハードを使わない(使えない)のでconfigから削る ●librte_acl→ACLライブラリ o現在のLagopusでは使ってないのでconfigから削る ●config/common_linuxappを編集 oCONFIG_RTE_LIBRTE_I40E_PMD=n oCONFIG_RTE_LIBRTE_IXGBE_PMD=n oCONFIG_RTE_LIBRTE_ACL=n
  9. 9. その後に出たDPDK 1.7.1 ●configの変更をしなくてもコンパイルとおった(!) ●ので、1.7.1を使います
  10. 10. Lagopusのコンパイル ●必要なライブラリ・ツールはsudo yum install oncurses-devel, libpcap-devel, oopenssl-devel, expat-devel, gmp-devel, obyacc, flex ●ふつうにDPDK版のconfigure, make ●とくに問題なく完了 ●ビルド時間は4分37秒 o参考: 手持ちのXeon E3機では30秒でした
  11. 11. Lagopusを動かしてみる前に ●Ryuも入れておく osudo yum install python-pip osudo yum install python-devel osudo pip install ryu
  12. 12. Lagopusを動かしてみる前に(その2) ●PCAP PMDを使ってもいいけれど ●今回は自作したPipe PMDを使ってみます
  13. 13. 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
  14. 14. 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
  15. 15. Ryuのcertification testを動かす ●動かし方 ocd /usr/lib/python2.7/site-packages oryu-manager ./ryu/tests/switch/tester.py ●OpenFlowスイッチ(bridge)を2つ使う oDUT: datapath id 1のスイッチ o補助スイッチ: datapath id 2のスイッチ
  16. 16. 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; } } }
  17. 17. Pipe PMDの組み込み ●方法はいくつかある oDPDKのツリーに加える oLagopusのツリーに加える oshared lib版DPDKを使いLagopus起動時に加える ●今回はLagopusの中に入れました oソースを置いて oMakefile(.in)に追記するだけ
  18. 18. Lagopus起動コマンドライン sudo lagopus -d -- -c3 -n1 --vdev eth_pipe0,socket=0 --vdev eth_pipe1,socket=0 --vdev eth_pipe2,socket=0 -- -p3f
  19. 19. 結果 ●テストトラフィックを流すとコケました。 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); oDPDKのrte_hash_crc() oE-350ではCRC32命令がサポートされていない模様 oソフトで置き換えれば動くかも(さらに遅くなる) odpdk-dev MLでもソフトウェア実装が提案されている
  20. 20. 再挑戦 ●CRC32を使ってる場所は一か所 oフローを複数のworkerコアに振り分ける部分 oE-350のworkerコアは一つ、計算不要 ●CRC32計算しないオプションをつけてみる ●--fifoness none oCRC32を使わず受信したらとにかく分散させる o複数コアだとフローの順序性が保証されない oコアが一つなので問題なし
  21. 21. 動いた!! ●OK(955) / ERROR(36) ●やっぱり遅い ●error内訳 oeth_type(1) oip_proto(8) ometer(27)
  22. 22. 遅い理由 ●ハードウェアがそもそも遅い oクロック1.6GHz ●dual coreでLagopusは速くない oI/O,OpenFlowを1core 1threadで交互に処理する oI/Oとworker間接続は1threadでもrte_ring経由 ●チューニングにより多少は改善可能

×