Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

CentOS7 FD.io/VPP セットアップ VMware Workstation pro編

FD.io/VPP(以下、VPP)のセットアップと自動起動設定までの構築方法を記載します。
TRexのDUTとして使用するため、前回記事のVyOSをVPPに変更しています。
なお、今回はVMware Workstation 15 Pro(以下、VMWareWrk)上のCentOS7.7で構築していきますが、KVMの場合と異なる点があります。
このため、KVM編は別の機会に記載したいと思います。

1.環境

1-1.VMWare
筐体                             : 自作PC(Win10pro)
CPU                           : Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
VMWare              : VMware(R) Workstation 15 Pro 15.5.6 build-16341506
OS                               : CentOS7.7
TRex                             : v20.05.1
1-2.全体構成

f:id:metonymical:20200802122331j:plain
FD.io/VPPの環境を構築していきます。
VMWareWrk上では上手くいきましたが、ESXi6.7上では上手く行かず。。

1-3 .全体の流れ ~概要~
  1. 事前準備とインストール
  2. 初期設定
  3. 動作確認

2.事前準備とインストール

2-1.事前準備

NICバイスをe1000→vmxnet3に変更しますので、vmxファイルを開いてください。
仮想マシンがVMWareWrkのライブラリに登録されていると、vmxファイルが掴まれたままとなる場合があるため、一旦ライブラリからは登録を削除してください。

以下の通り、ethernet1とethernet2をvmxnet3に変更してください。
f:id:metonymical:20200802093047j:plain
ethernet0はマネジメント用となるため、そのままe1000で構いません。

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)番号とインターフェース名を確認します。
赤文字で記載した「03:00.0」の部分が「bus:slot.function」になります。*1

[root@c77g126 ~]# dpdk-devbind -s

Network devices using kernel driver
===================================
0000:02:00.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens32 drv=e1000 unused= *Active*
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens160 drv=vmxnet3 unused= 
0000:0b:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens192 drv=vmxnet3 unused= 

以下のコマンドでも確認可能ですので、どちらでも構いません。

[root@c77g126 ~]# lshw -businfo -c network
Bus info          Device      Class      Description
====================================================
pci@0000:02:00.0  ens32       network    82545EM Gigabit Ethernet Controller (Copper)
pci@0000:03:00.0  ens160      network    VMXNET3 Ethernet Controller
pci@0000:0b:00.0  ens192      network    VMXNET3 Ethernet Controller
                  virbr0-nic  network    Ethernet interface
                  virbr0      network    Ethernet interface
3-2.OS起動時の設定

OS起動時にvfio-pciの読込みとインターフェースダウンを実施しますので、以下の通り設定を最下行に追記してください。
設定完了後、実行権限を付与します。

vi /etc/rc.local

[root@c77g126 ~]# vi /etc/rc.local

modprobe vfio-pci
ifconfig ens160 down
ifconfig ens192 down
exit 0

[root@c77g126 ~]# chmod 755 /etc/rc.local
3-3.VPPのstartup.conf設定

VPPのstartup.confに設定を追記します。
青文字箇所を追記してください。*2

vi /etc/vpp/startup.conf

[root@c77g126 ~]# 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:03:00.0 {
                name ens160
                num-rx-queues 2
                num-tx-queues 2
        }
        dev 0000:0b:00.0 {
                name ens192
                num-rx-queues 2
                num-tx-queues 2
        }
}

上記の設定はVPPサービス起動時にインターフェースをアタッチする設定やvpp.cfgファイルの参照先パスの設定となります。*3

3-4.VPPのvpp.cfg設定

vpp.cfgファイルはCiscoで言うところのstartup-configファイルに相当します。
これを設定しておかないと、起動するたびにIPアドレスの設定などを都度実施することになりますので、最低限の設定を投入します。

vi /root/vpp.cfg

[root@c77g126 ~]# vi /root/vpp.cfg

set int ip address ens160 192.168.7.1/24
set int ip address ens192 192.168.8.1/24
ip route add 16.0.0.0/24 via 192.168.7.2
ip route add 48.0.0.0/24 via 192.168.8.2
set int state ens160 up
set int state ens192 up

IPの設定とStatic Routeの設定、最後にインターフェースアップ設定を入れておきます。*4

3-5.VPPサービス自動起動設定と再起動

VPPサービス自動起動設定と再起動を実施します。

systemctl enable vpp

reboot

4.動作確認

4-1.インターフェース周りの確認

以下のコマンドでVPPコンソールに入ります。

vppctl

出力例

[root@c77g126 ~]# vppctl
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp#

VPPコンソールに入ったら、以下4つのコマンドでステータスを確認します。

show pci
show hardware-interfaces
show interface
show interface addr

出力例
確認するポイントを赤文字で記載します。

vpp# show pci
Address      Sock VID:PID     Link Speed   Driver          Product Name                    Vital Product Data
0000:02:00.0   0  8086:100f   unknown      e1000
0000:03:00.0   0  15ad:07b0   5.0 GT/s x32 vfio-pci
0000:0b:00.0   0  15ad:07b0   5.0 GT/s x32 vfio-pci


vpp# show hardware-interfaces
              Name                Idx   Link  Hardware
ens160                             1     up   ens160
  Link speed: 10 Gbps
  Ethernet address 00:0c:29:35:dd:19
  VMware VMXNET3
    carrier up full duplex mtu 9206
    flags: admin-up pmd
    Devargs:
    rx: queues 2 (max 16), desc 512 (min 128 max 4096 align 1)
    tx: queues 1 (max 8), desc 512 (min 512 max 4096 align 1)
    pci: device 15ad:07b0 subsystem 15ad:07b0 address 0000:03:00.00 numa 0
    max rx packet len: 16384
    promiscuous: unicast off all-multicast on
    vlan offload: strip off filter off qinq off
    rx offload avail:  vlan-strip udp-cksum tcp-cksum tcp-lro vlan-filter
                       jumbo-frame scatter rss-hash
    rx offload active: none
    tx offload avail:  vlan-insert udp-cksum tcp-cksum tcp-tso multi-segs
    tx offload active: multi-segs
    rss avail:         ipv4-tcp ipv4 ipv6-tcp ipv6
    rss active:        none
    tx burst function: vmxnet3_xmit_pkts
    rx burst function: vmxnet3_recv_pkts

    tx frames ok                                           1
    tx bytes ok                                           42
    extended stats:
      tx good packets                                      1
      tx good bytes                                       42
      tx q0packets                                         1
      tx q0bytes                                          42
ens192                             2     up   ens192
  Link speed: 10 Gbps
  Ethernet address 00:0c:29:35:dd:23
  VMware VMXNET3
    carrier up full duplex mtu 9206
    flags: admin-up pmd
    Devargs:
    rx: queues 2 (max 16), desc 512 (min 128 max 4096 align 1)
    tx: queues 1 (max 8), desc 512 (min 512 max 4096 align 1)
    pci: device 15ad:07b0 subsystem 15ad:07b0 address 0000:0b:00.00 numa 0
    max rx packet len: 16384
    promiscuous: unicast off all-multicast on
    vlan offload: strip off filter off qinq off
    rx offload avail:  vlan-strip udp-cksum tcp-cksum tcp-lro vlan-filter
                       jumbo-frame scatter rss-hash
    rx offload active: none
    tx offload avail:  vlan-insert udp-cksum tcp-cksum tcp-tso multi-segs
    tx offload active: multi-segs
    rss avail:         ipv4-tcp ipv4 ipv6-tcp ipv6
    rss active:        none
    tx burst function: vmxnet3_xmit_pkts
    rx burst function: vmxnet3_recv_pkts

    tx frames ok                                           1
    tx bytes ok                                           42
    extended stats:
      tx good packets                                      1
      tx good bytes                                       42
      tx q0packets                                         1
      tx q0bytes                                          42
local0                             0    down  local0
  Link speed: unknown
  local


vpp# show interface
              Name               Idx    State  MTU (L3/IP4/IP6/MPLS)     Counter          Count
ens160                            1      up          9000/0/0/0     tx packets                     1
                                                                    tx bytes                      42
ens192                            2      up          9000/0/0/0     tx packets                     1
                                                                    tx bytes                      42
local0                            0     down          0/0/0/0


vpp# show interface addr
ens160 (up):
  L3 192.168.7.1/24
ens192 (up):
  L3 192.168.8.1/24
local0 (dn):
4-2.疎通確認

自身のIPにPingが飛ばないため、対向機器にPingを飛ばすか、対向機器からPingを飛ばしてください。

vpp# ping 192.168.7.1

Statistics: 5 sent, 0 received, 100% packet loss
自身のIPにはPingが飛びません。

vpp# ping 192.168.7.2
116 bytes from 192.168.7.2: icmp_seq=1 ttl=64 time=.3834 ms
116 bytes from 192.168.7.2: icmp_seq=2 ttl=64 time=.3127 ms
116 bytes from 192.168.7.2: icmp_seq=3 ttl=64 time=.2928 ms
116 bytes from 192.168.7.2: icmp_seq=4 ttl=64 time=.3206 ms
116 bytes from 192.168.7.2: icmp_seq=5 ttl=64 time=.2619 ms

Statistics: 5 sent, 5 received, 0% packet loss
vpp#

ここまでOKであれば、前回&前々回記事を参考にTRexから負荷を印加してみてください。

以上です。

5.最後に

以下のサイトを参考にさせて頂きました。
VPP事始め
Setup the FD.io Repository - Centos 7 — The Vector Packet Processor 20.01 documentation
VPP with VMware/Vmxnet3 — The Vector Packet Processor 20.05 documentation

先にも記載しましたが、VMware Workstation 15 Proでは正常に動作しましたが、ESXi6.7上では外部と疎通できずでした。
仮想マシンはCentOS7に加え、Ubuntu18.04でも試行しましたがNGでした。
CPUパフォーマンスカウンタを仮想化、IOMMUを仮想化の有効化も試しましたがNGでした。*5

なお、KVM上での動作については以下の構成で全てOKだったので、今後記載していきたいと思います。

  • ベアメタル
  • Linux Bridge
  • OvS-DPDK
  • SR-IOV

SR-IOVではMTUを1501以上にしないと外部疎通が不可など、割とクセがあるので、細かく記載できればと考えています。

仮想マシン上でDPDKが動作するものも増えてきたため、性能を測る上での比較元として、VPPを活用していきたいなと考えています。
あとは、DPDK利用時のチューニングの勘所などを知る上で、VPPはとてもよい教材だと思うので、もう少し掘り下げて動作を確認していければと考えています。
加えて、以下の構成も試してみたいなと考えています。
f:id:metonymical:20200802133701p:plain

*1:ちなみに、先頭の「0000」は、PCIのDomain番号となります。

*2:DPDKの設定項目はstartup.confの下方に存在しますが、全てコメントアウトされているため、そのまま追記して構いません。

*3:ファイル名や格納パスは任意でOKなようです。

*4:今回はTRexのDUTとして動作させるため、本設定のみで充分です。

*5:何か他に良い方法はないかと模索中ですが、ESXiはKVMよりも苦手です。。