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 HardwareVPP 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 runtimeVPP для специфичных функций
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 threadsPacket tracing
# Включить packet trace (первые 100 пакетов)
vppctl trace add dpdk-input 100
# Показать trace
vppctl show trace
# Очистить trace
vppctl clear tracePerformance 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Типичные причины:
- Hugepages не настроены
# Проверить
cat /proc/meminfo | grep Huge
# Если HugePages_Total = 0, настроить hugepages
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages- DPDK не может получить доступ к NIC
# Проверить PCI binding
sudo dpdk-devbind.py --status
# Bind интерфейс к DPDK driver
sudo dpdk-devbind.py --bind=vfio-pci 0000:03:00.0- Недостаточно памяти
# Проверить доступную память
free -h
# Увеличить socket-mem в /etc/vpp/startup.confПроблема: Низкая производительность
Диагностика:
# Проверить CPU usage
vppctl show runtime
# Проверить packet drops
vppctl show hardware-interfaces
# Проверить errors
vppctl show errorsРешения:
- Увеличить worker cores
# В /etc/vpp/startup.conf
cpu {
main-core 0
corelist-workers 1-7 # Больше cores
}- Оптимизировать RX mode
vppctl set interface rx-mode eth0 polling
vppctl set interface rx-mode eth1 polling- Увеличить 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 GbpsVPP 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 показывает наибольший прирост в:
- High PPS сценариях (мелкие пакеты)
- IPsec encryption (аппаратное ускорение)
- Большое количество NAT сессий
- Stateful firewall с множеством правил
- Комбинация функций (routing + NAT + IPsec + ACL)
Ограничения VPP в VyOS
Текущие ограничения
Не все VyOS функции поддерживаются с VPP:
- Некоторые legacy протоколы могут не работать
- Специфичные kernel-based функции недоступны
Требования к hardware:
- DPDK-совместимые NIC required для максимальной производительности
- Hugepages обязательны
- Достаточно CPU cores для worker threads
Complexity:
- Более сложная настройка и troubleshooting
- Требуется понимание VPP архитектуры
- Debug сложнее чем kernel networking
Интеграция:
- Некоторые сторонние инструменты могут не работать с VPP
- Standard Linux tools (tcpdump, iptables) не работают напрямую с VPP
Альтернативные решения
Если VPP слишком сложен, рассмотрите:
Kernel optimizations:
- XDP (eXpress Data Path)
- TC (Traffic Control) offload
- RSS (Receive Side Scaling) tuning
Hardware offload:
- SmartNICs (Mellanox, Netronome)
- FPGA-based solutions
Commercial solutions:
- Cisco CSR 1000v с VPP
- VyOS Professional с VPP support
Лучшие практики для VPP
Планирование
Оценить необходимость VPP:
- Нужен ли реально такой throughput?
- Достаточно ли kernel networking?
- Есть ли подходящий hardware?
Планировать ресурсы:
- CPU cores: minimum 4 (main + 3 workers)
- RAM: minimum 8GB для hugepages
- NIC: DPDK-compatible
Тестировать в staging:
- Всегда тестировать VPP конфигурацию перед production
- Проверять все требуемые функции
- Измерять реальную производительность
Настройка
- Правильно выделять 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- Оптимизировать hugepages:
# Использовать 1GB hugepages для больших deployments
echo 8 | sudo tee /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages- Мониторинг:
# Регулярно проверять VPP stats
vppctl show runtime
vppctl show errors
vppctl show hardware-interfacesОперационные практики
Backup конфигурации:
- VyOS configuration backup включает VPP settings
- Дополнительно backup /etc/vpp/startup.conf
Мониторинг производительности:
- Интеграция с Prometheus/Grafana
- VPP metrics export
- Alerting на packet drops
Обновления:
- Тестировать 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 следует рассматривать только когда необходима экстремальная производительность и есть соответствующие ресурсы для поддержки.
Дополнительные ресурсы
- FD.io Project: https://fd.io/
- VPP Wiki: https://wiki.fd.io/view/VPP
- VPP Documentation: https://docs.fd.io/vpp/
- DPDK: https://www.dpdk.org/
- VyOS Forums: https://forum.vyos.io/ (VPP discussions)