Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
-
Upload
tomoya-hibi -
Category
Software
-
view
119 -
download
0
Transcript of Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
0 Copyright©2016 NTT corp. All Rights Reserved.
TremaDay # 10 in Okinawa
Lagopusで試すL3ルーティング+α
2016/12/07
hibitomo
0
1 Copyright©2016 NTT corp. All Rights Reserved.
いろいろLagopusの仕様が変わっているので情報をまとめてインターネットに放流したい.
インストール
vhost
Hybrid Switch (action:NORMAL)
DSL仕様
断片的な情報を @masaru0714 さんが公開しているのでそれをまとめる.
今日の目標
2 Copyright©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
参考情報
3 Copyright©2016 NTT corp. All Rights Reserved.
Agenda
- Lagopus?
- デモ内容: OpenFlow + L3ルーティング
- Lagopus 0.2.10 のコンパイル&インストール
- Lagopus 0.2.10 の設定(DSL)
- DPDKの設定,インターフェースの設定
- 起動コマンド
- Flow投入 without controller
- 統計情報取得やらなにやら
- Ryuとの接続
- デモ
4 Copyright©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
5 Copyright©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
Throughp
ut(G
bps)
Packetsize(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
Throughp
ut(G
bps)
Packetsize(byte)
Lagopus
Wire-rate
6 Copyright©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
Thro
ug
hp
ut(
Gb
ps)
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
7 Copyright©2016 NTT corp. All Rights Reserved.
Action: Normalを活用する
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
8 Copyright©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
9 Copyright©2016 NTT corp. All Rights Reserved.
端末2からのパケットはそのままルーティング
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
10 Copyright©2016 NTT corp. All Rights Reserved.
端末1からのパケットはネットワーク監視アプリにも送信
デモ構成
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
11 Copyright©2016 NTT corp. All Rights Reserved.
Action: NORMAL
確認できる機能
サーバ
端末1
L2ブリッジ
端末2
OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
Action: NORMAL (L3ルーティング)
Action: NORMAL (L2スイッチ)
12 Copyright©2016 NTT corp. All Rights Reserved.
様々なインターフェース
確認できる機能
サーバ
端末1
Bridge1
端末2
Bridge2
Application ネットワーク監視
Lagopus
KVM Namespace
Raw Socket vhost-user pipe 物理
13 Copyright©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 になりました
14 Copyright©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
15 Copyright©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関連
16 Copyright©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用の最初のコロン
を忘れない)
17 Copyright©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
18 Copyright©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
19 Copyright©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
20 Copyright©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のための設定
21 Copyright©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
22 Copyright©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 --
23 Copyright©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
24 Copyright©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'/>
25 Copyright©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>
26 Copyright©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
27 Copyright©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
28 Copyright©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}}}
29 Copyright©2016 NTT corp. All Rights Reserved.
とりあえずping
まだコントローラ起動してないよ
デモ
サーバ
端末1
L2ブリッジ OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
30 Copyright©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}
31 Copyright©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"}}
32 Copyright©2016 NTT corp. All Rights Reserved.
時間がないのでしないかも
デモ
サーバ
端末1
L2ブリッジ OpenFlow + L3 ルーティング
Application ネットワーク監視
Lagopus
KVM Namespace
33 Copyright©2016 NTT corp. All Rights Reserved.
Lagopusは高速なOpenFlow1.3対応のソフトウェアスイッチ
output: normal で簡単なL2スイッチング対応
output: normal で簡単なL3ルーティング対応
仮想マシンを含む様々なインターフェースとの接続
OpenFlow + L3ルーティングでこれまでにないネットワーク運用が可能
本スライドの内容とQUICKSTART.mdを参考にすれば同等の環境を構築できるはず...
まとめ
34 Copyright©2016 NTT corp. All Rights Reserved.
ご清聴ありがとうございました
34
########## ;;;; #### #### ##
#### #### ## ####
##### ######## ################ ## ##
### ######## ## ###### ## ## ## #### ###### ## ## ## ## ##
###### #### ######## #### ##########
####################mmmm ############