- Очень много презентаций о VPP на сайте fd.io
-
- Разобрал только эту “How to Push Extreme Limits of Performance and Scale with Vector Packet Processing Technology”
-
- Netgate TNSR – один из известных комерческих проектов, использующих VPP
- Есть даже аппаратные ускорения VPP на базе спец. чипов типа DPU Marvell® OCTEON 10 DPU Platform, помимо множества других offload (ML, encryption, TPM) и программируемости
- VPP is a rapid packet processing development platform for highly performing network applications. It creates a vector of packet indices and processes them using a directed graph of nodes – resulting in a highly performant solution (14 MPPS on single Core).
-
- At 10GE, 64B frames can arrive at 14.88Mfps – that’s 67nsec per frame (1 млр наносекунд/14млн).
- With 2 GHz CPU that’s 134 clock cycles per frame (2млрд герц/14млн). (в презе была некорректная логика расчета, удалил)
- BUT it takes ~70nsec to access memory – too slow for required time budget.
- Efficiency of dealing with packets within the computer is essential
- Moving packets: receiving on physical interfaces (NICs) and virtual interfaces (VNFs) => Need optimized drivers for both; should not rely on memory access.
- Processing packets: Header manipulation, encaps/decaps, lookups, classifiers, counters => Need packet processing optimized for CPU platforms
-
- CIST стенд.
- В своем автостенде CSIT проверяют (Automated):
- VPP functionality per specifications (RFCs)
- VPP performance and efficiency (PPS, CPP – Cycles per Packet)
-
- Network data plane – throughput Non-Drop Rate, bandwidth, PPS, packet delay; Нагрузочное тестирование VPP – отдельная история (zero loss/NDR, повторяемость результата, latency), но они проводят эти тесты совместно с PDR (0.5 loss tolerance).
- Network Control Plane, Management Plane Interactions (memoryleaks!)
-
- В своем автостенде CSIT проверяют (Automated):
-
Runs as a Linux user-space application
- It runs on commodity CPUs and leverages DPDK
- Ships as part of both embedded & server products, in volume
- Active development since 2002 OMG
- Кеймы применения разные – облачные сценарии (SDN, NFV, Cloud); Universal CPE, Cloud Load Balancer, BRAS (Broadband network gateway), Intrusion Prevention System (IPS, по факту известно мне только о IDS)
- VPP в контексте vlan очень похож на cisco ASR – vlan нет, но есть сабинтерфейсв и bridge domains, так же есть и l2vpn!
- yandex использует VPP (linkmeup telecom 98)
- Kaspersky разрабатывает dataplane NGFW на базе VPP (публичные вакансии)
- (dpdk, vpp) VPP не обязательно использует DPDK, у него есть свои native драйвера, с которыми он даже работает лучше, но в основном все используют с DPDK (и яндекс, но поглядывают на native; linkmeup telecom 98)
- vpp больше фреймворк
- dpdk больше набор библиотек, причем некоторые функции dpdk поддерживают векторизацию
- В vpp есть плагин с constant time lookup для ACL, который интересен для firewall с большим количеством rules
- (linkmeup 98) По сути работает близко к napi, только вместо прерываний VPP эвристически ожидает следующие пакеты (десятки) того же потока/одного вектора и соответственно весь этот набор пакетов требует только одного lookup/решения/графа, если эвристика VPP не сработала – пакет обрабатывается «как обычно» (чаще срабатывает 🙂 )
- Нужно минимизировать использование if в пакетной обработке т.к. каждый if стоит дорог при том что без них совсем невозможно 🙂 (грубо на глаз 1 if = -50к пакетов Cisco VPP)
пример настройки простого VPP маршрутизатора
Перейдем сначала к настройке DUT. Открываем сессию SSH и производим базовую настройку. Проверяем что порты DUT находятся в DPDK:
root@intel-corei7-64:~# python3 /usr/bin/dpdk-devbind.py --status
Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.1 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.2 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.3 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:02:00.0 'I210 Gigabit Network Connection 1533' drv=uio_pci_generic unused=
Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (11) I219-LM 0d4c' if=eth0 drv=e1000e unused=uio_pci_generic *Active*
No 'Baseband' devices detected
==============================
No 'Crypto' devices detected
============================
No 'DMA' devices detected
=========================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
No 'Misc (rawdev)' devices detected
===================================
No 'Regex' devices detected
===========================
No 'ML' devices detected
========================
После заходим в консоль VPP и производим простую настройку. Сначала перезагружаем VPP чтобы сбросить сетевые настройки:
$ systemctl restart vpp
Далее настраиваем интерфейсы DUT с VLAN:
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/0 3003 dot1q 3003 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/1 3004 dot1q 3004 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/2 3005 dot1q 3005 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/3 3006 dot1q 3006 exact-match
Поднимаем их:
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/0 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/0.3003 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/1 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/1.3004 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/2 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/2.3005 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/3 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/3.3006 up
Прописываем IP-адреса:
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/0.3003 fd00:1::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/1.3004 fd00:2::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/2.3005 fd00:3::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/3.3006 fd00:4::1/64
Далее необходимо вручную прописать ND-записи, чтобы маршрутизатор знал своих “соседей”:
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/0.3003 fd00:1::2 {trex_port0_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/1.3004 fd00:2::2 {trex_port1_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/2.3005 fd00:3::2 {trex_port2_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/3.3006 fd00:4::2 {trex_port3_mac}
Прописываем маршруты:
$ vppctl ip route add fd00:cafe::/32 via fd00:1::2 TwentyFiveGigabitEthernet1/0/0.3003
$ vppctl ip route add fd00:feed::/32 via fd00:2::2 TwentyFiveGigabitEthernet1/0/1.3004
$ vppctl ip route add fd00:beef::/32 via fd00:3::2 TwentyFiveGigabitEthernet1/0/2.3005
$ vppctl ip route add fd00:deaf::/32 via fd00:4::2 TwentyFiveGigabitEthernet1/0/3.3006