Как подключить два докер-контейнера к openvswitch + DPDK

Я пытаюсь проверить пропускную способность между двумя контейнерами докеров, используя Iperf3 (любое приложение для проверки пропускной способности), подключенное к OVS (openvswitch) и DPDK на ubuntu 18.04 (рабочая станция VMWare). Цель этого - сравнить производительность OVS-DPDK и ядра Linux в некоторых сценариях.

Я не могу найти подходящего решения, в котором объясняется, как подключить OVS + DPDK к контейнерам докеров, чтобы контейнеры могли передавать друг другу трафик TCP / UDP.

Буду признателен за вашу помощь в объяснении, как соединить два контейнера докеров с помощью OVS + DPDK. Конфигурация, которая должна быть выполнена в контейнерах докеров, и те, которые должны быть выполнены в ОС хоста.

Кстати, у меня нет движения извне.

Спасибо

Изменить

  • Версия DPDK - 20.11.0
  • Версия OVS - 2.15.90
  • Iperf3

Вот шаги, которые я предпринимаю:

  1. Я устанавливаю dpdk с помощью apt: sudo apt install openvswitch-switch-dpdk

  2. установите альтернативу как: sudo update-alternatives --set OvS-vswitchd /usr/lib/openvswitch-switch -dpdk/OvS-vswitchd-dpdk

  3. Выделите огромные страницы и обновите личинку.

  4. монтировать огромные страницы

  5. привязать сетевой адаптер к DPDK: sudo dpdk-devbind --bind=vfio-pci ens33. Хотя мне этот шаг не нужен, потому что у меня нет трафика извне, если я не привяжу свой сетевой адаптер, sudo service openvswitch-switch restart выйдет из строя.

  6. Создаю мост: ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

  7. Я создаю два порта для своих контейнеров: ovs-vsctl add-port br0 client -- set Interface client type=dpdk options:dpdk-devargs=<binded_nic_pci_addr> и ovs-vsctl add-port br0 server -- set Interface server type=dpdk options:dpdk-devargs=<binded_nic_pci_addr>. (номер порта сервера: 1, номер порта клиента: 2)

  8. Открытый двунаправленный поток между портами:

    1. sudo ovs-ofctl del-flows br0
    2. sudo ovs-ofctl add-flow br0 in_port=1,action=output:2
    3. ovs-ofctl add-flow br0 in_port=2,action=output:1

После шага 8 я не знаю, как подключить мои докер-контейнеры iperf3 для использования этих портов. Я ценю вашу помощь в том, что вы дали мне знать, как подключать контейнеры к портам и тестировать сеть.

Изменить 2

Основываясь на ответе Vipin, эти шаги не будут работать с учетом моих требований.


person Mohammad Siavashi    schedule 25.04.2021    source источник
comment
@MohammaSiavashi, содержание вопроса сбивает с толку, потому что выглядит как if the intention is to use OVS without DPDK, why are using OVS-DPDK? but if the intention is to use OVS-DPDK you should be using DPDK-iperf. Отсюда и реальный вопрос для достижения максимальной производительности I would like to use DPDK-OVS as virtual switch between 2 VM, but I am having difficulty in allowing traffic to Kernel.   -  person Vipin Varghese    schedule 26.04.2021
comment
@VipinVarghese Спасибо за подсказку. Я хочу использовать Iperf3 с ovs + dpdk для проверки пропускной способности между двумя контейнерами докеров. Я имею в виду запуск двух контейнеров Iperf3, один как сервер, а другой как клиент, и соедините эти два контейнера с помощью ovs + dpdk. Я новичок в этой области и пока не могу найти рабочего решения. Не могли бы вы поделиться своим решением? Спасибо   -  person Mohammad Siavashi    schedule 26.04.2021
comment
пожалуйста, поделитесь версией DPDK, версией OVS, конфигурацией для OVS, портами внутри Dockers и правилами ovs.   -  person Vipin Varghese    schedule 26.04.2021
comment
@VipinVarghese Я добавил детали в раздел редактирования вопроса. Пожалуйста, проверьте. Спасибо.   -  person Mohammad Siavashi    schedule 26.04.2021
comment
@VipinVarghese Кстати, если есть лучший способ, которым мне не нужно связывать свою сетевую карту, я также признателен за то, чтобы поделиться им. Спасибо   -  person Mohammad Siavashi    schedule 26.04.2021
comment
Найдите ответ на свой вопрос. Если вы сочтете это полезным, примите и проголосуйте.   -  person Vipin Varghese    schedule 27.04.2021
comment
@VipinVarghese Спасибо, конечно, сделаю. Но не могли бы вы добавить необходимую мне конфигурацию в контейнеры? Это может быть большим подспорьем.   -  person Mohammad Siavashi    schedule 27.04.2021
comment
поскольку вы упомянули, что хотите запустить iperf3, вам придется перенаправить пакет в интерфейс ядра. Я уже поделился ответом. Я не могу найти никаких ошибок или журналов, поскольку вы не упомянули то же самое в своем обновлении вопроса. Я могу сделать себя доступным для быстрой синхронизации по телефону. буду ждать тебя.   -  person Vipin Varghese    schedule 04.05.2021
comment
@VipinVarghese Спасибо за обновление, я все еще застрял в проблеме. При использовании TAP будет задействовано ядро, которое мне нужно обойти. Какую альтернативу iperf3 я могу использовать для этой цели?   -  person Mohammad Siavashi    schedule 05.05.2021
comment
@VipinVarghese Я создал комнату с названием OVS-DPDK. Возьмем там разговор. Спасибо. chat.stackoverflow.com/rooms/231963/ovs-dpdk   -  person Mohammad Siavashi    schedule 05.05.2021
comment
@MohamamdSiavashi, спасибо, что зашли в чат и позволили мне прояснить для вас вещи. Как уже говорилось, редактирование Based on Vipin's answer these steps won't work considering my requirements. является недоразумением. Разъяснения понятны, как запустить iperf3 (сокеты ядра) с DPDK-OVS. Пожалуйста, примите и проголосуйте за закрытие текущего тикета   -  person Vipin Varghese    schedule 05.05.2021
comment
@MohammadSivashi скромная просьба, основанная на обсуждении в чате, я обновил беседу, чтобы прояснить моменты. Просим вас открыть новый вопрос для работы без OVS-DPDK отдельно. Пожалуйста, примите и закройте текущий вопрос.   -  person Vipin Varghese    schedule 05.05.2021


Ответы (1)


[РЕДАКТИРОВАТЬ: обновите, чтобы отразить только использование OVS-DPDK и iperf3 в контейнере]

Есть несколько способов подключить 2 докера, чтобы напрямую общаться друг с другом, используя для запуска iperf3.

  1. Виртуальный интерфейс типа TAP-1 | MAC-VETH-1 из Docker-1 подключен к TAP-2 | MAC-VETH-2 через Linux Bridge.
  2. Виртуальный порт-1 (TAP | memif) от OVS-DPDK к Docker-1 и виртуальный порт-2 (tap | memif) к Docker-2 через DPDK-OVS

Для сценария 2 нужно добавить TAP-интерфейс в OVS. поскольку конечное приложение iperf3 использует стек ядра для завершения TCP | UDP. Для достижения результата можно использовать следующие настройки (измененные на основе версии OVS-DPDK).

sudo ./utilities/ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
sudo ./utilities/ovs-vsctl add-port br0 myeth0 -- set Interface myeth0 type=dpdk options:dpdk-devargs=net_tap0,iface=tap0
sudo ./utilities/ovs-vsctl add-port br0 myeth1 -- set Interface myeth1 type=dpdk options:dpdk-devargs=net_tap1,iface=tap1
sudo ./utilities/ovs-ofctl add-flow br0 in_port=1,action=output:2
sudo ./utilities/ovs-ofctl add-flow br0 in_port=2,action=output:1

Примечание:

  1. как упоминалось в комментариях, я не поддерживаю этот подход, поскольку TAP PMD лишает возможности обхода ядра (Docker1 == ›Kenrel TAP-1 ==› DPDK PMD == ›OVS ==› DPDK PMD == ›ядро TAP2 == ›Docker2)
  2. Если нужно просто проверить производительность iperf3, используйте DPDK-iperf3, например проект github, который такой же.
  3. Причина для рекомендации TAP PMD по KNI PMD заключается в использовании двух ядер ЦП (поток DPDK и поток ядра), а KNI примерно на уровне 4 Гбит / с с iperf3

[EDIT-1] на основе беседы https://chat.stackoverflow.com/rooms/231963/ovs-dpdk, @MohammadSiavashi

  1. Iperf3 требует сетевого стека ядра или пользовательского пространства.
  2. В докере Linux для этого можно использовать стек ядра.
  3. DPDK-OVS будет обходить только мост ядра Linux.
  4. Следовательно, самая простая альтернатива - использовать интерфейс TAP для обратной инъекции в ядро ​​для докеров.
  5. Существует альтернатива (как указано в ответе) для сетевого стека пользовательского пространства и iperf3 исключительно на DPDK.
  6. OVS-DPDK не является обязательным для текущего тестирования, потому что можно запустить testpmd, l2fwd, skeleton вместо запуска OVS-DPDK.
  7. всегда можно использовать сетевой стек пользовательского пространства вместо сетевого стека ядра.

Текущее соглашение:

  • Докеры работают на хосте и используют стек ядра, разделенный по пространству имен и группам.
  • С текущим пониманием @MohammadSiavashi попробует TAP PMD based OVS-DPDK и alternate to userspace iperf3.
person Vipin Varghese    schedule 27.04.2021
comment
Спасибо за хорошее разъяснение. Что мне нужно, так это сценарий 5. У меня остались два вопроса. 1. Нужно ли привязать сетевую карту на шаге 5? (Если я этого не сделаю, я не смогу перезагрузить демон) 2. Вы создаете два порта для контейнеров, но как я могу заставить контейнеры использовать эти порты? Если вы сможете ответить на эти вопросы, это будет для меня большим подспорьем и для будущих ссылок. Благодарность - person Mohammad Siavashi; 27.04.2021
comment
Спасибо за включение вопроса в ответ, который очень помогает. Кстати, вопрос основан на контейнерах, а не на виртуальных машинах, но детали, которыми вы поделились, очень помогают, однако, если бы у вас были дополнительные инструкции, основанные на контейнерах, это было бы потрясающе, поскольку AFAIK эти детали не могли быть найдены где-либо еще для новичков. Большое спасибо. - person Mohammad Siavashi; 27.04.2021
comment
@MohammadSiavashi ах, хорошо, рад слышать, что я немного помог. Спасибо - person Vipin Varghese; 27.04.2021
comment
Не могли бы вы добавить инструкции для контейнеров докеров, чтобы я мог принять это как лучший ответ? - person Mohammad Siavashi; 28.04.2021
comment
@MohammadSiavashi Я думаю, вы спрашиваете, как добавить кран в качестве интерфейса к существующему мосту. Он должен быть в документации OVS, если нет, я скоро добавлю это. - person Vipin Varghese; 28.04.2021
comment
Пожалуйста, проверьте отредактированный вопрос, чтобы четко понять мое требование. Особенно смелая часть. Я также предложил награду. Спасибо. - person Mohammad Siavashi; 30.04.2021
comment
Цель этого - сравнить производительность OVS-DPDK и ядра Linux в некоторых сценариях, поэтому я предполагаю, что TAP не поможет в этом случае. - person Mohammad Siavashi; 30.04.2021
comment
как поделились, пожалуйста, изучите memif PMD (мастер memif в OVS и клиент memif в докере) - person Vipin Varghese; 30.04.2021
comment
Спасибо. Вы получили награду. Я выберу лучший ответ после того, как успешно протестирую решение TAP pmd, вероятно, сегодня. Спасибо - person Mohammad Siavashi; 06.05.2021
comment
При настройке TAP pmd с помощью команд в ответе я заметил значительное падение битрейта в iperf3. Скажем, от 16 Гбит / сек до 12 Гбит / сек. Это нормально? не должно ли оно подняться выше? - person Mohammad Siavashi; 06.05.2021
comment
TAP будет использовать ядра ядра, не могли бы вы убедиться, что ядро ​​TAP закреплено на ядрах независимо от DPDK-OVS или других ОС. - person Vipin Varghese; 06.05.2021
comment
@MohammadSiavashi благодарит за щедрость, моя реальная забота о закрытии заявки - помочь другим участникам сообщества получить ответы, а также помочь вам поднять следующий вопрос, относящийся к конкретному варианту использования. - person Vipin Varghese; 06.05.2021
comment
Я потратил время на тестирование. Используя ifconfig, я заметил, что почти никакой трафик не проходит через TAP0 и TAP1, в то время как интерфейсы docker veth передают трафик. Какие действия мне нужно предпринять с контейнерами? - person Mohammad Siavashi; 11.05.2021
comment
Отладка @MohammadSiavashi в реальном времени намного проще понять, в чем проблема. Я доступен в скайпе, на тусовке и увеличении. пришли мне приглашение - person Vipin Varghese; 11.05.2021
comment
Могу я узнать ваш Skype Id? - person Mohammad Siavashi; 26.05.2021
comment
vipinpv85. Что твое? - person Vipin Varghese; 26.05.2021