Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo

1

0Copyright©2016 NTT corp. All Rights Reserved.
TremaDay # 10 in Okinawa
Lagopusで試すL3ルーティング+α
2016/12/07
hibitomo
0

2

1Copyright©2016 NTT corp. All Rights Reserved.
 いろいろLagopusの仕様が変わっているので情報をまとめてイン
ターネットに放流したい.
 インストール
 vhost
 Hybrid Switch (action:NORMAL)
 DSL仕様
 断片的な情報を @masaru0714 さんが公開しているのでそれをまと
める.
今日の目標

3

2Copyright©2016 NTT corp. All Rights Reserved.
 @masaru0714 さんのスライド群
 http://www.slideshare.net/masaruoki9
 Lagopus book
 http://www.lagopus.org/lagopus-book/en/html/
 本発表で利用しているスクリプト
 https://github.com/hibitomo/lagopus-tools
 https://github.com/hibitomo/lago-dsl
 https://github.com/hibitomo/lago-mon
 https://github.com/hibitomo/ofctl_script
参考情報

4

3Copyright©2016 NTT corp. All Rights Reserved.
Agenda
- Lagopus?
- デモ内容: OpenFlow + L3ルーティング
- Lagopus 0.2.10 のコンパイル&インストール
- Lagopus 0.2.10 の設定(DSL)
- DPDKの設定,インターフェースの設定
- 起動コマンド
- Flow投入 without controller
- 統計情報取得やらなにやら
- Ryuとの接続
- デモ

5

4Copyright©2016 NTT corp. All Rights Reserved.
Lagopus
OpenFlowスイッチのソフトウェア実装
汎用x86サーバで動作可能
高速なパケット処理と幅広いプロトコルに対応
> 10Gbps
OpenFlow1.3仕様に幅広く対応
OpenFlow コントローラ
コントロールプレーン
OpenFlow
プロトコル
OpenFlow スイッチ
データプレーン
Flow Table
フローパターン アクション
フローパターン アクション カウンター
カウンター
Flow
Table
#2
Flow
Table
#3
Flow
Table
#4

6

5Copyright©2016 NTT corp. All Rights Reserved.
性能評価
 単純なポートフォワードを実施した場合のスループットを測定
CPU
E5-2697v2
2.70GHz
NIC Intel X520
メモリ 64GB OS Ubuntu 14.04LTS
CPU
E5-2667v3
3.20GHz
NIC Intel XL710
メモリ 64GB OS Ubuntu 14.04LTS
 10GbE
 測定環境
 測定結果
 40GbE
 測定環境
 測定結果
6.66
8.65
9.28 9.49 9.63 9.77 9.83 9.85 9.86
0
1
2
3
4
5
6
7
8
9
10
0 200 400 600 800 1000 1200 1400
Throughput(Gbps)
Packet size (byte)
Lagopus
Wire-rate
7.7
15.5
26.5
34.2
39.2 39.5
0
5
10
15
20
25
30
35
40
0 200 400 600 800 1000 1200 1400
Throughput(Gbps)
Packet size (byte)
Lagopus
Wire-rate

7

6Copyright©2016 NTT corp. All Rights Reserved.
最新の性能
1.9
3.6
7.4
20.6
36.3
39.4
8.2
16.1
25.0
34.0
39.2 39.5
9.0
17.9
27.6
35.1
39.2 39.5
0
5
10
15
20
25
30
35
40
45
0 200 400 600 800 1000 1200 1400 1600
Throughput(Gbps)
Packet size (bytes)
-- -cff00 -n4 -- --fifoness none
-- -cff00 -n4 -- --bsz "(32,32),(32,32),(32,32) --fifoness none
-- -cff00 -n4 -- --bsz "(32,32),(32,32),(32,32) --fifoness none --rx "(0,0,9),(1,0,10)" --tx "(0,10),(1,9)" --w "11,12,13,14,15"
wirerate

8

7Copyright©2016 NTT corp. All Rights Reserved.
 Action: Normalを活用する
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace

9

8Copyright©2016 NTT corp. All Rights Reserved.
 Action: Normalを活用する
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
192.168.0.10
192.168.1.10
192.168.0.1 192.168.1.1
10.0.0.1

10

9Copyright©2016 NTT corp. All Rights Reserved.
 端末2からのパケットはそのままルーティング
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace

11

10Copyright©2016 NTT corp. All Rights Reserved.
 端末1からのパケットはネットワーク監視アプリにも送信
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace

12

11Copyright©2016 NTT corp. All Rights Reserved.
 Action: NORMAL
確認できる機能
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
Action: NORMAL
(L3ルーティング)
Action: NORMAL
(L2スイッチ)

13

12Copyright©2016 NTT corp. All Rights Reserved.
 様々なインターフェース
確認できる機能
サーバ
端末1
Bridge1
端末2
Bridge2
Application ネットワーク監視
Lagopus
KVM Namespace
Raw Socketvhost-userpipe物理

14

13Copyright©2016 NTT corp. All Rights Reserved.
 LagopusのDPDKオプション変更(vHOST-USER PMD を使う場合)
Lagopusのインストール(基本はQUICKSTART.mdを参考に)
diff --git a/mk/make_dpdk.sh b/mk/make_dpdk.sh
index 52914c6..92d3e97 100755
--- a/mk/make_dpdk.sh
+++ b/mk/make_dpdk.sh
@@ -80,7 +80,7 @@ edit_dpdk_config CONFIG_RTE_BUILD_SHARED_LIB=y $NEWCONFIG
#edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_AESNI_MB=y $NEWCONFIG
edit_dpdk_config CONFIG_RTE_IXGBE_INC_VECTOR=n $NEWCONFIG
edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_PCAP=n $NEWCONFIG
-edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_VHOST=n $NEWCONFIG
+edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_VHOST=y $NEWCONFIG
edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO=n $NEWCONFIG
edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_BOND=n $NEWCONFIG
edit_dpdk_config CONFIG_RTE_APP_TEST=n $NEWCONFIG
v0.2.10からはデフォルトで CONFIG_RTE_LIBRTE_PMD_VHOST=y になりました

15

14Copyright©2016 NTT corp. All Rights Reserved.
 Hugepageの設定
 QUICKSTART.mdを参照
 コンパイル (OpenFlow hybrid switchを使う場合)
 “--enable-hybrid” : hybrid switchをenableにする
 “--enable-jumbo-frame” : ジャンボフレームに対応する
• ※ vhost-userが上手く動いて無さそう
 “gcc-full-opt” : 最適化オプションを付ける(つけないと”-O0”)
Lagopusのインストール(基本はQUICKSTART.mdを参考に)
$ ./configure --enable-hybrid --enable-jumbo-frame
$ make gcc-full-opt -j 8
$ sudo make install

16

15Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (例)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller01-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0
interface interface04 create -type ethernet-rawsock -device veth0
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2
bridge bridge02 enable
コントローラ
関連
Interface関連
port関連
Bridge関連

17

16Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (例)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller01-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0
interface interface04 create -type ethernet-rawsock -device veth0
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2
bridge bridge02 enable
物理: PCIアドレス.
(namespace用の最初のコロン
を忘れない)

18

17Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (例)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller01-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0
interface interface04 create -type ethernet-rawsock -device veth0
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2
bridge bridge02 enable
Pipe

19

18Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (例)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller01-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0
interface interface04 create -type ethernet-rawsock -device veth0
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2
bridge bridge02 enable
vhost

20

19Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (例)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller01-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0
interface interface04 create -type ethernet-rawsock -device veth0
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2
bridge bridge02 enable
rawsocket

21

20Copyright©2016 NTT corp. All Rights Reserved.
 lagopus.dsl (今回のデモ用の設定)
Lagopusの設定ファイル
channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller01 create -channel controller01-channel -role equal -connection-type main
channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp
controller controller02 create -channel controller02-channel -role equal -connection-type main
interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.2 -mtu 9000
interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 -mtu 9000
interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 -mtu 9000
interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 -mtu 9000
interface interface04 create -type ethernet-rawsock -device veth0 -mtu 9000
port port01 create -interface interface00
port port02 create -interface interface01
port port03 create -interface interface02
port port04 create -interface interface03
port port05 create -interface interface04
bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 -l2-bridge true -mactable-ageing-time 300 -
mactable-max-entries 8192
bridge bridge01 enable
bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 -l2-bridge true -mactable-
ageing-time 300 -mactable-max-entries 8192
bridge bridge02 enable
MTUの設定
action: normalのための設定

22

21Copyright©2016 NTT corp. All Rights Reserved.
 DPDK (16.11版.スクリプトの名前が変わっています)
 Linuxカーネルから,DPDKに管理を移す
 Rawsock
 プロトコルオフロードをoffにする必要がある
NICの設定
$ sudo ./src/dpdk/tools/dpdk-devbind.py --bind=igb_uio 0000:02:02.0
$ sudo ethtool -K veth0 tx off

23

22Copyright©2016 NTT corp. All Rights Reserved.
 Lagopus 0.2.10
 DSLに記述してあれば,--vdevオプションは不要
 -p オプションは不要
Lagopusの起動
$ sudo lagopus -C ${LAGOPUS_DSL} -- -c e -n 4 -m 1024 --

24

23Copyright©2016 NTT corp. All Rights Reserved.
※ Lagopusを実行,interfaceを作成してからVMを起動する
 QEMUで直接起動する場合のコマンド
VMの起動
sudo qemu-system-x86_64 ¥
-M pc-1.0 -cpu host -m 4096 -smp 4 -enable-kvm ¥
-drive file=/home/vsw/IMAGES/Ubuntu64_lagopus.img,if=none,id=drive-virtio-disk0,format=raw ¥
-device virtio-blk-pci,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 ¥
-object memory-backend-file,id=mem,size=4096M,mem-path=/mnt/huge,share=on ¥
-mem-prealloc -mem-path /dev/hugepages ¥
-numa node,memdev=mem ¥
-chardev socket,id=chr0,path=/tmp/sock0 ¥
-netdev vhost-user,id=hostnet0,chardev=chr0,vhostforce ¥
-device virtio-net-pci,netdev=hostnet0,id=net0,csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off ¥
-vnc 0.0.0.0:0

25

24Copyright©2016 NTT corp. All Rights Reserved.
※ Lagopusを実行,interfaceを作成してからVMを起動する
 libvirtを使う場合のXML定義ファイル (CPU部分)
 あとapparmorの設定.面倒であれば消す.
VMの起動
@@ -21,6 +26,10 @@
</features>
<cpu mode='host-model'>
<model fallback='allow'/>
+ <topology sockets='1' cores='8' threads='1'/>
+ <numa>
+ <cell id='0' cpus='0-7' memory='8388608' unit='KiB' memAccess='shared'/>
+ </numa>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>

26

25Copyright©2016 NTT corp. All Rights Reserved.
※ Lagopusを実行,interfaceを作成してからVMを起動する
 libvirtを使う場合のXML定義ファイル (DPDK利用のinterface部分)
 あとapparmorの設定.面倒であれば消す.
VMの起動
<interface type='vhostuser'>
<source type='unix' path='/tmp/sock0' mode='client'/>
<mac address='52:54:00:00:00:01'/>
<model type='virtio'/>
<driver>
<host csum='off' gso='off' tso4='off' tso6='off' ecn='off' mrg_rxbuf='off'/>
<guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/>
</driver>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</interface>

27

26Copyright©2016 NTT corp. All Rights Reserved.
 IPの設定(Lagopus起動,interface作成後に操作)
 ※IPを設定しないとL2スイッチとして動作します
 DSLで記述したinterfaceと同名のinterfaceが出来ているのでそれに設定
LagopusのIPアドレスの設定
$ sudo ip addr add 10.0.0.1 dev interface02
$ sudo ip addr add 192.168.0.1 dev interface03
$ sudo ip addr add 192.168.1.1 dev interface04

28

27Copyright©2016 NTT corp. All Rights Reserved.
 telnet
 スクリプト
 https://github.com/hibitomo/lago-dsl
 Document
 https://github.com/lagopus/lagopus/blob/master/docs/how-to-use-
ds-flow-cmd.md
コントローラレスのFlow投入
$ telnet 127.0.0.1 12345
flow bridge01 add priority=1 apply_actions=output:normal
$ ./lago-dsl.py flow bridge01 add priority=1 apply_actions=output:normal
$ ./lago-dsl.py flow bridge02 add priority=1 apply_actions=output:normal

29

28Copyright©2016 NTT corp. All Rights Reserved.
 OpenFlow プログラムからの取得
 lagoshで取得 ( `$ lagosh -c show interface`等)
 DSLからの取得
 DSLを使った情報取得のスクリプト
 https://github.com/hibitomo/lago-mon
統計情報の取得
$ ./lago-dsl/lago-dsl.py interface interface00 stats
[{u'name': u'interface00', u'rx-dropped': 0, u'tx-errors': 0, u'rx-bytes': 4520858, u'tx-packets': 1006, u'rx-
packets': 1606, u'tx-bytes': 3319226, u'rx-errors': 0, u'tx-dropped': 0}]
$ ./lago-mon/ifstats_monitor.py -l 10
{"timestamp": "2016-06-08T14:13:04.253669", "interfaces": {"interface1": {"name":
"interface1", "rx-dropped": 0, "tx-errors": 0, "rx-bytes": 0, "tx-packets": 0, "rx-
packets": 0, "tx-bytes": 0, "rx-errors": 0, "tx-dropped": 0}, "interface0": {"name":
"interface0", "rx-dropped": 0, "tx-errors": 0, "rx-bytes": 0, "tx-packets": 0, "rx-
packets": 0, "tx-bytes": 0, "rx-errors": 0, "tx-dropped": 0}}}

30

29Copyright©2016 NTT corp. All Rights Reserved.
 とりあえずping
 まだコントローラ起動してないよ
デモ
サーバ
端末1
L2ブリッジ OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace

31

30Copyright©2016 NTT corp. All Rights Reserved.
 Ryuの起動
 Bridgeの接続,Flowの確認
Ryuと接続
$ ryu-manager /usr/local/lib/python2.7/dist-packages/ryu/app/ofctl_rest.py
$ ~/ofctl_script/check_dpid
[1,2]
$ ~/ofctl_script/show_flow -d 1
table 0
{"match":{},"actions":["OUTPUT:NORMAL"],"cookie":0,"packet_count":0,"priority":1,"table_id":0}
$ ~/ofctl_script/show_flow -d 2
table 0
{"match":{},"actions":["OUTPUT:NORMAL"],"cookie":0,"packet_count":0,"priority":1,"table_id":0}

32

31Copyright©2016 NTT corp. All Rights Reserved.
 Flow投入
 通常のルーティングに加え,IP:10.0.0.10 からのパケットはポート3にも出
力する
Ryuと接続
$ ~/ofctl_script/add_flow -d 2 ¥
{"priority":100,"cookie":1,"actions":["OUTPUT:NORMAL","OUTPUT:3"],"match":{"eth_type":2048,"ipv4_src":"
10.0.0.10"}}

33

32Copyright©2016 NTT corp. All Rights Reserved.
 時間がないのでしないかも
デモ
サーバ
端末1
L2ブリッジ OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace

34

33Copyright©2016 NTT corp. All Rights Reserved.
 Lagopusは高速なOpenFlow1.3対応のソフトウェアスイッチ
 output: normal で簡単なL2スイッチング対応
 output: normal で簡単なL3ルーティング対応
 仮想マシンを含む様々なインターフェースとの接続
 OpenFlow + L3ルーティングでこれまでにないネットワーク運用が
可能
 本スライドの内容とQUICKSTART.mdを参考にすれば同等の環境を構
築できるはず...
まとめ

35

34Copyright©2016 NTT corp. All Rights Reserved.
ご清聴ありがとうございました
34
########
## ;;;; ##
## #### ##
#### ##
## ## ####
##### ######## ##
############## ## ##
### ######## ## ##
#### ## ## ## #### ##
#### ## ## ## ## ##
###### #### ####
#### #### ##########
####################
mmmm ##
##########

More Related Content

Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)

  • 1. 0Copyright©2016 NTT corp. All Rights Reserved. TremaDay # 10 in Okinawa Lagopusで試すL3ルーティング+α 2016/12/07 hibitomo 0
  • 2. 1Copyright©2016 NTT corp. All Rights Reserved.  いろいろLagopusの仕様が変わっているので情報をまとめてイン ターネットに放流したい.  インストール  vhost  Hybrid Switch (action:NORMAL)  DSL仕様  断片的な情報を @masaru0714 さんが公開しているのでそれをまと める. 今日の目標
  • 3. 2Copyright©2016 NTT corp. All Rights Reserved.  @masaru0714 さんのスライド群  http://www.slideshare.net/masaruoki9  Lagopus book  http://www.lagopus.org/lagopus-book/en/html/  本発表で利用しているスクリプト  https://github.com/hibitomo/lagopus-tools  https://github.com/hibitomo/lago-dsl  https://github.com/hibitomo/lago-mon  https://github.com/hibitomo/ofctl_script 参考情報
  • 4. 3Copyright©2016 NTT corp. All Rights Reserved. Agenda - Lagopus? - デモ内容: OpenFlow + L3ルーティング - Lagopus 0.2.10 のコンパイル&インストール - Lagopus 0.2.10 の設定(DSL) - DPDKの設定,インターフェースの設定 - 起動コマンド - Flow投入 without controller - 統計情報取得やらなにやら - Ryuとの接続 - デモ
  • 5. 4Copyright©2016 NTT corp. All Rights Reserved. Lagopus OpenFlowスイッチのソフトウェア実装 汎用x86サーバで動作可能 高速なパケット処理と幅広いプロトコルに対応 > 10Gbps OpenFlow1.3仕様に幅広く対応 OpenFlow コントローラ コントロールプレーン OpenFlow プロトコル OpenFlow スイッチ データプレーン Flow Table フローパターン アクション フローパターン アクション カウンター カウンター Flow Table #2 Flow Table #3 Flow Table #4
  • 6. 5Copyright©2016 NTT corp. All Rights Reserved. 性能評価  単純なポートフォワードを実施した場合のスループットを測定 CPU E5-2697v2 2.70GHz NIC Intel X520 メモリ 64GB OS Ubuntu 14.04LTS CPU E5-2667v3 3.20GHz NIC Intel XL710 メモリ 64GB OS Ubuntu 14.04LTS  10GbE  測定環境  測定結果  40GbE  測定環境  測定結果 6.66 8.65 9.28 9.49 9.63 9.77 9.83 9.85 9.86 0 1 2 3 4 5 6 7 8 9 10 0 200 400 600 800 1000 1200 1400 Throughput(Gbps) Packet size (byte) Lagopus Wire-rate 7.7 15.5 26.5 34.2 39.2 39.5 0 5 10 15 20 25 30 35 40 0 200 400 600 800 1000 1200 1400 Throughput(Gbps) Packet size (byte) Lagopus Wire-rate
  • 7. 6Copyright©2016 NTT corp. All Rights Reserved. 最新の性能 1.9 3.6 7.4 20.6 36.3 39.4 8.2 16.1 25.0 34.0 39.2 39.5 9.0 17.9 27.6 35.1 39.2 39.5 0 5 10 15 20 25 30 35 40 45 0 200 400 600 800 1000 1200 1400 1600 Throughput(Gbps) Packet size (bytes) -- -cff00 -n4 -- --fifoness none -- -cff00 -n4 -- --bsz "(32,32),(32,32),(32,32) --fifoness none -- -cff00 -n4 -- --bsz "(32,32),(32,32),(32,32) --fifoness none --rx "(0,0,9),(1,0,10)" --tx "(0,10),(1,9)" --w "11,12,13,14,15" wirerate
  • 8. 7Copyright©2016 NTT corp. All Rights Reserved.  Action: Normalを活用する デモ構成 サーバ 端末1 L2ブリッジ 端末2 OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace
  • 9. 8Copyright©2016 NTT corp. All Rights Reserved.  Action: Normalを活用する デモ構成 サーバ 端末1 L2ブリッジ 端末2 OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace 192.168.0.10 192.168.1.10 192.168.0.1 192.168.1.1 10.0.0.1
  • 10. 9Copyright©2016 NTT corp. All Rights Reserved.  端末2からのパケットはそのままルーティング デモ構成 サーバ 端末1 L2ブリッジ 端末2 OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace
  • 11. 10Copyright©2016 NTT corp. All Rights Reserved.  端末1からのパケットはネットワーク監視アプリにも送信 デモ構成 サーバ 端末1 L2ブリッジ 端末2 OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace
  • 12. 11Copyright©2016 NTT corp. All Rights Reserved.  Action: NORMAL 確認できる機能 サーバ 端末1 L2ブリッジ 端末2 OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace Action: NORMAL (L3ルーティング) Action: NORMAL (L2スイッチ)
  • 13. 12Copyright©2016 NTT corp. All Rights Reserved.  様々なインターフェース 確認できる機能 サーバ 端末1 Bridge1 端末2 Bridge2 Application ネットワーク監視 Lagopus KVM Namespace Raw Socketvhost-userpipe物理
  • 14. 13Copyright©2016 NTT corp. All Rights Reserved.  LagopusのDPDKオプション変更(vHOST-USER PMD を使う場合) Lagopusのインストール(基本はQUICKSTART.mdを参考に) diff --git a/mk/make_dpdk.sh b/mk/make_dpdk.sh index 52914c6..92d3e97 100755 --- a/mk/make_dpdk.sh +++ b/mk/make_dpdk.sh @@ -80,7 +80,7 @@ edit_dpdk_config CONFIG_RTE_BUILD_SHARED_LIB=y $NEWCONFIG #edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_AESNI_MB=y $NEWCONFIG edit_dpdk_config CONFIG_RTE_IXGBE_INC_VECTOR=n $NEWCONFIG edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_PCAP=n $NEWCONFIG -edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_VHOST=n $NEWCONFIG +edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_VHOST=y $NEWCONFIG edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO=n $NEWCONFIG edit_dpdk_config CONFIG_RTE_LIBRTE_PMD_BOND=n $NEWCONFIG edit_dpdk_config CONFIG_RTE_APP_TEST=n $NEWCONFIG v0.2.10からはデフォルトで CONFIG_RTE_LIBRTE_PMD_VHOST=y になりました
  • 15. 14Copyright©2016 NTT corp. All Rights Reserved.  Hugepageの設定  QUICKSTART.mdを参照  コンパイル (OpenFlow hybrid switchを使う場合)  “--enable-hybrid” : hybrid switchをenableにする  “--enable-jumbo-frame” : ジャンボフレームに対応する • ※ vhost-userが上手く動いて無さそう  “gcc-full-opt” : 最適化オプションを付ける(つけないと”-O0”) Lagopusのインストール(基本はQUICKSTART.mdを参考に) $ ./configure --enable-hybrid --enable-jumbo-frame $ make gcc-full-opt -j 8 $ sudo make install
  • 16. 15Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (例) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller01-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 interface interface04 create -type ethernet-rawsock -device veth0 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 bridge bridge02 enable コントローラ 関連 Interface関連 port関連 Bridge関連
  • 17. 16Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (例) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller01-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 interface interface04 create -type ethernet-rawsock -device veth0 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 bridge bridge02 enable 物理: PCIアドレス. (namespace用の最初のコロン を忘れない)
  • 18. 17Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (例) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller01-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 interface interface04 create -type ethernet-rawsock -device veth0 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 bridge bridge02 enable Pipe
  • 19. 18Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (例) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller01-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 interface interface04 create -type ethernet-rawsock -device veth0 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 bridge bridge02 enable vhost
  • 20. 19Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (例) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller01-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.1 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 interface interface04 create -type ethernet-rawsock -device veth0 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 bridge bridge02 enable rawsocket
  • 21. 20Copyright©2016 NTT corp. All Rights Reserved.  lagopus.dsl (今回のデモ用の設定) Lagopusの設定ファイル channel controller01-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller01 create -channel controller01-channel -role equal -connection-type main channel controller02-channel create -dst-addr 127.0.0.1 -protocol tcp controller controller02 create -channel controller02-channel -role equal -connection-type main interface interface00 create -type ethernet-dpdk-phy -device :0000:07:00.2 -mtu 9000 interface interface01 create -type ethernet-dpdk-phy -device eth_pipe0 -mtu 9000 interface interface02 create -type ethernet-dpdk-phy -device eth_pipe1,attach=eth_pipe0 -mtu 9000 interface interface03 create -type ethernet-dpdk-phy -device eth_vhost0,iface=/tmp/sock0 -mtu 9000 interface interface04 create -type ethernet-rawsock -device veth0 -mtu 9000 port port01 create -interface interface00 port port02 create -interface interface01 port port03 create -interface interface02 port port04 create -interface interface03 port port05 create -interface interface04 bridge bridge01 create -controller controller01 -port port01 1 -port port02 2 -dpid 0x1 -l2-bridge true -mactable-ageing-time 300 - mactable-max-entries 8192 bridge bridge01 enable bridge bridge02 create -controller controller02 -port port03 1 -port port04 2 -port port05 3 -dpid 0x2 -l2-bridge true -mactable- ageing-time 300 -mactable-max-entries 8192 bridge bridge02 enable MTUの設定 action: normalのための設定
  • 22. 21Copyright©2016 NTT corp. All Rights Reserved.  DPDK (16.11版.スクリプトの名前が変わっています)  Linuxカーネルから,DPDKに管理を移す  Rawsock  プロトコルオフロードをoffにする必要がある NICの設定 $ sudo ./src/dpdk/tools/dpdk-devbind.py --bind=igb_uio 0000:02:02.0 $ sudo ethtool -K veth0 tx off
  • 23. 22Copyright©2016 NTT corp. All Rights Reserved.  Lagopus 0.2.10  DSLに記述してあれば,--vdevオプションは不要  -p オプションは不要 Lagopusの起動 $ sudo lagopus -C ${LAGOPUS_DSL} -- -c e -n 4 -m 1024 --
  • 24. 23Copyright©2016 NTT corp. All Rights Reserved. ※ Lagopusを実行,interfaceを作成してからVMを起動する  QEMUで直接起動する場合のコマンド VMの起動 sudo qemu-system-x86_64 ¥ -M pc-1.0 -cpu host -m 4096 -smp 4 -enable-kvm ¥ -drive file=/home/vsw/IMAGES/Ubuntu64_lagopus.img,if=none,id=drive-virtio-disk0,format=raw ¥ -device virtio-blk-pci,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 ¥ -object memory-backend-file,id=mem,size=4096M,mem-path=/mnt/huge,share=on ¥ -mem-prealloc -mem-path /dev/hugepages ¥ -numa node,memdev=mem ¥ -chardev socket,id=chr0,path=/tmp/sock0 ¥ -netdev vhost-user,id=hostnet0,chardev=chr0,vhostforce ¥ -device virtio-net-pci,netdev=hostnet0,id=net0,csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off ¥ -vnc 0.0.0.0:0
  • 25. 24Copyright©2016 NTT corp. All Rights Reserved. ※ Lagopusを実行,interfaceを作成してからVMを起動する  libvirtを使う場合のXML定義ファイル (CPU部分)  あとapparmorの設定.面倒であれば消す. VMの起動 @@ -21,6 +26,10 @@ </features> <cpu mode='host-model'> <model fallback='allow'/> + <topology sockets='1' cores='8' threads='1'/> + <numa> + <cell id='0' cpus='0-7' memory='8388608' unit='KiB' memAccess='shared'/> + </numa> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/>
  • 26. 25Copyright©2016 NTT corp. All Rights Reserved. ※ Lagopusを実行,interfaceを作成してからVMを起動する  libvirtを使う場合のXML定義ファイル (DPDK利用のinterface部分)  あとapparmorの設定.面倒であれば消す. VMの起動 <interface type='vhostuser'> <source type='unix' path='/tmp/sock0' mode='client'/> <mac address='52:54:00:00:00:01'/> <model type='virtio'/> <driver> <host csum='off' gso='off' tso4='off' tso6='off' ecn='off' mrg_rxbuf='off'/> <guest csum='off' tso4='off' tso6='off' ecn='off' ufo='off'/> </driver> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </interface>
  • 27. 26Copyright©2016 NTT corp. All Rights Reserved.  IPの設定(Lagopus起動,interface作成後に操作)  ※IPを設定しないとL2スイッチとして動作します  DSLで記述したinterfaceと同名のinterfaceが出来ているのでそれに設定 LagopusのIPアドレスの設定 $ sudo ip addr add 10.0.0.1 dev interface02 $ sudo ip addr add 192.168.0.1 dev interface03 $ sudo ip addr add 192.168.1.1 dev interface04
  • 28. 27Copyright©2016 NTT corp. All Rights Reserved.  telnet  スクリプト  https://github.com/hibitomo/lago-dsl  Document  https://github.com/lagopus/lagopus/blob/master/docs/how-to-use- ds-flow-cmd.md コントローラレスのFlow投入 $ telnet 127.0.0.1 12345 flow bridge01 add priority=1 apply_actions=output:normal $ ./lago-dsl.py flow bridge01 add priority=1 apply_actions=output:normal $ ./lago-dsl.py flow bridge02 add priority=1 apply_actions=output:normal
  • 29. 28Copyright©2016 NTT corp. All Rights Reserved.  OpenFlow プログラムからの取得  lagoshで取得 ( `$ lagosh -c show interface`等)  DSLからの取得  DSLを使った情報取得のスクリプト  https://github.com/hibitomo/lago-mon 統計情報の取得 $ ./lago-dsl/lago-dsl.py interface interface00 stats [{u'name': u'interface00', u'rx-dropped': 0, u'tx-errors': 0, u'rx-bytes': 4520858, u'tx-packets': 1006, u'rx- packets': 1606, u'tx-bytes': 3319226, u'rx-errors': 0, u'tx-dropped': 0}] $ ./lago-mon/ifstats_monitor.py -l 10 {"timestamp": "2016-06-08T14:13:04.253669", "interfaces": {"interface1": {"name": "interface1", "rx-dropped": 0, "tx-errors": 0, "rx-bytes": 0, "tx-packets": 0, "rx- packets": 0, "tx-bytes": 0, "rx-errors": 0, "tx-dropped": 0}, "interface0": {"name": "interface0", "rx-dropped": 0, "tx-errors": 0, "rx-bytes": 0, "tx-packets": 0, "rx- packets": 0, "tx-bytes": 0, "rx-errors": 0, "tx-dropped": 0}}}
  • 30. 29Copyright©2016 NTT corp. All Rights Reserved.  とりあえずping  まだコントローラ起動してないよ デモ サーバ 端末1 L2ブリッジ OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace
  • 31. 30Copyright©2016 NTT corp. All Rights Reserved.  Ryuの起動  Bridgeの接続,Flowの確認 Ryuと接続 $ ryu-manager /usr/local/lib/python2.7/dist-packages/ryu/app/ofctl_rest.py $ ~/ofctl_script/check_dpid [1,2] $ ~/ofctl_script/show_flow -d 1 table 0 {"match":{},"actions":["OUTPUT:NORMAL"],"cookie":0,"packet_count":0,"priority":1,"table_id":0} $ ~/ofctl_script/show_flow -d 2 table 0 {"match":{},"actions":["OUTPUT:NORMAL"],"cookie":0,"packet_count":0,"priority":1,"table_id":0}
  • 32. 31Copyright©2016 NTT corp. All Rights Reserved.  Flow投入  通常のルーティングに加え,IP:10.0.0.10 からのパケットはポート3にも出 力する Ryuと接続 $ ~/ofctl_script/add_flow -d 2 ¥ {"priority":100,"cookie":1,"actions":["OUTPUT:NORMAL","OUTPUT:3"],"match":{"eth_type":2048,"ipv4_src":" 10.0.0.10"}}
  • 33. 32Copyright©2016 NTT corp. All Rights Reserved.  時間がないのでしないかも デモ サーバ 端末1 L2ブリッジ OpenFlow + L3 ルーティング Application ネットワーク監視 Lagopus KVM Namespace
  • 34. 33Copyright©2016 NTT corp. All Rights Reserved.  Lagopusは高速なOpenFlow1.3対応のソフトウェアスイッチ  output: normal で簡単なL2スイッチング対応  output: normal で簡単なL3ルーティング対応  仮想マシンを含む様々なインターフェースとの接続  OpenFlow + L3ルーティングでこれまでにないネットワーク運用が 可能  本スライドの内容とQUICKSTART.mdを参考にすれば同等の環境を構 築できるはず... まとめ
  • 35. 34Copyright©2016 NTT corp. All Rights Reserved. ご清聴ありがとうございました 34 ######## ## ;;;; ## ## #### ## #### ## ## ## #### ##### ######## ## ############## ## ## ### ######## ## ## #### ## ## ## #### ## #### ## ## ## ## ## ###### #### #### #### #### ########## #################### mmmm ## ##########