FD.io/VPP(以下、VPP)のセットアップと自動起動設定までの構築方法について、以下4つのパターンで記載していきます。
- Bare Metal
- Linux Bridge
- OvS-DPDK
- SR-IOV
1.構成
1-1.環境
筐体 : DL360 Gen9 CPU : Intel(R) Xeon E5-4667 v4 CPU @ 2.20GHz System ROM : P89 05/21/2018 NIC : Intel 82599ES OS : CentOS7.6(1810) Kernel : 3.10.0-957.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools ovs : 2.13.0 DPDK : 19.11.2
2.事前準備とインストール
yum -y install epel-release dpdk-tools curl -s https://packagecloud.io/install/repositories/fdio/release/script.rpm.sh | sudo bash yum -y install vpp vpp-plugins vpp-devel vpp-api-python vpp-api-lua vpp-debuginfo vpp-devel
必要なパッケージのインストール
リポジトリ設定
VPPのインストール
3.初期設定
3-1.インターフェースのbsf確認
VPPにアサインするインターフェースのbfs(Bus,Slot,Function)番号とインターフェース名を確認します。
赤文字で記載した「05:00.x」の部分が「bus:slot.function」になります。*1
[root@c76g116 ~]# dpdk-devbind -s Network devices using kernel driver =================================== 0000:02:00.0 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno1 drv=tg3 unused=vfio-pci *Active* 0000:02:00.1 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno2 drv=tg3 unused=vfio-pci 0000:02:00.2 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno3 drv=tg3 unused=vfio-pci 0000:02:00.3 'NetXtreme BCM5719 Gigabit Ethernet PCIe 1657' if=eno4 drv=tg3 unused=vfio-pci 0000:05:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=ens2f0 drv=ixgbe unused=vfio-pci 0000:05:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=ens2f1 drv=ixgbe unused=vfio-pci
以下のコマンドでも確認可能ですので、どちらでも構いません。
[root@c76g116 ~]# lshw -businfo -c network Bus info Device Class Description ======================================================== pci@0000:05:00.0 ens2f0 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:05:00.1 ens2f1 network 82599ES 10-Gigabit SFI/SFP+ Network Connection pci@0000:02:00.0 eno1 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:02:00.1 eno2 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:02:00.2 eno3 network NetXtreme BCM5719 Gigabit Ethernet PCIe pci@0000:02:00.3 eno4 network NetXtreme BCM5719 Gigabit Ethernet PCIe
3-2.OS起動時の設定
OS起動時にvfio-pciの読込みとインターフェースダウンを実施しますので、以下の通り設定を最下行に追記してください。
設定完了後、実行権限を付与します。
vi /etc/rc.local [root@c76g116 ~]# vi /etc/rc.local modprobe vfio-pci ifconfig ens2f0 down ifconfig ens2f1 down exit 0 [root@c76g116 ~]# chmod 755 /etc/rc.local
3-3.VPPのstartup.conf設定
VPPのstartup.confに設定を追記します。
青文字箇所を追記してください。*2
緑文字箇所はコメントアウトしてください。
vi /etc/vpp/startup.conf [root@c76g116 ~]# vi /etc/vpp/startup.conf unix { nodaemon log /var/log/vpp/vpp.log full-coredump cli-listen /run/vpp/cli.sock gid vpp startup-config /root/vpp.cfg } dpdk { dev default { num-rx-desc 512 num-tx-desc 512 } no-multi-seg dev 0000:05:00.0 { name ens2f0 num-rx-queues 2 num-tx-queues 2 } dev 0000:05:00.1 { name ens2f1 num-rx-queues 2 num-tx-queues 2 } } cpu { ## Set logical CPU core where main thread runs, if main core is not set ## VPP will use core 1 if available main-core 1 ## Set logical CPU core(s) where worker threads are running # corelist-workers 2-3,18-19 corelist-workers 2-3 }
上記の設定はVPPサービス起動時にインターフェースをアタッチする設定やvpp.cfgファイルの参照先パスの設定となります。*3
3-4.VPPのvpp.cfg設定
vpp.cfgファイルはCiscoで言うところのstartup-configファイルに相当します。
これを設定しておかないと、起動するたびにIPアドレスの設定などを都度実施することになりますので、最低限の設定を投入します。
vi /root/vpp.cfg [root@c76g116 ~]# vi /root/vpp.cfg set int ip address ens2f0 192.168.30.116/24 set int ip address ens2f1 192.168.31.116/24 set int state ens2f0 up set int state ens2f1 up
IPの設定、最後にインターフェースアップ設定を入れておきます。*4
4.動作確認
4-1.インターフェース周りの確認
以下のコマンドでVPPコンソールに入ります。
vppctl
出力例
[root@c76g116 ~]# vppctl _______ _ _ _____ ___ __/ __/ _ \ (_)__ | | / / _ \/ _ \ _/ _// // / / / _ \ | |/ / ___/ ___/ /_/ /____(_)_/\___/ |___/_/ /_/ vpp#
VPPコンソールに入ったら、以下4つのコマンドでステータスを確認します。
show pci show hardware-interfaces show interface show interface addr show threads
出力例
確認するポイントを赤文字で記載します。
vpp# show pci Address Sock VID:PID Link Speed Driver Product Name Vital Product Data 0000:02:00.0 0 14e4:1657 5.0 GT/s x2 tg3 HPE Ethernet 1Gb 4-port 331i Ada PN: N/A EC: A-5427 SN: N/A MN: 103C V0: 0x 35 57 20 50 43 49 65 47 ... V1: 0x 32 30 2e 31 32 2e 32 V2: 0x 4e 2f 41 V3: 0x 31 2e 34 36 V5: 0x 30 41 V6: 0x 32 30 2e 36 2e 35 30 V7: 0x 33 33 31 69 VA: 0x 32 30 2e 31 32 2e 34 31 RV: 0x a1 00 00 00 00 00 00 00 ... 0000:02:00.1 0 14e4:1657 5.0 GT/s x2 tg3 HPE Ethernet 1Gb 4-port 331i Ada PN: N/A 各インターフェースごとにPCI情報が表示されますが省略します。 0000:02:00.2 0 14e4:1657 5.0 GT/s x2 tg3 HPE Ethernet 1Gb 4-port 331i Ada PN: N/A 0000:02:00.3 0 14e4:1657 5.0 GT/s x2 tg3 HPE Ethernet 1Gb 4-port 331i Ada PN: N/A 0000:05:00.0 0 8086:10fb 5.0 GT/s x8 vfio-pci 0000:05:00.1 0 8086:10fb 5.0 GT/s x8 vfio-pci vpp# show hardware-interfaces Name Idx Link Hardware ens2f0 1 up ens2f0 Link speed: 10 Gbps Ethernet address 00:1b:21:8e:84:c8 Intel 82599 carrier up full duplex mtu 9206 flags: admin-up pmd tx-offload intel-phdr-cksum rx-ip4-cksum Devargs: rx: queues 2 (max 128), desc 512 (min 32 max 4096 align 8) tx: queues 2 (max 64), desc 512 (min 32 max 4096 align 8) pci: device 8086:10fb subsystem 108e:7b11 address 0000:05:00.00 numa 0 max rx packet len: 15872 promiscuous: unicast off all-multicast on vlan offload: strip off filter off qinq off rx offload avail: vlan-strip ipv4-cksum udp-cksum tcp-cksum tcp-lro macsec-strip vlan-filter vlan-extend jumbo-frame scatter security keep-crc rss-hash rx offload active: ipv4-cksum tx offload avail: vlan-insert ipv4-cksum udp-cksum tcp-cksum sctp-cksum tcp-tso macsec-insert multi-segs security tx offload active: udp-cksum tcp-cksum rss avail: ipv4-tcp ipv4-udp ipv4 ipv6-tcp-ex ipv6-udp-ex ipv6-tcp ipv6-udp ipv6-ex ipv6 rss active: ipv4-tcp ipv4-udp ipv4 ipv6-tcp-ex ipv6-udp-ex ipv6-tcp ipv6-udp ipv6-ex ipv6 tx burst function: ixgbe_xmit_pkts rx burst function: ixgbe_recv_pkts_vec ens2f1 2 up ens2f1 Link speed: 10 Gbps Ethernet address 00:1b:21:8e:84:c9 Intel 82599 carrier up full duplex mtu 9206 flags: admin-up pmd tx-offload intel-phdr-cksum rx-ip4-cksum Devargs: rx: queues 2 (max 128), desc 512 (min 32 max 4096 align 8) tx: queues 2 (max 64), desc 512 (min 32 max 4096 align 8) pci: device 8086:10fb subsystem 108e:7b11 address 0000:05:00.01 numa 0 max rx packet len: 15872 promiscuous: unicast off all-multicast on vlan offload: strip off filter off qinq off rx offload avail: vlan-strip ipv4-cksum udp-cksum tcp-cksum tcp-lro macsec-strip vlan-filter vlan-extend jumbo-frame scatter security keep-crc rss-hash rx offload active: ipv4-cksum tx offload avail: vlan-insert ipv4-cksum udp-cksum tcp-cksum sctp-cksum tcp-tso macsec-insert multi-segs security tx offload active: udp-cksum tcp-cksum rss avail: ipv4-tcp ipv4-udp ipv4 ipv6-tcp-ex ipv6-udp-ex ipv6-tcp ipv6-udp ipv6-ex ipv6 rss active: ipv4-tcp ipv4-udp ipv4 ipv6-tcp-ex ipv6-udp-ex ipv6-tcp ipv6-udp ipv6-ex ipv6 tx burst function: ixgbe_xmit_pkts rx burst function: ixgbe_recv_pkts_vec extended stats: mac remote errors 1 local0 0 down local0 Link speed: unknown local vpp# show interface Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count ens2f0 1 up 9000/0/0/0 ens2f1 2 up 9000/0/0/0 local0 0 down 0/0/0/0 vpp# show interface addr ens2f0 (up): L3 192.168.30.116/24 ens2f1 (up): L3 192.168.31.116/24 local0 (dn): vpp# show threads ID Name Type LWP Sched Policy (Priority) lcore Core Socket State 0 vpp_main 24943 other (0) 1 2 0 1 vpp_wk_0 workers 24945 other (0) 2 4 0 2 vpp_wk_1 workers 24946 other (0) 3 9 0
4-2.疎通確認
自身のIPにPingが飛ばないため、対向機器にPingを飛ばすか、対向機器からPingを飛ばしてください。
vpp# ping 192.168.30.116 Statistics: 5 sent, 0 received, 100% packet loss 自身のIPにはPingが飛びません。 vpp# ping 192.168.30.254 116 bytes from 192.168.30.254: icmp_seq=1 ttl=64 time=.3834 ms 116 bytes from 192.168.30.254: icmp_seq=2 ttl=64 time=.3127 ms 116 bytes from 192.168.30.254: icmp_seq=3 ttl=64 time=.2928 ms 116 bytes from 192.168.30.254: icmp_seq=4 ttl=64 time=.3206 ms 116 bytes from 192.168.30.254: icmp_seq=5 ttl=64 time=.2619 ms Statistics: 5 sent, 5 received, 0% packet loss vpp#
ここまでOKであれば、Bare Metalとしての構築は完了です。
4-3.次項へ進む前の準備
本項からは仮想マシンc77g118を作成してVPPをインストールした後、Linux Bridge、OvS-DPDK、SR-IOVのそれぞれで外部NWと接続する際のポイントなどを記載していきます。
同一の物理マシン上で作業を続ける場合、以下のコマンドにより設定後、一旦rebootしてください。*5
systemctl disable vpp vi /etc/rc.local #modprobe vfio-pci #ifconfig ens2f0 down #ifconfig ens2f1 down reboot
VPPの自動起動停止
/etc/rc.localを元に戻す設定
5.Linux Bridgeの場合
Linux Bridgeの詳細については、以下の過去記事を参照してください。
Linux nmcliコマンドによるBonding VLAN Bridge Interface設定 - Metonymical Deflection
説明は省きますが、設定方法のみ記載します。
5-1.brインターフェース作成とアタッチ
本項はHostOS上での設定となります。
brインターフェースを作成します。
nmcli connection add type bridge autoconnect yes con-name br300 ifname br300 nmcli connection modify br300 bridge.stp no nmcli connection modify br300 ipv4.method disabled ipv6.method ignore nmcli connection up br300 nmcli connection add type bridge-slave ifname ens2f0 master br300 nmcli con show brctl show nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method disabled ipv6.method ignore nmcli connection up br301 nmcli connection add type bridge-slave ifname ens2f1 master br301 nmcli con show brctl show
仮想マシンにbrインターフェースをアタッチします。
5-3.インターフェースのbsf確認
設定方法は同一なので、ポイントだけ記載します。
[root@c77g118 ~]# dpdk-devbind -s Network devices using kernel driver =================================== 0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci *Active* 0000:00:09.0 'Virtio network device 1000' if=eth1 drv=virtio-pci unused=virtio_pci 0000:00:0a.0 'Virtio network device 1000' if=eth2 drv=virtio-pci unused=virtio_pci
5-4.OS起動時の設定
vi /etc/rc.local [root@c77g118 ~]# vi /etc/rc.local modprobe vfio-pci ifconfig eth1 down ifconfig eth2 down exit 0 [root@c77g118 ~]# chmod 755 /etc/rc.local
5-5.VPPのstartup.conf設定
vi /etc/vpp/startup.conf [root@c77g118 ~]# vi /etc/vpp/startup.conf unix { nodaemon log /var/log/vpp/vpp.log full-coredump cli-listen /run/vpp/cli.sock gid vpp startup-config /root/vpp.cfg } dpdk { dev default { num-rx-desc 512 num-tx-desc 512 } no-multi-seg dev 0000:00:09.0 { name eth1 num-rx-queues 2 num-tx-queues 2 } dev 0000:00:0a.0 { name eth2 num-rx-queues 2 num-tx-queues 2 } } cpu { ## Set logical CPU core where main thread runs, if main core is not set ## VPP will use core 1 if available main-core 1 ## Set logical CPU core(s) where worker threads are running # corelist-workers 2-3,18-19 corelist-workers 2-3 }
5-6.VPPのvpp.cfg設定
vi /root/vpp.cfg [root@c77g118 ~]# vi /root/vpp.cfg set int ip address eth1 192.168.30.118/24 set int ip address eth2 192.168.31.118/24 set int state eth1 up set int state eth2 up
5-7.VPPサービス自動起動設定と再起動
systemctl enable vpp reboot
6.OvS-DPDKの場合
OvS-DPDKの詳細については、以下の過去記事を参照してください。
CentOS7 ovs(Open vSwitch)+DPDKのビルドとネットワーク設定方法 - Metonymical Deflection
説明は省きますが、上記URLと異なっている箇所のみ記載します。
<補足>
HostOS上のOvSとDPDKは以下のVerにて設定しました。
ovs:v2.13.0
DPDK:v19.11.2
6-1.OvSインターフェース周りの設定
本項はHostOS上での設定となります。
♯DPDKにバインド dpdk-devbind.py --bind=vfio-pci ens2f0 dpdk-devbind.py --bind=vfio-pci ens2f1 ♯アップリンク(物理スイッチとの接続)の設定 ovs-vsctl add-port ovsbr0 dpdk300 \ vlan_mode=access tag=300 \ -- set Interface dpdk300 type=dpdk options:dpdk-devargs=0000:05:00.0 ovs-vsctl show ovs-vsctl add-port ovsbr0 dpdk301 \ vlan_mode=access tag=301 \ -- set Interface dpdk301 type=dpdk options:dpdk-devargs=0000:05:00.1 ovs-vsctl show ♯ダウンリンク(仮想マシンとの接続)の設定 mkdir -p /usr/local/openvswitch/ touch /usr/local/openvswitch/vhuc300 ovs-vsctl add-port ovsbr0 vhuc300 \ vlan_mode=access tag=300 \ -- set Interface vhuc300 type=dpdkvhostuserclient \ options:vhost-server-path=/usr/local/openvswitch/vhuc300 ovs-vsctl show mkdir -p /usr/local/openvswitch/ touch /usr/local/openvswitch/vhuc301 ovs-vsctl add-port ovsbr0 vhuc301 \ vlan_mode=access tag=301 \ -- set Interface vhuc301 type=dpdkvhostuserclient \ options:vhost-server-path=/usr/local/openvswitch/vhuc301 ovs-vsctl show
仮想マシンのxmlファイル設定
ダウンリンクと仮想マシンのインターフェースを接続する設定となります。
それ以外にもHugepageやCPU Pinning設定が含まれていますが、詳細は過去記事を参照してください。
[root@c76g116 ~]# virsh edit c76g118 <currentMemory unit='KiB'>8388608 </currentMemory> <memoryBacking> <hugepages> <page size='1048576' unit='KiB' nodeset='0'/> </hugepages> </memoryBacking> <vcpu placement='static'>4</vcpu> <cputune> <shares>8192</shares> <vcpupin vcpu='0' cpuset='10'/> <vcpupin vcpu='1' cpuset='11'/> <vcpupin vcpu='2' cpuset='12'/> <vcpupin vcpu='3' cpuset='13'/> <emulatorpin cpuset='10-13'/> </cputune> <cpu mode='host-model' check='partial'> <model fallback='allow'/> <numa> <cell id='0' cpus='0-3' memory='8388608' unit='KiB' memAccess='shared'/> </numa> </cpu> <interface type='vhostuser'> <source type='unix' path='/usr/local/openvswitch/vhuc300' mode='server'/> <model type='virtio'/> </interface> <interface type='vhostuser'> <source type='unix' path='/usr/local/openvswitch/vhuc301' mode='server'/> <model type='virtio'/> </interface> ※ 青=追記,緑=置換
6-3.インターフェースのbsf確認
設定方法は同一なので、ポイントだけ記載します。
[root@c77g118 ~]# dpdk-devbind -s Network devices using kernel driver =================================== 0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci *Active* 0000:00:09.0 'Virtio network device 1000' if=eth1 drv=virtio-pci unused=virtio_pci 0000:00:0a.0 'Virtio network device 1000' if=eth2 drv=virtio-pci unused=virtio_pci
Linux Bridgeの場合と比較して、全く変化がないことを確認してください。
bsf番号(00:09.0など)やインターフェース名が変わっているようであれば、この後の項においても同様に変更してください。
特にbsf番号が変わる場合があるため、注視してください。
6-4.OS起動時の設定
「5-4.OS起動時の設定」と同一です。
6-5.VPPのstartup.conf設定
「5-5.VPPのstartup.conf設定」と同一です。
6-6.VPPのvpp.cfg設定
「5-6.VPPのvpp.cfg設定」と同一です。
7.SR-IOVの場合
SR-IOVの詳細については、以下の過去記事を参照してください。
CentOS7でSR-IOV設定 - Metonymical Deflection
CentOS8 小ネタ集その4:SR-IOVの設定 - Metonymical Deflection
説明は省きますが、設定方法のみ記載します。
上記に加え、以下の設定でMTUを1501以上にしてください。*6
vi /etc/udev/rules.d/50-eth.rules ACTION=="add", SUBSYSTEM=="net", KERNEL=="ens2f0", RUN+="/sbin/ip link set ens2f0 mtu 9000" ACTION=="add", SUBSYSTEM=="net", KERNEL=="ens2f1", RUN+="/sbin/ip link set ens2f1 mtu 9000"
7-1.SR-IOV VFへのアタッチ
本項はHostOS上での設定となります。
仮想マシンのインターフェースとして、SR-IOV VFをアタッチします。
7-3.インターフェースのbsf確認
設定方法は同一なので、ポイントだけ記載します。
[root@c77g118 ~]# dpdk-devbind -s Network devices using kernel driver =================================== 0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,vfio-pci *Active* 0000:00:09.0 '82599 Ethernet Controller Virtual Function 10ed' if=eth1 drv=ixgbevf unused=vfio-pci 0000:00:0a.0 '82599 Ethernet Controller Virtual Function 10ed' if=eth2 drv=ixgbevf unused=vfio-pci
7-4.OS起動時の設定
「5-4.OS起動時の設定」と同一です。
7-5.VPPのstartup.conf設定
「5-5.VPPのstartup.conf設定」と同一です。
7-6.VPPのvpp.cfg設定
「5-6.VPPのvpp.cfg設定」と同一です。
8.最後に
参考サイトは前回記事と同様です。
KVM | VMWare ESXi6.7 | VMWare Work pro15 |
Bare Metal | N/A | N/A |
Linux Bridge | vSwitch(未成功) | LANセグメント |
OvS-DPDK | ? | N/A |
SR-IOV | SR-IOV(未成功) | N/A |
上記より、ESXiの仮想スイッチ上でDPDKを動作させる方法が少し気になっています。
以下URLに記載の通り、nmlx5-core-PMDとして対応しているように見受けられるのですが、VMWareネイティブのDPDK対応仮想スイッチに相当するものがあるか否かがよくわからず。。。
https://docs.mellanox.com/pages/releaseview.action?pageId=15049806
N-VDSであればDPDKが動作しているのか?ちょっと気になっています。
なお、以下の全体構成図では、どこでPMDが動作しているかも表していますが、
今後はOvS-DPDKとSR-IOVのメリットのみを享受できるような方向性で進化&深化していくと考えています。
具体例として、vDPA(virtual data path acceleration)やScaleble IOVなどが挙げられますが、k8sのPod上で、クラウドネイティブな柔軟性を確保しつつ、Bare Metalに近い性能を簡単に引き出せる技術だと考えています。
vDPA
Achieving network wirespeed in an open standard manner: introducing vDPA
Scaleble IOV
https://01.org/blogs/2019/assignable-interfaces-intel-scalable-i/o-virtualization-linux
これらをすぐにキャッチアップできるようにするためにも、今回のような構成を充分に理解し、サクッと組み上げられる基礎的な技術力が必須になっていくのでは?と考えています。
なお、過去記事でCiscoCSR1000vなどの仮想アプライアンスについて記載しましたが、単体での性能を確認することに加えて、VPPと比較することにより、どの程度性能が出るのか?といった相対的な指標が導き出せた方が評価し易いかもしれないと考えました。
なので、性能値を測る上での比較元として利用するため、どのような環境においても、VPPをサクッと構築できたら便利だなと思い今回の記事を書いた次第です。
*1:ちなみに、先頭の「0000」は、PCIのDomain番号となります。
*2:DPDKの設定項目はstartup.confの下方に存在しますが、全てコメントアウトされているため、そのまま追記して構いません。
*3:ファイル名や格納パスは任意でOKなようです。
*4:前回記事とは異なり、今回は通常のRouterとして動作させるため、本設定のみで充分です。
*5:dpdk-devbind -uコマンドにより、DPDKの制御下からUnbindできるもののKernel制御に戻らない場合が多いので筐体ごと再起動してください。
*6:MTU1500以下の場合、疎通不可となる事象を確認しましたので、1501以上に設定してください。