Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OVS-DPDKとOpenStackで作るおうちNFV環境の構築

 OVS-DPDKとOpenStackで作るおうちNFV環境の構築

Kernel/VM探検隊 online part2

Hiroshi Tsuji

March 20, 2021
Tweet

More Decks by Hiroshi Tsuji

Other Decks in Technology

Transcript

  1. 自己紹介 ▪▪な通信会社で NFV 関係のアーキテクト的ななにかをやってます。 辻 広志(@tj8000rpm : Twitter / Qiita /

    Github) OSSでの仮想化もイイよ!を伝えたい • 自宅ラックな方々の選択肢にVMwareが多い(ように見えた) ネットワーク仮想化、高速化のノウハウを広めたい(ネットワーク仮想化の片鱗を触れていただきたい) • Kernel/VM/探検隊online part1のご発表「俺の仮想マシンルーターがこんなに遅いはず はない」のウケがよかった(ように見えた) 本日のモチベーション
  2. 背景:DPDKとは Application Kernel NIC Driver NW含むIO DPDKがないとき Application Kernel NIC

    Driver NW以外のIO DPDKがあるとき NWのIO CPUコア NIC CPUコア NIC CPUコア NIC CPUは常にアクセル全開 CPUとNICを紐づけて パケット処理だけをやらせる • 最近のCPUはたくさんコアがある • 特殊なハードウェア買うよりCPUのコアをいくつか使うほうが安いし柔軟性が高い DPDKの思想
  3. おうちNFV環境の用意:物理の用意(DPDK対応NICの補足) https://core.dpdk.org/supported/ 残念ながらカニさんはDPDK非対応 ❚ Intel NICだと間違いがないです • 700 シリーズ •

    500 シリーズ • I350/ • I225 • I210 • 8257x • など等 https://www.intel.co.jp/content/www/jp/ja/support/articles/000005480/networ k-and-i-o/ethernet-products.html • Aquantia • Broadcom • Marvell • Mellanox もちろんIntel以外も 10G 以上 / 高価 1G~2.5G 安価で入手性もGood <オススメ>
  4. ハイパースレッディングを使用している場合は 実コアも意識する • デザインを決め、ハイパーバイザが他のCPUを利用しないように隔離します L3 L2 L1 Core #6 Core

    #0 L2 L1 Core #7 Core #1 L2 L1 Core #8 Core #2 L3 L2 L1 Core #9 Core #3 L2 L1 Core #10 Core #4 L2 L1 Core #11 Core #5 HVの個人的な仕事用 OVS-DPDK用 物理用x2 +ゲスト用 x 2 ゲスト用(CPU占有) 性能を最大限に引き出したい VMに ゲスト用(CPU非占有) 収容効率重視のVMや エミュレータスレッド用に おうちNFV環境の用意:プランニング ❚ ハイパーバイザのCPU割り当てを検討します isolcpus=1-5,7-11 nohz_full=1-5,7-11 rcu_nocbs=1-5,7-11 CPUのバランスは実行するワークロード等によって調整します
  5. おうちNFV環境の用意: インストール ❚ 最近のOS使うのが安心です(今回はUbuntu 20.04) sudo apt-get install openvswitch-switch-dpdk sudo

    update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true" ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x1" ovs-vsctl set Open_vSwitch . "other_config:dpdk-alloc-mem=2048" sudo service openvswitch-switch restart ❚ ドキュメントに従ってOVS-DPDKとOpenStackをデプロイします https://docs.openstack.org/ja/install-guide/index.html https://docs.openstack.org/neutron/latest/admin/config-ovs-dpdk.html amd_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=24 DPDKを使うのでHugepageとIOMMUの設定を有効化しておきます
  6. おうちNFV環境の用意:設定(NFV的なポイントを抜粋) ❚ 設計したCPU割り当てをもとにOpen vSwitch への反映 ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x41"

    # 0000 0100 0001 ovs-vsctl set Open_vSwitch . "other_config:pmd-cpu-mask="0x186" # 0001 1000 0110 ovs-vsctl add-port br-provider enp12s0f0 -- set Interface enp12s0f0\ type=dpdk option:dpdk-devargs=0000:0c:00.0 ovs-vsctl set Interface enp12s0f0 options:n_rxq=2 ❚ OpenStack への反映(CPU pining / OVS-DPDK 関連部所だけ抜粋) [DEFAULT] reserved_huge_pages=node:0,size:1GB,count:10 [compute] cpu_shared_set = 5,11 # このあたりが cpu_dedicated_set = 3-4,9-10 # 比較的新しいポイント [libvirt] virt_type = kvm rx_queue_size = 1024 tx_queue_size = 1024 [ml2] mechanism_drivers = openvswitch [ml2_type_vlan] network_vlan_ranges = provider:1000:4000 [ovs] bridge_mappings = provider:br-provider datapath_type = netdev # DPDKを使う宣言 vhostuser_socket_dir = /var/lib/neutron/vhu /etc/nova/nova.conf /etc/neutron/plugins/ml2/ml2.ini /etc/neutron/plugins/openvswitch_agent.ini
  7. Core #5 Core #1 Core #2 Core #3 Core #4

    Core #6 share isolate 無指定 おうちNFV環境の用意:VMの作成 ❚ VMで使用するFlavorにのみNFV向けの設定が必要 ❚ エミュレータスレッドとは? 設定値 用途 hw:cpu_policy dedicated CPUピンニングする hw:mem_page_size large メモリにHugepageを使う hw:emulator_threads_policy share エミュレータスレッドを分離し、 shared set に割り当てる VM #1 Emulator #1 VM #1 Emulator #1 VM #2 Emulator #2 VM #2 Emulator #2 VM #1 Emulator #2 VM #2 Emulator #1 ハードウェアエミュレーションを行うプロセス。 無指定時はVMに割り当てたCPU時間を奪う可能性があり、対策として isolateがあるが無駄が大きかった
  8. おうちNFV環境の用意:VMの作成 ❚ ネットワーク作成、サブネット作成等は一般的な手順で可能 openstack network create --provider-segment 2021 --provider-network-type vlan

    \ --provider-physical-network provider vl2021 openstack subnet create --network vl2021 vl2021-subnet ❚ フレーバを指定して普通にVM起動 openstack server create --flavor <つくったやつ> --image <登録したやつ>\ --network vl2021 VM名 構築完了 (NFVっぽい仮想化基盤上にVMが立ちました!)
  9. おうちNFV環境の検証 実際にどれぐらいの性能がでるのか、 ネットワーク転送性能を評価してみます Guest VM: 4 vcpu 4GB / Ubuntu

    20.04 一般家庭がゆえ、検証マシンが1台しか用意できなかったため 先ほどの説明には登場しないSR-IOVも一部検証の中では利用しています
  10. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 vhua11 vhuef2 おうちNFV環境の検証:物理構成 赤線を必ず通るようにして検証
  11. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 おうちNFV環境の検証:論理構成 Vlan 2021 - Management Network Vlan 2020 - Network under test テストケース1 テストケース2 テストケース3 テストケース4
  12. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 おうちNFV環境の検証:テストケース1(iperf - TCP / OVS -> SR-IOV) ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- Accepted connection from 172.16.0.146, port 54649 [ 5] local 172.16.0.254 port 5201 connected to 172.16.0.146 port 58967 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.00 sec 1.09 GBytes 9.38 Gbits/sec [ 5] 1.00-2.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 2.00-3.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 3.00-4.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 4.00-5.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 5.00-6.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 6.00-7.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 7.00-8.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 8.00-9.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 9.00-10.00 sec 1.09 GBytes 9.39 Gbits/sec [ 5] 10.00-10.00 sec 2.64 MBytes 9.26 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate [ 5] 0.00-10.00 sec 10.9 GBytes 9.39 Gbits/sec receiver ❚ 余裕しゃくしゃくで10Gbps達成
  13. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 おうちNFV環境の検証:テストケース2(iperf - UDP 64B / OVS->SR-IOV) ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- Accepted connection from 172.16.0.146, port 37349 [ 5] local 172.16.0.254 port 5201 connected to 172.16.0.146 port 57389 [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-1.00 sec 20.1 MBytes 169 Mbits/sec 0.001 ms 1025/587900 (0.17%) [ 5] 1.00-2.00 sec 20.0 MBytes 168 Mbits/sec 0.001 ms 0/582221 (0%) [ 5] 2.00-3.00 sec 20.0 MBytes 168 Mbits/sec 0.001 ms 9/582113 (0.0015%) [ 5] 3.00-4.00 sec 20.0 MBytes 168 Mbits/sec 0.001 ms 12/582746 (0.0021%) [ 5] 4.00-5.00 sec 20.0 MBytes 167 Mbits/sec 0.001 ms 0/581418 (0%) [ 5] 5.00-6.00 sec 20.4 MBytes 171 Mbits/sec 0.002 ms 113/595146 (0.019%) [ 5] 6.00-7.00 sec 20.6 MBytes 173 Mbits/sec 0.003 ms 214/600359 (0.036%) [ 5] 7.00-8.00 sec 20.6 MBytes 173 Mbits/sec 0.002 ms 1/599974 (0.00017%) [ 5] 8.00-9.00 sec 20.5 MBytes 172 Mbits/sec 0.001 ms 1470/598773 (0.25%) [ 5] 9.00-10.00 sec 20.6 MBytes 173 Mbits/sec 0.005 ms 9/599245 (0.0015%) [ 5] 10.00-10.00 sec 57.7 KBytes 170 Mbits/sec 0.003 ms 0/1640 (0%) - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams [ 5] 0.00-10.00 sec 203 MBytes 170 Mbits/sec 0.003 ms 2853/5911535 (0.048%) receiver ❚ 転送力、たったの 170Mbps = 330K pps、パケロスも 遅い? ➡ No!これはiperfを使うからです
  14. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 おうちNFV環境の検証:テストケース3(iperf - 64B / OVS -> SR-IOV) | Ports 0-1 of 2 <Main Page> Copyright (c) <2010-2019>, Intel Corporation Flags:Port : -------Single :0 -------Single :1 Link State : <UP-10000-FD> <UP-40000-FD> ---Total Rate--- Pkts/s Max/Rx : 64/0 7033482/0 7033546/0 Max/Tx : 7033504/0 64/0 7033568/0 MBits/s Rx/Tx : 0/0 0/0 0/0 Broadcast : 0 0 Multicast : 0 0 Runts/Jumbos : 0/0 0/0 ARP/ICMP Pkts : 0/0 0/0 Errors Rx/Tx : 0/0 0/0 Total Rx Pkts : 1728 209793952 Tx Pkts : 209793952 1728 Rx MBs : 1 154408 Tx MBs : 140981 1 Pkt Size/Tx Burst : 64 / 64 64 / 64 Pkt Type:VLAN ID : IPv4 / TCP:0001 IPv4 / TCP:0001 IP Destination : 192.168.1.1 192.168.0.1 Source : 192.168.0.1/24 192.168.1.1/24 ❚ OVS-DPDK -> SR-IOV 送受信ともに 7.03Mpps (3.6Gbps/64B Frame) パケロス 0
  15. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 おうちNFV環境の検証:テストケース4(iperf - 64B / SR-IOV -> OVS) | Ports 0-1 of 2 <Main Page> Copyright (c) <2010-2019>, Intel Corporation Flags:Port : -------Single :0 -------Single :1 Link State : <UP-10000-FD> <UP-40000-FD> ---Total Rate--- Pkts/s Max/Rx : 6990777/0 64/0 6990777/0 Max/Tx : 64/0 14204638/0 14204702/0 MBits/s Rx/Tx : 0/0 0/0 0/0 Broadcast : 0 0 Multicast : 0 0 Runts/Jumbos : 0/0 0/0 ARP/ICMP Pkts : 0/0 0/0 Errors Rx/Tx : 0/0 0/0 Total Rx Pkts : 69142886 128 Tx Pkts : 128 142107679 Rx MBs : 46464 0 Tx MBs : 0 100043 Pkt Size/Tx Burst : 64 / 64 64 / 64 Pkt Type:VLAN ID : IPv4 / TCP:0001 IPv4 / TCP:0001 IP Destination : 192.168.1.1 192.168.0.1 Source : 192.168.0.1/24 192.168.1.1/24 ❚ SR-IOV -> OVS-DPDK 送信側ではロスが無いが、受信側でパケロス それでも iperf の 21倍 送信PPS 14.2Mpps(7.3Gbps) / 受信PPS 6.99Mpps (3.6Gbps)
  16. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 パケロスはどこで起こっているのか?(送信レートを5.3Mppsに下げて実施) 試験前Drop 19,275,255 試験後Drop 19,798,480 ドロップ数増 523,225 TX count 159,969,728 RX count 156,251,122 ドロップ数 3,718,606 3,195,381 + 523,225 = 3,718,606 Flags:Port : -------Single :0 -------Single :1 Link State : <UP-10000-FD> <UP-40000-FD> Pkts/s Max/Rx : 5251040/0 64/0 Max/Tx : 64/0 5349376/0 MBits/s Rx/Tx : 0/0 0/0 Broadcast : 0 0 Multicast : 0 0 Runts/Jumbos : 0/0 0/0 ARP/ICMP Pkts : 0/0 0/0 Errors Rx/Tx : 0/0 0/0 Total Rx Pkts : 156251122 384 Tx Pkts : 384 159969728 Rx MBs : 105000 0 Tx MBs : 0 112618 Tx Count/% Rate : Forever /0.0001% Forever /9% Pkt Size/Tx Burst : 64 / 64 64 / 64 Pkt Type:VLAN ID : IPv4 / TCP:0001 IPv4 / TCP:0001 IP Destination : 192.168.1.1 192.168.0.1 Source : 192.168.0.1/24 192.168.1.1/24 試験前Drop 3,441,863,716 試験後Drop 3,445,059,097 ドロップ数増 3,195,381
  17. Host machine (Ryzen 5 3600 6C/12T, 32GB DDR4 32 GB)

    / Ubuntu 20.04 LTS VM/net-bench(4vCPU/4GB RAM) / Ubuntu 20.04 LTS Intel X710 enp12s0f1 Intel X710 enp12s0f0 OVS-Bridge (br-int) OVS-Bridge (br-provider) vhua11 vhuef2 enp12s0f1v0 enp12s0f1v3 valn2020 valn2021 パケロスはどこで起こっているのか?(送信レートを5.3Mppsに下げて実施) 試験前Drop 19,275,255 試験後Drop 19,798,480 ドロップ数 523,225 TX count 159,969,728 RX count 156,251,122 ドロップ数 3,718,606 3,195,381 + 523,225 = 3,718,606 Flags:Port : -------Single :0 -------Single :1 Link State : <UP-10000-FD> <UP-40000-FD> Pkts/s Max/Rx : 5251040/0 64/0 Max/Tx : 64/0 5349376/0 MBits/s Rx/Tx : 0/0 0/0 Broadcast : 0 0 Multicast : 0 0 Runts/Jumbos : 0/0 0/0 ARP/ICMP Pkts : 0/0 0/0 Errors Rx/Tx : 0/0 0/0 Total Rx Pkts : 156251122 384 Tx Pkts : 384 159969728 Rx MBs : 105000 0 Tx MBs : 0 112618 Tx Count/% Rate : Forever /0.0001% Forever /9% Pkt Size/Tx Burst : 64 / 64 64 / 64 Pkt Type:VLAN ID : IPv4 / TCP:0001 IPv4 / TCP:0001 IP Destination : 192.168.1.1 192.168.0.1 Source : 192.168.0.1/24 192.168.1.1/24 試験前Drop 3,441,863,716 試験後Drop 3,445,059,097 ドロップ数 3,195,381 今回パケロスの原因特定まで 達成できず・・・無念
  18. 検証ハードウェア 品番 価格 CPU Ryzen 5 3600 BOX ¥25,000 Memory

    F4-3200C16D-32GSXWB ¥15,000 MB X470 GAMING PLUS MAX ¥15,000 SSD SSD 660p SSDPEKNW010T8X1 ¥11,000 Case MasterBox Q500L MCB-Q500L-KANN-S00 ¥6,500 PDU Toughpower Grand RGB 850W Gold PS-TPG-0850FPCGJP-R [Black] ¥11,000 NIC Intel X710-BM2 ¥29,000 SFP Intel E10GSFPSRX互換 10GBASE-SR SFP+ x 4 ¥8,240 Patch Code 0.5m LC-LC光パッチケーブル(OM4) ¥422 合計(約) ¥121,162
  19. 参考リンク ❚ OVS-DPDK Support / OVSのDPDKに関する技術情報一覧 https://docs.openvswitch.org/en/latest/topics/dpdk/ ❚ Red Hat

    OpenStack Platform16.1 > > ネットワーク機能仮想化 (NFV) のプランニングおよび設定ガイド https://access.redhat.com/documentation/ja-jp/red_hat_openstack_platform/16.1/html/network_f unctions_virtualization_planning_and_configuration_guide/index ❚ Troubleshooting packet drop with NFV DPDK https://www.redhat.com/en/blog/troubleshooting-packet-drop-nfv-dpdk ❚ OVS-DPDK life of a packet https://www.openvswitch.org/support/ovscon2019/day1/1054-OVS-DPDK%20life%20of%20a%20p acket.pdf
  20. Open vSwitch • 初版? 2009年7月28日(0.90.4) • 最新版 2021年2月15日(2.15.0) • Apache

    2 Lincense • 商用品質 • マルチレイヤーソフトウェアスイッチ • https://github.com/openvswitch/ovs • http://www.openvswitch.org/
  21. 最近でもOpen vSwitchは結構色んな所で使われてます • OVN OVSを束ねて使うためのソリューション K8sのCNI Plugin(ovn-kubernets)としてや、 OpenStackのNeutron ML2 Driver(networking-ovn)などで利用

    https://onic.jp/_cms/wp-content/uploads/2019/11/ONIC2019_Manabu-Ori.pdf • Antrea OVSを使用したK8s CNI Plugin、VMwareさんが中心となって開発 https://www.slideshare.net/motonorishindo/cni-antrea
  22. DPDK(Data Plane Development Kit) • https://www.dpdk.org/ • 初版 2010年 •

    最新版 2021年2月14日(21.02) • BSD3 Lincense • パケット高速化を主な目的とした ドライバとソフトウェアライブラリ • ネットワーク処理の敵はContext Switchingと割込み カーネルをすっ飛ばして全部ユーザ空間でやっちゃうという発想
  23. OVS-DPDK • OVSのDPDK実装版 • 商用品質 • ソコソコ早い • ソコソコ使われてる NFV(Network

    Function Virtualization)の文脈においてはSR-IOVと並 んでよく使われ語られています
  24. SR-IOV • Single Root - Input / Output Virtualization 4:

    enp12s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 64:9d:99:b1:49:cd brd ff:ff:ff:ff:ff:ff vf 0 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off vf 1 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off vf 2 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off vf 3 link/ether fa:16:3e:49:6e:36 brd ff:ff:ff:ff:ff:ff, vlan 2020, spoof checking on, link-state enable, trust off $ ethtool -i enp12s0f1 | grep driver driver: i40e • ハードウェア技術 • 1つのNICを分割する技術(超ざっくり) • 分割したNICのことを VF(Virtual Function) という $ ethtool -i enp12s0f1v0 | grep driver driver: iavf 0c:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02) 0d:0a.0 Ethernet controller: Intel Corporation Ethernet Virtual Function 700 Series (rev 02)