Learning VPP: linux-cp(1)
Learning VPP: linux-cp(1)

Некоторое время назад приятель поделился временным плагином lcpng на основе src/plugins/linux-cp/plugin VPP в группе vpp. Автор проверил и изменил его во многих аспектах и ​​планирует объединить его с основной веткой. vpp в будущем. В этой статье в основном создается среда на основе системы ubuntu20.4.3lts и проверяются результаты тестирования на основе подключаемого модуля lcpng и frr bgpd.

lcpng библиотека GitHub: https://github.com/pimvanpelt/lcpng Блог автора: https://ipng.ch/s/articles/ — записывает процесс проверки и модификации плагина lcpng.

Введение в lcpng

Плагин lcpng — это временный плагин, скопированный из плагина vpp src/plugins/linux-cp и первоначально представленный следующим автором:

Signed-off-by: Neale Ranns nranns@cisco.com Signed-off-by: Matthew Smith mgsmith@netgate.com Signed-off-by: Jon Loeliger jdl@netgate.com Signed-off-by: Pim van Pelt pim@ipng.nl Signed-off-by: Neale Ranns neale@graphiant.com

Автор проверил и переписал существующий интерфейс подключаемого модуля Linux cp vpp и подключаемый модуль синхронизации netlink, а также записал запись модификации и процесс проверки в блоге автора, чтобы сделать подключаемый модуль Linux cp более совершенным, а конфигурацию vpp можно изменить. скопировано в интерфейс ядра Linux. Вы также можете скопировать конфигурацию Linux в vpp, чтобы реализовать двусторонний конвейер связи между Linux и vpp. Этот плагин может работать на плоскостях управления более высокого уровня, таких как проекты с открытым исходным кодом FRR и Bird. Текущий плагин поддерживает следующие функции, как описано ниже:

В статье «VPP Linux CP — Часть 7» в блоге автора автор использует isolcpus для улучшения производительности vpp. Конкретное описание следующее: После завершения установки устанавливается программа загрузки системы Linux /etc/default/grub. , а изоляция процессора и последовательный порт установлены. Информация и т. д.

Язык кода:javascript
копировать
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 isolcpus=1,2,3,5,6,7"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

# Followed by a gratuitous install and update
grub-install /dev/sda
update-grub

Важно отметить, что isolcpus — это очень умный трюк, который сообщает системе Linux избегать планирования рабочих нагрузок задач на эти процессоры при использовании планировщика задач. Поскольку Xeon-D1518 имеет 4 ядра (0, 1, 2, 3) и 4 дополнительных гиперпотока (4, 5, 6, 7), эта установка эффективно делает ядра 1, 2, 3 программируемыми для системы Linux. Недоступно, оставляя Доступны только ядро ​​0 и его гиперпоточность 4. Это означает, что наша плоскость управления будет иметь 2 процессора, доступных для запуска Bird, SNMP, SSH и т. д., при этом гиперпоточность будет фактически отключена на процессорах 1, 2 и 3, оставляя эти ядра полностью в руках VPP. Отключите Hyper-Threading следующим образом: Hyper-Threading совместно использует инструкции ЦП и кэши данных. Предпосылка VPP заключается в том, что вектор (список) пакетов будет проходить через одну и ту же процедуру (например, вход Ethernet или поиск ip4) одновременно. В такой вычислительной модели VPP использует i-cache и d-cache, чтобы позволить последующим пакетам использовать свои ранее разогретые кеши без необходимости использования (сравнительно гораздо более медленной) основной памяти. Итак: отключение систем Linux от планирования на lcore 1, 2, 3 и соответствующих им гиперпотоках 5, 6, 7 и ограничение работы VPP только на lcore 1, 2, 3 по существу максимизирует скорость попадания в кэш ЦП VPP, тем самым значительно улучшая производительность.

Пространство имен изначально было предложено TNSR, коммерческим продуктом VPP Netgate. Рекомендуется запускать VPP и его плоскость управления в отдельном сетевом пространстве имен Linux. Сетевое пространство имен логически представляет собой еще одну копию сетевого стека со своей собственной маршрутизацией, правилами брандмауэра и сетевыми устройствами. В этой статье также используется программа FRR/bgpd для запуска в пространстве имен с именем dataplane для проверки основных функций подключаемого модуля lcpng.

Базовая конфигурация и сеть

1. Базовая сеть

Чтобы проверить среду, используйте виртуальные машины vmware для создания двух систем ubuntu20.4.3 lts, ​​а затем загрузите последние коды vpp и frr для установки и развертывания в системе ubuntu. Сетевой интерфейс VMware использует сетевую карту e1000.

2. Конфигурация среды

Настройка среды разделена на три этапа: 1. Виртуальная машина создает пространство имен с именем dataplane. Здесь мы также обращаемся к руководству по lcpng. Вам не нужно создавать его, если в нем нет необходимости. При создании lcp create в vpp не следует указывать netns (в данной статье это не проверялось). 2. Настройте среду frr bgpd. 3. Настройте впп.

2.1 Создайте пространство имен с именем dataplane
Язык кода:javascript
копировать
ip netns add dataplane

Здесь следует отметить, что если вам нужно использовать пространство имен, вы должны создать пространство имен в системе Linux до создания lcp, иначе конфигурация не будет успешной, и будет сообщено об ошибке, что создание интерфейса Tap не удалось.

2.2 Настроить программу frr

Чтобы установить frr в системе Ubuntu20.4, вы можете обратиться к официальной документации frr по установке. В этой статье не объясняется это, а в основном рассказывается о настройке. Следующие настройки необходимы для запуска frr bgpd в пространстве имен. Официальный документ frr предоставляет два метода. В этой статье настраивается первый простой метод.

Язык кода:javascript
копировать
#Включаем службу ospfd
bgpd=yes
#Устанавливаем файл конфигурации ospfd
bgpd_options="   -A 127.0.0.1 -f /etc/frr/bgpd.conf"
#Установить frr для запуска в пространстве имен,
watchfrr_options="--netns=dataplane"

Чтобы установить пространство имен для frr, обратитесь к руководству пользователя frr. Ссылка следующая. https://docs.frrouting.org/en/latest/setup.html

Конфигурация виртуальной машины vpp1 frr следующая:

Язык кода:javascript
копировать
#Базовая конфигурация
learning_vpp1# configure terminal 
learning_vpp1(config)# router bgp  6632 
learning_vpp1(config-router)# bgp router-id 200.1.1.1
learning_vpp1(config-router)# neighbor 200.1.1.2 remote-as 6632
#публиковать подсеть
learning_vpp1(config-router)# network 201.1.1.0/24

Конфигурация FRR/BGP устройства vpp2

Язык кода:javascript
копировать
learning_vpp2# configure terminal   
learning_vpp2(config)# router bgp 6632
learning_vpp2(config-router)# bgp router-id 200.1.1.2
learning_vpp2(config-router)#  neighbor 200.1.1.1 remote-as 6632
learning_vpp2(config-router)# network 202.1.1.0/24
2.3 конфигурация vpp

Конфигурация компиляции lcpng заключается в создании гиперссылки в каталоге плагинов vpp. При компиляции vpp программа lcpng будет скомпилирована автоматически.

Язык кода:javascript
копировать
mkdir ~/src
cd ~/src
git clone https://github.com/pimvanpelt/lcpng.git
ln -s ~src/lcpng ~/src/vpp/src/plugins/lcpng

Файл конфигурации запуска vpp start.conf напрямую ссылается на библиотеку подключаемых модулей lcpng с открытым исходным кодом для настроек.

Язык кода:javascript
копировать
Плагин #lcpng не загружается по умолчанию, и для его загрузки требуется руководство вручную.
plugins {
  path ~/src/vpp/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins
  plugin lcpng_if_plugin.so { enable }#Включить плагин lcpng
  plugin lcpng_nl_plugin.so { enable }
  plugin linux_cp_plugin.so { disable }#Закрыть исходный Linux плагин cp
}
#Устанавливаем информацию для журнала
logging {
   default-log-level info
   default-syslog-log-level crit
   ## Set per-class configuration
   class linux-cp/if { rate-limit 10000 level debug syslog-level debug }
   class linux-cp/nl { rate-limit 10000 level debug syslog-level debug }
}
#Настроить lcpng
lcpng {
  default netns dataplane #Установим пространство имен по умолчанию
  lcp-sync #Разрешить автоматическую синхронизацию информации ядра vppиlinux
  lcp-auto-subint #Разрешить vpplinux Автоматическая синхронизация создания и удаления субинтерфейса
}

Базовая конфигурация виртуальной машины vpp1 и конфигурация vpp2 здесь опущены.

Язык кода:javascript
копировать
Конфигурация #vpp следующая:
set interface state GigabitEthernet2/2/0 up
set interface ip address GigabitEthernet2/2/0 200.1.1.1/24

set interface state GigabitEthernet2/3/0 up
set interface ip address GigabitEthernet2/3/0 201.1.1.1/24
#Создание интерфейса синхронизации vppиlinux По умолчанию интерфейс ge220 будет сгенерирован в пространстве имен ядра после создания.
lcp create 1 host-if ge220 netns dataplane

Запрос lcp создать информацию о создании

Язык кода:javascript
копировать
DBGvpp# show lcp
lcp default netns dataplane
lcp lcp-auto-subint on
lcp lcp-sync on
itf-pair: [0] GigabitEthernet2/2/0 tap1 ge220 21 type tap netns dataplane

Добавьте интерфейс GigabitEthernet2/3/0 в пространство имен плоскости данных.

Язык кода:javascript
копировать
ip link set ens36 netns dataplane

Запросите информацию об интерфейсе пространства имен следующим образом:

Язык кода:javascript
копировать
root@learningvpp1:/home/jinsh# ip netns exec dataplane ifconfig
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 201.1.1.2  netmask 255.255.255.0  broadcast 201.1.1.255
        inet6 fe80::20c:29ff:fede:afe1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:de:af:e1  txqueuelen 1000  (Ethernet)
        RX packets 386  bytes 122418 (122.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 374  bytes 116660 (116.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ge220: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 200.1.1.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::20c:29ff:fede:afcd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:de:af:cd  txqueuelen 1000  (Ethernet)
        RX packets 307  bytes 23285 (23.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 370  bytes 26033 (26.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Возникшие проблемы

1. Привязке сетевой карты igb_uio не удалось отправлять и получать сообщения.

Несколько дней назад некоторые студенты также столкнулись с этой проблемой в группе vpp. Когда сетевая карта была привязана к igb_uio, в dmesg было напечатано сообщение «Маска PCI INTX не поддерживается», что приводило к сбою работы сетевой карты. Эта проблема является известной проблемой dpdk. Существует соответствующий файл исправления, но он не включен в библиотеку dpdk-kmod. Конкретные модификации патча следующие:

Язык кода:javascript
копировать
#Вы можете проверить ссылку: http://mails.dpdk.org/archives/dev/2016-March/036094.html.
diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
index d1ca26e..c46a00f 100644
--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c
@@ -505,14 +505,11 @@  igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
         }
         /* fall back to INTX */
     case RTE_INTR_MODE_LEGACY:
-        if (pci_intx_mask_supported(dev)) {
-            dev_dbg(&dev->dev, "using INTX");
-            udev->info.irq_flags = IRQF_SHARED;
-            udev->info.irq = dev->irq;
-            udev->mode = RTE_INTR_MODE_LEGACY;
-            break;
-        }
-        dev_notice(&dev->dev, "PCI INTX mask not supported\n");
+        dev_dbg(&dev->dev, "using INTX");
+        udev->info.irq_flags = IRQF_SHARED;
+        udev->info.irq = dev->irq;
+        udev->mode = RTE_INTR_MODE_LEGACY;
+        break;
         /* fall back to no IRQ */
     case RTE_INTR_MODE_NONE:
         udev->mode = RTE_INTR_MODE_NONE;

Кроме того, некоторые люди в Интернете предположили, что изменение типа драйвера сетевой карты с e1000 на vmxnet3 может решить эту проблему. Производительность vmxnet3 лучше, чем у e1000. Возможно, в комплект операционной системы не входит драйвер vmxnet3, и вам необходимо установить vmware-tools вручную. Конкретные условия тестирования производительности можно найти по ссылке: https://www.yisu.com/zixun/72226.html.

Рекомендуется использовать vmxnet3. E1000 — это гигабитная сетевая карта, а VMXNET3 — сетевая карта 10G; Производительность E1000 относительно низкая, а производительность VMXNET3 относительно высокая; VMXNET3 поддерживает механизм разгрузки TCP/IP, но E1000 его не поддерживает; VMXNET3 может напрямую взаимодействовать с vmkernel и выполнять внутреннюю обработку данных;

2. При запуске ошибка api_segment_config: группа vpp не существует

Причина. В файле конфигурации по умолчанию указано использование группы пользователей vpp, и группу пользователей vpp необходимо добавить вручную.

Язык кода:javascript
копировать
groupadd -f -r vpp
3. Интерфейс создания lcp сообщает об ошибке и возвращает -12.

Указывает, что создание интерфейса Tap не удалось. В файле конфигурации vpp по умолчанию установлена ​​плоскость данных netns. В то время плоскость данных не была создана в системе Linux. После создания вручную lcp был успешно добавлен.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose