O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

FD.io VPP事始め

773 visualizações

Publicada em

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

Publicada em: Engenharia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

×