VPP (Vector Packet Processing) в VyOS

Vector Packet Processing (VPP) - это высокопроизводительный dataplane framework от проекта FD.io, который может использоваться в VyOS вместо стандартного Linux kernel networking stack для достижения значительно более высокой производительности пакетной обработки.

Введение в VPP

Что такое VPP?

VPP (Vector Packet Processing) - это модульный, расширяемый фреймворк для обработки пакетов в пространстве пользователя (userspace), разработанный проектом FD.io (Fast Data Project) под эгидой Linux Foundation.

Ключевые особенности:

  • Векторная обработка: Обрабатывает пакеты группами (векторами), а не по одному
  • Userspace: Работает в пространстве пользователя, минуя kernel networking stack
  • Zero-copy: Минимизирует копирование данных между user/kernel space
  • DPDK интеграция: Использует Intel DPDK для прямого доступа к сетевым картам
  • Графовая архитектура: Модульная архитектура на основе графа обработки пакетов
  • Высокая производительность: 10-100x лучше производительность по сравнению с kernel networking

Преимущества VPP

Производительность:

  • Throughput: до 200+ Gbps на commodity hardware
  • Latency: микросекундная задержка обработки пакетов
  • PPS: миллионы пакетов в секунду

Эффективность:

  • Оптимизация использования CPU cache
  • Минимизация context switches
  • Эффективное использование CPU cores

Гибкость:

  • Модульная архитектура с плагинами
  • Программируемость через plugins
  • Поддержка множества протоколов

Когда использовать VPP?

Рекомендуется для:

  • High-throughput сценариев (10+ Gbps)
  • NFV (Network Function Virtualization)
  • Service provider edge
  • High-performance routing/switching
  • vRouter в облачных средах
  • IPsec VPN с высокой нагрузкой

Не рекомендуется для:

  • SOHO/малые офисы (overkill)
  • Системы с ограниченными ресурсами
  • Простые конфигурации
  • Случаи, где kernel networking достаточно

Архитектура VPP в VyOS

Стандартный Linux Networking vs VPP

Linux Kernel Networking:

Application
    ↓
 Socket API
    ↓
Kernel Network Stack
    ↓
Network Driver
    ↓
 NIC Hardware

VPP Dataplane:

Application (via VPP API)
    ↓
VPP (userspace)
    ↓
DPDK PMD (Poll Mode Driver)
    ↓
NIC Hardware (direct access)

Интеграция VPP с VyOS

VyOS может использовать VPP как альтернативный dataplane:

VyOS CLI/API
    ↓
VyOS Configuration Daemon
    ↓
VPP Control Plane Integration
    ↓
VPP Dataplane (packet processing)

Компоненты:

  • VPP daemon: Основной процесс обработки пакетов
  • VPP plugins: Расширения функциональности (NAT, ACL, IPsec, etc.)
  • Control plane integration: Интеграция с FRR для routing protocols
  • Configuration management: VyOS CLI → VPP API

Установка и настройка VPP

Требования к системе

Hardware:

  • CPU: x86_64 с поддержкой SSE4.2 и AVX2 (рекомендуется)
  • RAM: минимум 4GB (рекомендуется 8GB+)
  • NIC: DPDK-совместимые сетевые карты (Intel, Mellanox, и др.)
  • Hugepages: включены в BIOS/kernel

Software:

  • VyOS 1.4+ (rolling release рекомендуется)
  • Linux kernel с поддержкой hugepages
  • DPDK-совместимые драйверы

Проверка совместимости NIC

# Проверить PCI ID сетевых карт
lspci | grep Ethernet

# Проверить DPDK-совместимость
# Intel 82599, X710, XL710 - отличная поддержка
# Intel e1000e (igb) - базовая поддержка
# Mellanox ConnectX-4/5 - отличная поддержка

# Проверить текущий драйвер
ethtool -i eth0 | grep driver

Настройка Hugepages

VPP требует hugepages для эффективного управления памятью:

# Проверить текущие hugepages
cat /proc/meminfo | grep Huge

# Настроить hugepages (2MB pages, 1024 pages = 2GB)
configure
set system option hugepages hugepage-size 2048
set system option hugepages count 1024
commit
save

# Альтернативно - через kernel параметры
sudo vi /boot/grub/grub.cfg
# Добавить к kernel line:
# hugepagesz=2M hugepages=1024 default_hugepagesz=2M

# Reboot для применения
reboot

Установка VPP (если не предустановлен)

# VPP может быть предустановлен в некоторых VyOS образах
# Проверить наличие
dpkg -l | grep vpp

# Если не установлен - установить из репозитория
sudo apt-get update
sudo apt-get install vpp vpp-plugin-core vpp-plugin-dpdk

# Проверить версию
vppctl show version

Базовая конфигурация VPP

Включение VPP dataplane

configure

# Включить VPP
set system dataplane vpp

# Указать интерфейсы для VPP
set system dataplane vpp interface eth0
set system dataplane vpp interface eth1

# Настроить CPU cores для VPP
set system dataplane vpp cpu main-core 0
set system dataplane vpp cpu corelist-workers 1-3

commit
save

# Reboot для применения
reboot

Проверка статуса VPP

# После reboot - проверить VPP
vppctl show version
vppctl show hardware
vppctl show interface

# Проверить что интерфейсы подхвачены VPP
vppctl show hardware-interfaces

Работа с VPP интерфейсами

Управление интерфейсами через VPP

После включения VPP, интерфейсы управляются через VPP control plane:

# VyOS CLI продолжает работать для конфигурации
configure
set interfaces ethernet eth0 address 192.168.1.1/24
commit

# Внутренне VyOS транслирует команды в VPP API
# Проверить через vppctl
vppctl show interface address

Проверка производительности интерфейсов

# Статистика интерфейсов VPP
vppctl show interface

# Детальная статистика
vppctl show hardware-interfaces

# Errors и drops
vppctl show errors

# Статистика по node graph
vppctl show runtime

VPP для специфичных функций

IPsec с VPP

VPP обеспечивает аппаратное ускорение IPsec:

configure

# Включить VPP IPsec plugin
set system dataplane vpp plugin dpdk enable
set system dataplane vpp plugin crypto enable

commit
save

# Настроить IPsec как обычно через VyOS CLI
set vpn ipsec ike-group IKE-VPP proposal 1 encryption aes256
set vpn ipsec ike-group IKE-VPP proposal 1 hash sha256
set vpn ipsec ike-group IKE-VPP proposal 1 dh-group 14

set vpn ipsec esp-group ESP-VPP proposal 1 encryption aes256
set vpn ipsec esp-group ESP-VPP proposal 1 hash sha256

set vpn ipsec site-to-site peer 203.0.113.1 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 203.0.113.1 authentication pre-shared-secret 'secret'
set vpn ipsec site-to-site peer 203.0.113.1 ike-group IKE-VPP
set vpn ipsec site-to-site peer 203.0.113.1 local-address 203.0.113.2
set vpn ipsec site-to-site peer 203.0.113.1 tunnel 1 esp-group ESP-VPP
set vpn ipsec site-to-site peer 203.0.113.1 tunnel 1 local prefix 192.168.1.0/24
set vpn ipsec site-to-site peer 203.0.113.1 tunnel 1 remote prefix 192.168.2.0/24

commit
save

Проверка VPP IPsec:

# Проверить IPsec через VPP
vppctl show ipsec all

# Статистика IPsec
vppctl show ipsec sa
vppctl show ipsec tunnel

Производительность IPsec с VPP:

  • До 10-50 Gbps IPsec throughput (зависит от hardware)
  • Аппаратное ускорение AES-NI
  • Параллельная обработка множественных туннелей

NAT с VPP

VPP NAT plugin обеспечивает высокопроизводительный NAT:

configure

# Включить VPP NAT plugin
set system dataplane vpp plugin nat enable

# Настроить NAT как обычно
set nat source rule 100 outbound-interface eth0
set nat source rule 100 source address 192.168.1.0/24
set nat source rule 100 translation address masquerade

commit
save

Проверка VPP NAT:

# NAT сессии в VPP
vppctl show nat44 sessions

# NAT статистика
vppctl show nat44 statistics

# NAT addresses
vppctl show nat44 addresses

Производительность NAT с VPP:

  • Миллионы NAT сессий
  • Высокий PPS для новых соединений
  • Масштабируется с количеством CPU cores

ACL/Firewall с VPP

VPP ACL plugin для firewall функций:

configure

# Включить VPP ACL plugin
set system dataplane vpp plugin acl enable

# Настроить firewall через VyOS CLI как обычно
set firewall name WAN_LOCAL default-action drop
set firewall name WAN_LOCAL rule 10 action accept
set firewall name WAN_LOCAL rule 10 state established enable
set firewall name WAN_LOCAL rule 10 state related enable

set interfaces ethernet eth0 firewall local name WAN_LOCAL

commit
save

Проверка VPP ACL:

# ACL правила в VPP
vppctl show acl-plugin acl

# ACL статистика
vppctl show acl-plugin sessions

Мониторинг и отладка VPP

Базовый мониторинг

# Общая информация
vppctl show version
vppctl show hardware
vppctl show memory

# CPU использование
vppctl show runtime

# Интерфейсы
vppctl show interface
vppctl show interface address

# Ошибки
vppctl show errors

# Packet graph
vppctl show vlib graph

Детальная статистика

# Node runtime статистика
vppctl show runtime verbose

# Per-node статистика
vppctl show node counters

# Buffer usage
vppctl show buffers

# Thread статистика
vppctl show threads

Packet tracing

# Включить packet trace (первые 100 пакетов)
vppctl trace add dpdk-input 100

# Показать trace
vppctl show trace

# Очистить trace
vppctl clear trace

Performance tuning

# Оптимизация CPU cores
vppctl set interface rx-mode eth0 polling

# Настройка buffer size
# В /etc/vpp/startup.conf
unix {
  cli-listen /run/vpp/cli.sock
}
cpu {
  main-core 0
  corelist-workers 1-7
}
dpdk {
  dev 0000:03:00.0
  dev 0000:04:00.0
  num-mbufs 128000
  socket-mem 2048,2048
}

Troubleshooting VPP

Проблема: VPP не стартует

Диагностика:

# Проверить статус VPP service
sudo systemctl status vpp

# Логи VPP
sudo journalctl -u vpp -n 100

# VPP startup log
sudo cat /var/log/vpp/vpp.log

Типичные причины:

  1. Hugepages не настроены
# Проверить
cat /proc/meminfo | grep Huge

# Если HugePages_Total = 0, настроить hugepages
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  1. DPDK не может получить доступ к NIC
# Проверить PCI binding
sudo dpdk-devbind.py --status

# Bind интерфейс к DPDK driver
sudo dpdk-devbind.py --bind=vfio-pci 0000:03:00.0
  1. Недостаточно памяти
# Проверить доступную память
free -h

# Увеличить socket-mem в /etc/vpp/startup.conf

Проблема: Низкая производительность

Диагностика:

# Проверить CPU usage
vppctl show runtime

# Проверить packet drops
vppctl show hardware-interfaces

# Проверить errors
vppctl show errors

Решения:

  1. Увеличить worker cores
# В /etc/vpp/startup.conf
cpu {
  main-core 0
  corelist-workers 1-7  # Больше cores
}
  1. Оптимизировать RX mode
vppctl set interface rx-mode eth0 polling
vppctl set interface rx-mode eth1 polling
  1. Увеличить buffers
# В /etc/vpp/startup.conf
dpdk {
  num-mbufs 256000  # Увеличить
}

Проблема: Интерфейсы не доступны

Диагностика:

# Проверить hardware interfaces
vppctl show hardware-interfaces

# Проверить PCI devices
lspci | grep Ethernet

# Проверить DPDK binding
sudo dpdk-devbind.py --status

Решение:

# Bind интерфейсы к DPDK
sudo dpdk-devbind.py --bind=vfio-pci 0000:03:00.0
sudo dpdk-devbind.py --bind=vfio-pci 0000:04:00.0

# Restart VPP
sudo systemctl restart vpp

Практические сценарии с VPP

Сценарий 1: High-throughput Router с VPP

Задача: Роутер с 40+ Gbps throughput для ISP edge

Конфигурация:

configure

# Включить VPP
set system dataplane vpp

# Настроить интерфейсы
set system dataplane vpp interface eth0
set system dataplane vpp interface eth1

# CPU allocation (8 cores)
set system dataplane vpp cpu main-core 0
set system dataplane vpp cpu corelist-workers 1-7

# Интерфейсы
set interfaces ethernet eth0 address 203.0.113.2/30
set interfaces ethernet eth0 description 'Upstream'

set interfaces ethernet eth1 address 192.168.1.1/24
set interfaces ethernet eth1 description 'Internal'

# Routing
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1

# NAT с VPP
set system dataplane vpp plugin nat enable
set nat source rule 100 outbound-interface eth0
set nat source rule 100 source address 192.168.1.0/24
set nat source rule 100 translation address masquerade

commit
save
reboot

Проверка производительности:

# После reboot
# Запустить iperf3 тест
# Server на внутренней сети
iperf3 -s

# Client через роутер
iperf3 -c <server-ip> -P 10 -t 60

# Мониторить VPP
vppctl show runtime
vppctl show interface
vppctl show nat44 sessions

Сценарий 2: IPsec VPN Gateway с VPP ускорением

Задача: VPN gateway с 10+ Gbps IPsec throughput

Конфигурация:

configure

# VPP с crypto plugin
set system dataplane vpp
set system dataplane vpp plugin dpdk enable
set system dataplane vpp plugin crypto enable
set system dataplane vpp plugin nat enable

set system dataplane vpp interface eth0
set system dataplane vpp interface eth1

set system dataplane vpp cpu main-core 0
set system dataplane vpp cpu corelist-workers 1-15  # 16 cores total

# Интерфейсы
set interfaces ethernet eth0 address 203.0.113.10/24
set interfaces ethernet eth0 description 'WAN'

set interfaces ethernet eth1 address 192.168.1.1/24
set interfaces ethernet eth1 description 'LAN'

# Multiple IPsec tunnels
# Tunnel 1
set vpn ipsec site-to-site peer 203.0.113.20 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 203.0.113.20 authentication pre-shared-secret 'secret1'
set vpn ipsec site-to-site peer 203.0.113.20 ike-group IKE-VPP
set vpn ipsec site-to-site peer 203.0.113.20 local-address 203.0.113.10
set vpn ipsec site-to-site peer 203.0.113.20 tunnel 1 esp-group ESP-VPP
set vpn ipsec site-to-site peer 203.0.113.20 tunnel 1 local prefix 192.168.1.0/24
set vpn ipsec site-to-site peer 203.0.113.20 tunnel 1 remote prefix 192.168.2.0/24

# Tunnel 2
set vpn ipsec site-to-site peer 203.0.113.30 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 203.0.113.30 authentication pre-shared-secret 'secret2'
set vpn ipsec site-to-site peer 203.0.113.30 ike-group IKE-VPP
set vpn ipsec site-to-site peer 203.0.113.30 local-address 203.0.113.10
set vpn ipsec site-to-site peer 203.0.113.30 tunnel 1 esp-group ESP-VPP
set vpn ipsec site-to-site peer 203.0.113.30 tunnel 1 local prefix 192.168.1.0/24
set vpn ipsec site-to-site peer 203.0.113.30 tunnel 1 remote prefix 192.168.3.0/24

commit
save
reboot

Мониторинг IPsec производительности:

# IPsec tunnels
vppctl show ipsec all

# IPsec throughput
vppctl show interface

# Crypto engines
vppctl show crypto engines

Сценарий 3: NFV vRouter в облаке

Задача: Виртуальный роутер в облачной среде с VPP для высокой производительности

Особенности:

  • Работа в виртуальной машине
  • Virtio интерфейсы с DPDK
  • Оптимизация для cloud environment

Конфигурация:

configure

# VPP с virtio support
set system dataplane vpp
set system dataplane vpp interface eth0
set system dataplane vpp interface eth1

# Меньше cores для VM
set system dataplane vpp cpu main-core 0
set system dataplane vpp cpu corelist-workers 1-3

# Интерфейсы
set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 description 'Cloud-WAN'

set interfaces ethernet eth1 address 10.0.1.1/24
set interfaces ethernet eth1 description 'Cloud-LAN'

# Cloud-specific routing
set protocols static route 0.0.0.0/0 next-hop dhcp-interface eth0

# NAT
set nat source rule 100 outbound-interface eth0
set nat source rule 100 source address 10.0.1.0/24
set nat source rule 100 translation address masquerade

commit
save
reboot

Сравнение производительности: Linux Kernel vs VPP

Тестовая конфигурация

Hardware:

  • CPU: Intel Xeon Silver 4214 (12 cores, 24 threads)
  • RAM: 64GB DDR4
  • NIC: Intel X710 (10 Gbps)

Test setup:

  • Simple routing (no NAT, no firewall)
  • 64-byte packets (worst case)
  • 1500-byte packets (typical)

Результаты тестов

Linux Kernel Networking:

64-byte packets:  ~2 Mpps (2 Gbps)
1500-byte packets: ~8 Gbps
Latency: 100-500 µs
CPU usage: 100% on 1 core at 8 Gbps

VPP Dataplane:

64-byte packets:  ~10 Mpps (10 Gbps)
1500-byte packets: ~40 Gbps (with 4 worker cores)
Latency: 10-50 µs
CPU usage: ~40% на 4 cores at 40 Gbps

Вывод:

  • VPP: 5x лучше PPS (packets per second)
  • VPP: 5x лучше throughput
  • VPP: 10x ниже latency
  • VPP: Лучше масштабируется с cores

Когда выигрыш максимален?

VPP показывает наибольший прирост в:

  1. High PPS сценариях (мелкие пакеты)
  2. IPsec encryption (аппаратное ускорение)
  3. Большое количество NAT сессий
  4. Stateful firewall с множеством правил
  5. Комбинация функций (routing + NAT + IPsec + ACL)

Ограничения VPP в VyOS

Текущие ограничения

  1. Не все VyOS функции поддерживаются с VPP:

    • Некоторые legacy протоколы могут не работать
    • Специфичные kernel-based функции недоступны
  2. Требования к hardware:

    • DPDK-совместимые NIC required для максимальной производительности
    • Hugepages обязательны
    • Достаточно CPU cores для worker threads
  3. Complexity:

    • Более сложная настройка и troubleshooting
    • Требуется понимание VPP архитектуры
    • Debug сложнее чем kernel networking
  4. Интеграция:

    • Некоторые сторонние инструменты могут не работать с VPP
    • Standard Linux tools (tcpdump, iptables) не работают напрямую с VPP

Альтернативные решения

Если VPP слишком сложен, рассмотрите:

  1. Kernel optimizations:

    • XDP (eXpress Data Path)
    • TC (Traffic Control) offload
    • RSS (Receive Side Scaling) tuning
  2. Hardware offload:

    • SmartNICs (Mellanox, Netronome)
    • FPGA-based solutions
  3. Commercial solutions:

    • Cisco CSR 1000v с VPP
    • VyOS Professional с VPP support

Лучшие практики для VPP

Планирование

  1. Оценить необходимость VPP:

    • Нужен ли реально такой throughput?
    • Достаточно ли kernel networking?
    • Есть ли подходящий hardware?
  2. Планировать ресурсы:

    • CPU cores: minimum 4 (main + 3 workers)
    • RAM: minimum 8GB для hugepages
    • NIC: DPDK-compatible
  3. Тестировать в staging:

    • Всегда тестировать VPP конфигурацию перед production
    • Проверять все требуемые функции
    • Измерять реальную производительность

Настройка

  1. Правильно выделять CPU cores:
# Изолировать cores для VPP
# В /etc/default/grub
GRUB_CMDLINE_LINUX="isolcpus=1-7"

# VPP используют isolated cores
set system dataplane vpp cpu corelist-workers 1-7
  1. Оптимизировать hugepages:
# Использовать 1GB hugepages для больших deployments
echo 8 | sudo tee /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
  1. Мониторинг:
# Регулярно проверять VPP stats
vppctl show runtime
vppctl show errors
vppctl show hardware-interfaces

Операционные практики

  1. Backup конфигурации:

    • VyOS configuration backup включает VPP settings
    • Дополнительно backup /etc/vpp/startup.conf
  2. Мониторинг производительности:

    • Интеграция с Prometheus/Grafana
    • VPP metrics export
    • Alerting на packet drops
  3. Обновления:

    • Тестировать VPP updates в staging
    • Читать release notes для breaking changes
    • Планировать maintenance windows

Заключение

VPP dataplane в VyOS предоставляет значительное улучшение производительности для high-throughput сценариев:

Ключевые преимущества:

  • 5-10x улучшение throughput
  • 10x снижение latency
  • Лучшее масштабирование с CPU cores
  • Аппаратное ускорение криптографии

Когда использовать:

  • ISP edge routers (10+ Gbps)
  • VPN gateways с высокой нагрузкой
  • NFV/SDN deployments
  • Cloud vRouters
  • High-performance NAT gateways

Когда не использовать:

  • SOHO/малые офисы (overkill)
  • Ограниченные ресурсы
  • Простые сценарии
  • Нет подходящего hardware

VPP - это мощный инструмент, но требует тщательного планирования, правильного hardware, и понимания архитектуры. Для большинства сценариев standard Linux kernel networking в VyOS достаточно и проще в управлении. VPP следует рассматривать только когда необходима экстремальная производительность и есть соответствующие ресурсы для поддержки.

Дополнительные ресурсы

Проверено OpenNix LLC · Обновлено