SlideShare a Scribd company logo
1 of 19
FD.io VPP 事始め
Tetsuhiro Sato
FD.io
 FD.io
 Fast Data – Input/Output に関
連する複数のプロジェクトを運営する
Apache Foundation傘下のプロ
ジェクト
 VPPの他に、VPPの管理、VPPを用
いたユースケース、Testing等のプロ
ジェクトも管理
2
https://wiki.fd.io/view/VPP/Features
FD.io VPP
 VPP
 FD.ioの中核プロジェクト
 高性能かつ高機能な仮想スイッチ&ルータ
 DPDKを活用し、ユーザー空間のアプリケー
ションとして動作
3
Vector Packet Processing
 通常のコンピューティング処理にないパケット処理に
固有の難しさ(Instructionの観点から)
 10Gbps ラインレート=14.88Mfps = 67nsec per フレーム
 2GHz CPUコアのクロックサイクル= 0.5 nsec
 つまり、1フレームあたり134クロックサイクルの余地
 DRAM にアクセスしてしまうと、CPU サイクルがおよそ 60ns
ストールしてしまう
 Scalar Packet Processing
 パケット毎に処理
 割り込み
 コールスタックのトラバース(一連の機能を適用)
 ACL, NAT, QoS, VXLAN, etc
 Punt, drop, or rewrite/forward
 問題点
 I-cacheのスラッシング
 パケット毎に同様のI-cacheミスを繰り返す
 I-cacheを大きくしない限り、上記の問題は解決しない
 Vector Packet Processing
 各パケット処理を複数のパケットを同時に実施
 先頭のパケットがI-cacheをWarm up
 後続のパケットにはI-cacheにHit!
4
http://stackoverflow.com/questions/4087280/approximate-cost-to-access-various-
caches-and-main-memory
豊富な機能
5
! とりあえず、いろんな機能をサポート
https://wiki.fd.io/view/VPP/Features
インストール
6
 インストールスクリプトで一撃にインストールできる
https://packagecloud.io/fdio/release/install
(Ubuntu 18.04.1 LTSの例)
$ curl -s https://packagecloud.io/install/repositories/fdio/release/script.deb.sh | sudo bash
$ sudo apt-get install vpp
コマンドライン接続
7
 vppctl コマンドでVPPのコマンドラインに接続できる
$ sudo vppctl
_______ _ _ _____ ___
__/ __/ _  (_)__ | | / / _ / _ 
_/ _// // / / / _  | |/ / ___/ ___/
/_/ /____(_)_/___/ |___/_/ /_/
vpp#
$ sudo vppctl show ver
vpp v19.04-release built by root on 2decab03d139 at Wed Apr 24 00:36:29 UTC 2019
 もしくは、ホストLinux Shell上で、vppctlに続けてVPPのコマンド実行できる
コマンドライン接続
8
unix {
...
cli-listen localhost:5002
...
}
 /etc/vpp/startup.confに以下のように書いておくと、telnet経由でVPPのコマンドラインに接続できる
$ telnet localhost 5002
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
_______ _ _ _____ ___
__/ __/ _  (_)__ | | / / _ / _ 
_/ _// // / / / _  | |/ / ___/ ___/
/_/ /____(_)_/___/ |___/_/ /_/
vpp#
接続方法
 外部に接続するVPPインターフェイスの種類
9
接続方法 ユースケース(たぶん)
DPDK PDM(w/ Intel NIC, VMXNET3) ホストマシンのインターフェイスの利用
Vhost-user VMとの接続
veth コンテナとの接続
tap コンテナとの接続
ホストマシンのLinuxサービス(DHCP等)を利用
DPDKの設定
10
$ sudo lshw -class network -businfo
Bus info Device Class Description
===================================================
pci@0000:00:03.0 eth0 network 82540EM Gigabit Ethernet Controller
pci@0000:00:08.0 eth1 network 82540EM Gigabit Ethernet Controller
pci@0000:00:09.0 eth2 network 82540EM Gigabit Ethernet Controller
 DPDK対応NICのPCI IDを確認
$ sudo ifconfig eth1 down
$ sudo ifconfig eth2 down
$ sudo ip addr flush dev eth1
$ sudo ip addr flush dev eth2
 インターフェイスの設定をクリア
DPDK の設定(つづき)
dpdk {
socket-mem 1024
dev 0000:00:08.0
dev 0000:00:09.0
}
 /etc/vpp/startup.confにdpdkに関する設定を追加して、VPPを起動
 socket-memはパケットバッファ、hugepagesからアロケートされる
 socket-memは明示的に指定しないと、CPUソケット(NUMAノード)毎に512Mを確保
 VPP側では、GigabitEthernetX/Y/Zとして認識される
vpp# sh int
Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
GigabitEthernet0/8/0 1 down 9000/0/0/0
GigabitEthernet0/9/0 2 down 9000/0/0/0
local0 0 down 0/0/0/0
Vhost-user接続の設定
vpp# create vhost-user socket /var/run/vpp/sock1.sock server
 VPP側でVhost-userインターフェイスを作成
vpp# show int
Name Idx State Counter Count
VirtualEthernet0/0/0 3 down
...
qemu-system-x86_64 
-enable-kvm -m 8192 -smp cores=4,threads=0,sockets=1 -cpu host 
-drive file="ubuntu-16.04-server-cloudimg-amd64-disk1.img",if=virtio,aio=threads 
-drive file="seed.img",if=virtio,aio=threads 
-nographic -object memory-backend-file,id=mem,size=8192M,mem-path=/dev/hugepages,share=on 
-numa node,memdev=mem 
-mem-prealloc 
-chardev socket,id=char1,path=/var/run/vpp/sock1.sock 
-netdev type=vhost-user,id=net1,chardev=char1,vhostforce 
-device virtio-net-
pci,netdev=net1,mac=00:00:00:00:00:01,csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off,mrg_rxbuf=off
 対応するVhost clientと接続するVMを起動
 VPP側では VirtualEthernet0/0/Xと認識される
vethの設定
$ sudo ip link add vpp1 type veth peer name veth1
 ホストでvpp1とveth1というvethペアを作成
vpp# create host-interface name vpp1
host-vpp1
 VPP側でvpp1に接続
 veth1をコンテナ等に接続
vpp# show int
Name Idx State Counter Count
host-vpp1 4 down
…
 VPP側ではhost-vpp1と認識される
tapの設定
vpp# tap connect taphost
tap-0
 taphostというtapインターフェイスを作成
vpp# show int
Name Idx State Counter Count
tap-0 5 down
...
 VPP側ではtap-Xと認識される
 ホスト側ではtaphostとして認識される
$ ip link
...
7: taphost: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
UNKNOWN mode DEFAULT group default qlen 1000
link/ether 4e:00:94:42:8d:35 brd ff:ff:ff:ff:ff:ff
L2設定例
15
vpp# create host-interface name vpp1
host-vpp1
vpp# set interface state host-vpp1 up
vpp# set interface l2 bridge host-vpp1 1
vpp# create host-interface name vpp2
host-vpp2
vpp# set interface state host-vpp2 up
vpp# set interface l2 bridge host-vpp2 1
 VPPにvethを認識させ、L2ポートとしてBridge
Domain 1に接続
L3ポートL2ポート
Bridge Domain 1
C1 C2
veth
pair
veth
pair
eth0 eth0
Network Namespace: default
Network Namespace:
ns1
Network Namespace:
ns2
10.0.0.1 10.0.0.2
host-vpp1 host-vpp2
L3設定例
16
vpp# create loopback interface
loop0
vpp# set interface l2 bridge loop0 1 bvi
vpp# set interface state loop0 up
vpp# set interface ip address loop0 10.0.0.254/24
vpp# create host-interface name vpp3
host-vpp3
vpp# set interface state host-vpp3 up
vpp# set interface ip address host-vpp3 10.0.1.254/24
 Bridge Domain 1 に BVI インターフェイスを設定
 VPPにvethを認識させ、L3ポートとして設定
VPP Router
L3ポートL2ポート
Bridge Domain 1
C1 C2 C3
veth
pair
veth
pair
veth
pair
eth0 eth0 eth0
Network Namespace: default
Network Namespace:
ns1
Network Namespace:
ns2
Network Namespace:
ns3
10.0.0.254
10.0.1.254
10.0.0.1 10.0.0.2 10.0.1.1
host-vpp1 host-vpp2 host-vpp3
loop0(bvi)
落穂拾い
17
unix {
...
startup-config /home/userid/setup.cfg
...
}
 起動時に(仮想スイッチ&ルータとしての)VPPの設定を読み込ませるに
は、/etc/vpp/startup.confのunix句で設定ファイルを指定
落穂拾い(cont.)
18
vpp# show trace
------------------- Start of thread 0 vpp_main -------------------
Packet 1
00:13:25:316687: af-packet-input
af_packet: hw_if_index 1 next-index 1
tpacket2_hdr:
status 0x1 len 98 snaplen 98 mac 66 net 80
sec 0x5890503a nsec 0x22819a55 vlan 0
00:13:25:316712: ethernet-input
IP4: 06:28:d8:1d:3c:f2 -> 4a:74:64:4d:bd:0a
00:13:25:316721: l2-input
l2-input: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2
00:13:25:316725: l2-learn
l2-learn: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 bd_index
1
00:13:25:316728: l2-fwd
l2-fwd: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 bd_index
1
00:13:25:316730: l2-output
l2-output: sw_if_index 2 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2
00:13:25:316733: host-vpp2-output
host-vpp2
IP4: 06:28:d8:1d:3c:f2 -> 4a:74:64:4d:bd:0a
ICMP: 10.0.0.1 -> 10.0.0.2
tos 0x00, ttl 64, length 84, checksum 0x476a
fragment id 0xdf3c, flags DONT_FRAGMENT
ICMP echo_request checksum 0xebee
 /etc/vpp/startup.confのapi-trace
をonに編集
api-trace {
on
}
vpp# trace add af-packet-input 10
 traceを有効化
vpp# clear trace
 trace結果をクリア
 trace結果の確認
おわり
ご清聴、ありがとうございました
m(_ _)m
19

More Related Content

What's hot

OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月VirtualTech Japan Inc.
 
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)Kentaro Ebisawa
 
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月VirtualTech Japan Inc.
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越Kentaro Ebisawa
 
3GPP TR38.801-e00まとめ
3GPP TR38.801-e00まとめ3GPP TR38.801-e00まとめ
3GPP TR38.801-e00まとめTetsuya Hasegawa
 
閉域網接続の技術入門
閉域網接続の技術入門閉域網接続の技術入門
閉域網接続の技術入門Masayuki Kobayashi
 
BGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみたBGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみたakira6592
 
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方OpenStack超入門シリーズ いまさら聞けないNeutronの使い方
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方Toru Makabe
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザインMasayuki Kobayashi
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向Yuya Rin
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~NTT Communications Technology Development
 
3GPP F1インターフェース(TS38.470-f50)の概要
3GPP F1インターフェース(TS38.470-f50)の概要3GPP F1インターフェース(TS38.470-f50)の概要
3GPP F1インターフェース(TS38.470-f50)の概要Tetsuya Hasegawa
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414Kentaro Ebisawa
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説貴仁 大和屋
 
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月VirtualTech Japan Inc.
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月 知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月 VirtualTech Japan Inc.
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 

What's hot (20)

OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
 
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
 
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越
 
3GPP TR38.801-e00まとめ
3GPP TR38.801-e00まとめ3GPP TR38.801-e00まとめ
3GPP TR38.801-e00まとめ
 
閉域網接続の技術入門
閉域網接続の技術入門閉域網接続の技術入門
閉域網接続の技術入門
 
BGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみたBGP Unnumbered で遊んでみた
BGP Unnumbered で遊んでみた
 
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方OpenStack超入門シリーズ いまさら聞けないNeutronの使い方
OpenStack超入門シリーズ いまさら聞けないNeutronの使い方
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザイン
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向IPv4/IPv6 移行・共存技術の動向
IPv4/IPv6 移行・共存技術の動向
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
3GPP F1インターフェース(TS38.470-f50)の概要
3GPP F1インターフェース(TS38.470-f50)の概要3GPP F1インターフェース(TS38.470-f50)の概要
3GPP F1インターフェース(TS38.470-f50)の概要
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
AS45679 on FreeBSD
AS45679 on FreeBSDAS45679 on FreeBSD
AS45679 on FreeBSD
 
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
NFVアプリケーションをOpenStack上で動かす為に - OpenStack最新情報セミナー 2017年7月
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月 知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月
知っているようで知らないNeutron -仮想ルータの冗長と分散- - OpenStack最新情報セミナー 2016年3月
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 

Similar to FD.io VPP事始め

Openvswitch vps 20120429資料
Openvswitch vps 20120429資料Openvswitch vps 20120429資料
Openvswitch vps 20120429資料Daisuke Nakajima
 
Nsegソフトウェアルータvyatta
NsegソフトウェアルータvyattaNsegソフトウェアルータvyatta
Nsegソフトウェアルータvyattajem 3
 
「さくらのクラウド」におけるVyattaの活用事例
「さくらのクラウド」におけるVyattaの活用事例「さくらのクラウド」におけるVyattaの活用事例
「さくらのクラウド」におけるVyattaの活用事例SAKURA Internet Inc.
 
20150715 xflow kikuta_final
20150715 xflow kikuta_final20150715 xflow kikuta_final
20150715 xflow kikuta_finalKazumasa Ikuta
 
Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419エイシュン コンドウ
 
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...VirtualTech Japan Inc.
 
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)Tomoya Hibi
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Tomoya Hibi
 
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~npsg
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitchkazuyas
 
Trema day 1
Trema day 1Trema day 1
Trema day 1ykuga
 
『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』Juniper Networks (日本)
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Sho Shimizu
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワークYuji Oshima
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Studyirix_jp
 
Redunduncy of NAT instance on AWS/VPC
Redunduncy of NAT instance on AWS/VPCRedunduncy of NAT instance on AWS/VPC
Redunduncy of NAT instance on AWS/VPCMasaaki HIROSE
 
20170329 container technight-第一回勉強会
20170329 container technight-第一回勉強会20170329 container technight-第一回勉強会
20170329 container technight-第一回勉強会Minehiko Nohara
 

Similar to FD.io VPP事始め (20)

Openvswitch vps 20120429資料
Openvswitch vps 20120429資料Openvswitch vps 20120429資料
Openvswitch vps 20120429資料
 
Nsegソフトウェアルータvyatta
NsegソフトウェアルータvyattaNsegソフトウェアルータvyatta
Nsegソフトウェアルータvyatta
 
「さくらのクラウド」におけるVyattaの活用事例
「さくらのクラウド」におけるVyattaの活用事例「さくらのクラウド」におけるVyattaの活用事例
「さくらのクラウド」におけるVyattaの活用事例
 
20150715 xflow kikuta_final
20150715 xflow kikuta_final20150715 xflow kikuta_final
20150715 xflow kikuta_final
 
Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419
 
DPDKを拡張してみた話し
DPDKを拡張してみた話しDPDKを拡張してみた話し
DPDKを拡張してみた話し
 
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
OpenStack Kilo with 6Wind VA High-Performance Networking Using DPDK - OpenSta...
 
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
Lagopusで試すL3ルーティング + α (Lagopusの設定方法いろいろ)
 
Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続Lagopus + DockerのDPDK接続
Lagopus + DockerのDPDK接続
 
P2Pって何?
P2Pって何?P2Pって何?
P2Pって何?
 
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
 
Trema での Open vSwitch
Trema での Open vSwitchTrema での Open vSwitch
Trema での Open vSwitch
 
Ansible npstudy-shtsuchi
Ansible npstudy-shtsuchiAnsible npstudy-shtsuchi
Ansible npstudy-shtsuchi
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』『WAN SDN Controller NorthStarご紹介 & デモ』
『WAN SDN Controller NorthStarご紹介 & デモ』
 
Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像 Open vSwitchソースコードの全体像
Open vSwitchソースコードの全体像
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワーク
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
 
Redunduncy of NAT instance on AWS/VPC
Redunduncy of NAT instance on AWS/VPCRedunduncy of NAT instance on AWS/VPC
Redunduncy of NAT instance on AWS/VPC
 
20170329 container technight-第一回勉強会
20170329 container technight-第一回勉強会20170329 container technight-第一回勉強会
20170329 container technight-第一回勉強会
 

FD.io VPP事始め

  • 2. FD.io  FD.io  Fast Data – Input/Output に関 連する複数のプロジェクトを運営する Apache Foundation傘下のプロ ジェクト  VPPの他に、VPPの管理、VPPを用 いたユースケース、Testing等のプロ ジェクトも管理 2 https://wiki.fd.io/view/VPP/Features
  • 3. FD.io VPP  VPP  FD.ioの中核プロジェクト  高性能かつ高機能な仮想スイッチ&ルータ  DPDKを活用し、ユーザー空間のアプリケー ションとして動作 3
  • 4. Vector Packet Processing  通常のコンピューティング処理にないパケット処理に 固有の難しさ(Instructionの観点から)  10Gbps ラインレート=14.88Mfps = 67nsec per フレーム  2GHz CPUコアのクロックサイクル= 0.5 nsec  つまり、1フレームあたり134クロックサイクルの余地  DRAM にアクセスしてしまうと、CPU サイクルがおよそ 60ns ストールしてしまう  Scalar Packet Processing  パケット毎に処理  割り込み  コールスタックのトラバース(一連の機能を適用)  ACL, NAT, QoS, VXLAN, etc  Punt, drop, or rewrite/forward  問題点  I-cacheのスラッシング  パケット毎に同様のI-cacheミスを繰り返す  I-cacheを大きくしない限り、上記の問題は解決しない  Vector Packet Processing  各パケット処理を複数のパケットを同時に実施  先頭のパケットがI-cacheをWarm up  後続のパケットにはI-cacheにHit! 4 http://stackoverflow.com/questions/4087280/approximate-cost-to-access-various- caches-and-main-memory
  • 6. インストール 6  インストールスクリプトで一撃にインストールできる https://packagecloud.io/fdio/release/install (Ubuntu 18.04.1 LTSの例) $ curl -s https://packagecloud.io/install/repositories/fdio/release/script.deb.sh | sudo bash $ sudo apt-get install vpp
  • 7. コマンドライン接続 7  vppctl コマンドでVPPのコマンドラインに接続できる $ sudo vppctl _______ _ _ _____ ___ __/ __/ _ (_)__ | | / / _ / _ _/ _// // / / / _ | |/ / ___/ ___/ /_/ /____(_)_/___/ |___/_/ /_/ vpp# $ sudo vppctl show ver vpp v19.04-release built by root on 2decab03d139 at Wed Apr 24 00:36:29 UTC 2019  もしくは、ホストLinux Shell上で、vppctlに続けてVPPのコマンド実行できる
  • 8. コマンドライン接続 8 unix { ... cli-listen localhost:5002 ... }  /etc/vpp/startup.confに以下のように書いておくと、telnet経由でVPPのコマンドラインに接続できる $ telnet localhost 5002 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. _______ _ _ _____ ___ __/ __/ _ (_)__ | | / / _ / _ _/ _// // / / / _ | |/ / ___/ ___/ /_/ /____(_)_/___/ |___/_/ /_/ vpp#
  • 9. 接続方法  外部に接続するVPPインターフェイスの種類 9 接続方法 ユースケース(たぶん) DPDK PDM(w/ Intel NIC, VMXNET3) ホストマシンのインターフェイスの利用 Vhost-user VMとの接続 veth コンテナとの接続 tap コンテナとの接続 ホストマシンのLinuxサービス(DHCP等)を利用
  • 10. DPDKの設定 10 $ sudo lshw -class network -businfo Bus info Device Class Description =================================================== pci@0000:00:03.0 eth0 network 82540EM Gigabit Ethernet Controller pci@0000:00:08.0 eth1 network 82540EM Gigabit Ethernet Controller pci@0000:00:09.0 eth2 network 82540EM Gigabit Ethernet Controller  DPDK対応NICのPCI IDを確認 $ sudo ifconfig eth1 down $ sudo ifconfig eth2 down $ sudo ip addr flush dev eth1 $ sudo ip addr flush dev eth2  インターフェイスの設定をクリア
  • 11. DPDK の設定(つづき) dpdk { socket-mem 1024 dev 0000:00:08.0 dev 0000:00:09.0 }  /etc/vpp/startup.confにdpdkに関する設定を追加して、VPPを起動  socket-memはパケットバッファ、hugepagesからアロケートされる  socket-memは明示的に指定しないと、CPUソケット(NUMAノード)毎に512Mを確保  VPP側では、GigabitEthernetX/Y/Zとして認識される vpp# sh int Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count GigabitEthernet0/8/0 1 down 9000/0/0/0 GigabitEthernet0/9/0 2 down 9000/0/0/0 local0 0 down 0/0/0/0
  • 12. Vhost-user接続の設定 vpp# create vhost-user socket /var/run/vpp/sock1.sock server  VPP側でVhost-userインターフェイスを作成 vpp# show int Name Idx State Counter Count VirtualEthernet0/0/0 3 down ... qemu-system-x86_64 -enable-kvm -m 8192 -smp cores=4,threads=0,sockets=1 -cpu host -drive file="ubuntu-16.04-server-cloudimg-amd64-disk1.img",if=virtio,aio=threads -drive file="seed.img",if=virtio,aio=threads -nographic -object memory-backend-file,id=mem,size=8192M,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -chardev socket,id=char1,path=/var/run/vpp/sock1.sock -netdev type=vhost-user,id=net1,chardev=char1,vhostforce -device virtio-net- pci,netdev=net1,mac=00:00:00:00:00:01,csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off,mrg_rxbuf=off  対応するVhost clientと接続するVMを起動  VPP側では VirtualEthernet0/0/Xと認識される
  • 13. vethの設定 $ sudo ip link add vpp1 type veth peer name veth1  ホストでvpp1とveth1というvethペアを作成 vpp# create host-interface name vpp1 host-vpp1  VPP側でvpp1に接続  veth1をコンテナ等に接続 vpp# show int Name Idx State Counter Count host-vpp1 4 down …  VPP側ではhost-vpp1と認識される
  • 14. tapの設定 vpp# tap connect taphost tap-0  taphostというtapインターフェイスを作成 vpp# show int Name Idx State Counter Count tap-0 5 down ...  VPP側ではtap-Xと認識される  ホスト側ではtaphostとして認識される $ ip link ... 7: taphost: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 4e:00:94:42:8d:35 brd ff:ff:ff:ff:ff:ff
  • 15. L2設定例 15 vpp# create host-interface name vpp1 host-vpp1 vpp# set interface state host-vpp1 up vpp# set interface l2 bridge host-vpp1 1 vpp# create host-interface name vpp2 host-vpp2 vpp# set interface state host-vpp2 up vpp# set interface l2 bridge host-vpp2 1  VPPにvethを認識させ、L2ポートとしてBridge Domain 1に接続 L3ポートL2ポート Bridge Domain 1 C1 C2 veth pair veth pair eth0 eth0 Network Namespace: default Network Namespace: ns1 Network Namespace: ns2 10.0.0.1 10.0.0.2 host-vpp1 host-vpp2
  • 16. L3設定例 16 vpp# create loopback interface loop0 vpp# set interface l2 bridge loop0 1 bvi vpp# set interface state loop0 up vpp# set interface ip address loop0 10.0.0.254/24 vpp# create host-interface name vpp3 host-vpp3 vpp# set interface state host-vpp3 up vpp# set interface ip address host-vpp3 10.0.1.254/24  Bridge Domain 1 に BVI インターフェイスを設定  VPPにvethを認識させ、L3ポートとして設定 VPP Router L3ポートL2ポート Bridge Domain 1 C1 C2 C3 veth pair veth pair veth pair eth0 eth0 eth0 Network Namespace: default Network Namespace: ns1 Network Namespace: ns2 Network Namespace: ns3 10.0.0.254 10.0.1.254 10.0.0.1 10.0.0.2 10.0.1.1 host-vpp1 host-vpp2 host-vpp3 loop0(bvi)
  • 17. 落穂拾い 17 unix { ... startup-config /home/userid/setup.cfg ... }  起動時に(仮想スイッチ&ルータとしての)VPPの設定を読み込ませるに は、/etc/vpp/startup.confのunix句で設定ファイルを指定
  • 18. 落穂拾い(cont.) 18 vpp# show trace ------------------- Start of thread 0 vpp_main ------------------- Packet 1 00:13:25:316687: af-packet-input af_packet: hw_if_index 1 next-index 1 tpacket2_hdr: status 0x1 len 98 snaplen 98 mac 66 net 80 sec 0x5890503a nsec 0x22819a55 vlan 0 00:13:25:316712: ethernet-input IP4: 06:28:d8:1d:3c:f2 -> 4a:74:64:4d:bd:0a 00:13:25:316721: l2-input l2-input: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 00:13:25:316725: l2-learn l2-learn: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 bd_index 1 00:13:25:316728: l2-fwd l2-fwd: sw_if_index 1 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 bd_index 1 00:13:25:316730: l2-output l2-output: sw_if_index 2 dst 4a:74:64:4d:bd:0a src 06:28:d8:1d:3c:f2 00:13:25:316733: host-vpp2-output host-vpp2 IP4: 06:28:d8:1d:3c:f2 -> 4a:74:64:4d:bd:0a ICMP: 10.0.0.1 -> 10.0.0.2 tos 0x00, ttl 64, length 84, checksum 0x476a fragment id 0xdf3c, flags DONT_FRAGMENT ICMP echo_request checksum 0xebee  /etc/vpp/startup.confのapi-trace をonに編集 api-trace { on } vpp# trace add af-packet-input 10  traceを有効化 vpp# clear trace  trace結果をクリア  trace結果の確認