Некоторое время назад приятель поделился временным плагином 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 — это временный плагин, скопированный из плагина 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. , а изоляция процессора и последовательный порт установлены. Информация и т. д.
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.
Чтобы проверить среду, используйте виртуальные машины vmware для создания двух систем ubuntu20.4.3 lts, а затем загрузите последние коды vpp и frr для установки и развертывания в системе ubuntu. Сетевой интерфейс VMware использует сетевую карту e1000.
Настройка среды разделена на три этапа: 1. Виртуальная машина создает пространство имен с именем dataplane. Здесь мы также обращаемся к руководству по lcpng. Вам не нужно создавать его, если в нем нет необходимости. При создании lcp create в vpp не следует указывать netns (в данной статье это не проверялось). 2. Настройте среду frr bgpd. 3. Настройте впп.
ip netns add dataplane
Здесь следует отметить, что если вам нужно использовать пространство имен, вы должны создать пространство имен в системе Linux до создания lcp, иначе конфигурация не будет успешной, и будет сообщено об ошибке, что создание интерфейса Tap не удалось.
Чтобы установить frr в системе Ubuntu20.4, вы можете обратиться к официальной документации frr по установке. В этой статье не объясняется это, а в основном рассказывается о настройке. Следующие настройки необходимы для запуска frr bgpd в пространстве имен. Официальный документ frr предоставляет два метода. В этой статье настраивается первый простой метод.
#Включаем службу 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 следующая:
#Базовая конфигурация
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
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
Конфигурация компиляции lcpng заключается в создании гиперссылки в каталоге плагинов vpp. При компиляции vpp программа lcpng будет скомпилирована автоматически.
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 с открытым исходным кодом для настроек.
Плагин #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 здесь опущены.
Конфигурация #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 создать информацию о создании
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 в пространство имен плоскости данных.
ip link set ens36 netns dataplane
Запросите информацию об интерфейсе пространства имен следующим образом:
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
Несколько дней назад некоторые студенты также столкнулись с этой проблемой в группе vpp. Когда сетевая карта была привязана к igb_uio, в dmesg было напечатано сообщение «Маска PCI INTX не поддерживается», что приводило к сбою работы сетевой карты. Эта проблема является известной проблемой dpdk. Существует соответствующий файл исправления, но он не включен в библиотеку dpdk-kmod. Конкретные модификации патча следующие:
#Вы можете проверить ссылку: 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 и выполнять внутреннюю обработку данных;
Причина. В файле конфигурации по умолчанию указано использование группы пользователей vpp, и группу пользователей vpp необходимо добавить вручную.
groupadd -f -r vpp
Указывает, что создание интерфейса Tap не удалось. В файле конфигурации vpp по умолчанию установлена плоскость данных netns. В то время плоскость данных не была создана в системе Linux. После создания вручную lcp был успешно добавлен.