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.

FD.io VPP事始め

720 views

Published on

FD.io / VPP ユーザ有志の会 #1
https://vppug.connpass.com/event/128630/

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

FD.io VPP事始め

  1. 1. FD.io VPP 事始め Tetsuhiro Sato
  2. 2. FD.io  FD.io  Fast Data – Input/Output に関 連する複数のプロジェクトを運営する Apache Foundation傘下のプロ ジェクト  VPPの他に、VPPの管理、VPPを用 いたユースケース、Testing等のプロ ジェクトも管理 2 https://wiki.fd.io/view/VPP/Features
  3. 3. FD.io VPP  VPP  FD.ioの中核プロジェクト  高性能かつ高機能な仮想スイッチ&ルータ  DPDKを活用し、ユーザー空間のアプリケー ションとして動作 3
  4. 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
  5. 5. 豊富な機能 5 ! とりあえず、いろんな機能をサポート https://wiki.fd.io/view/VPP/Features
  6. 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. コマンドライン接続 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. コマンドライン接続 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. 9. 接続方法  外部に接続するVPPインターフェイスの種類 9 接続方法 ユースケース(たぶん) DPDK PDM(w/ Intel NIC, VMXNET3) ホストマシンのインターフェイスの利用 Vhost-user VMとの接続 veth コンテナとの接続 tap コンテナとの接続 ホストマシンのLinuxサービス(DHCP等)を利用
  10. 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. 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. 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. 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. 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. 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. 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. 落穂拾い 17 unix { ... startup-config /home/userid/setup.cfg ... }  起動時に(仮想スイッチ&ルータとしての)VPPの設定を読み込ませるに は、/etc/vpp/startup.confのunix句で設定ファイルを指定
  18. 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結果の確認
  19. 19. おわり ご清聴、ありがとうございました m(_ _)m 19

×