Сегодня расскажем об Open vSwitch, интегрированном с Data Plane Development Kit (OvS-DPDK). Это – высокопроизводительный виртуальный многоуровневый коммутатор с открытым исходным кодом, доступный по лицензии Apache 2.0. Интеграция OvS с DPDK позволяет значительно повысить скорость обработки сетевых пакетов.
Open vSwitch нашёл практическое применение во множестве проектов. Коммутатор поддерживает протокол OpenFlow, подходит для работы в программно-определяемых сетях (Software Defined Network, SDN). OvS можно конфигурировать с помощью протокола управления OVSDB.
Обычный Open vSwitch занимается передачей сетевых пакетов через пространство ядра Linux (это показано на рисунке ниже). В канале передачи данных ядра, «быстрый путь» («fastpath») обработки данных реализуется благодаря простой таблице потоков, содержащей правила пересылки и обработки принятых пакетов. Если первый пакет в потоке не соответствует ни одной из существующих записей в таблице ядра, его отправляют для обработки демону, который работает в пространстве пользователя. Это – так называемый «медленный путь» («slow path»). После того, как в пространстве пользователя этот пакет будет обработан, демон обновляет таблицу потоков в пространстве ядра, в результате следующие пакеты в потоке могут пройти по «быстрому пути», их не нужно передавать в пространство пользователя. Следуя этому подходу, обычный Open vSwitch позволяет избавиться от ресурсоёмкой операции переключения контекста между пространствами ядра и пользователя для большого процента полученных пакетов. Однако, достижимая пропускная способность ограничена полосой пропускания сетевого стека Linux, который не подходит для вариантов использования, в которых необходима высокая скорость обработки пакетов. Например – в телекоммуникационных компаниях.
DPDK – это набор библиотек, работающих в пространстве пользователя Linux, которые позволяют создавать высокопроизводительные приложения для обработки сетевых пакетов. Фактически, он предлагает набор драйверов опрашиваемого режима (Poll Mode Driver, PMD) для различных физических и виртуальных устройств, которые позволяют осуществлять прямую передачу пакетов между пространством пользователя и сетевым интерфейсом, минуя сетевой стек ядра. Это даёт значительный рост производительности по сравнению с передачей данных через ядро. Подобное происходит благодаря избавлению от необходимости обработки прерываний и от необходимости пользоваться сетевым стеком ядра. При интеграции OvS с DPDK, «быстрый путь» коммутации проходит через пространство пользователя, а «путь первого пакета» — это тот же путь в пространстве пользователя, по которому проходят пакеты в обычном OvS, когда «быстрый путь» пролегает через ядро.
Вот общая схема интеграции DPDK с OvS:
Интеграция плоскости передачи данных DPDK с обычным Open vSwitch
На рисунке ниже показана высокоуровневая архитектура OvS-DPDK. Порты коммутации OvS представлены сетевыми устройствами (netdevs). Netdev-dpdk – это сетевое устройство, пользующееся возможностями DPDK, оно осуществляет обмен сетевыми данными через три различных интерфейса. Первый – физический интерфейс (работа с ним осуществляется с помощью библиотеки librte_eth в DPDK), далее – два виртуальных интерфейса (librte_vhost и librte_ring). Это – интерфейсы с физическими и виртуальными устройствами, подключенными к виртуальному коммутатору.
Высокоуровневая архитектура Open vSwitch с DPDK
Другие архитектурные уровни OvS дают дополнительную функциональность и организацию взаимодействия, например, с SDN-контроллером. Dpif-netdev предоставляет услуги передачи данных в пространстве пользователя, ofproto – это библиотека OvS, которая реализует коммутатор стандарта OpenFlow. Она взаимодействует с OpenFlow-контроллерами по сети и с программным или аппаратным обеспечением коммутатора через провайдера ofproto. Сервер ovsdb поддерживает актуальную информацию в таблицах коммутации для данного экземпляра OvS и взаимодействует с SDN-контроллером.
Подробности об архитектуре OvS можно найти на openvswitch.org.
Теперь поговорим о таблицах коммутации OvS-DPDK.
Пакет, поступающий в OvS-DPDK с физического или виртуального интерфейса, получает уникальный идентификатор, или хэш, основанный на полях его заголовка, который затем сравнивают с записями, которые имеются в трёх основных таблицах коммутации. Это – таблица точного совпадения (Exact Match Cache, EMC), таблица классификатора маршрута передачи данных (Data Path Classifier, dpcls), и таблица классификатора ofproto (Ofrproto Classifier).
Идентификатор пакета сравнивают с cодержимым таблиц, в том порядке, в котором они здесь приведены, до тех пор, пока не будет найдено совпадение. Если совпадение найдено, будет выполнено действие, на которое указывает запись в таблице, содержащая правило обработки для пакета. После завершения всех действий над пакетом, он покидает коммутатор. Этот процесс показан на рисунке ниже.
Иерархия таблиц коммутации в Open vSwitch с DPDK
У этих трёх таблиц разные характеристики пропускной способности и задержек. Таблица EMC предлагает самую быструю обработку для ограниченного числа записей. Идентификатор пакета должен точно совпасть с записью в таблице. Среди сравниваемых данных имеются точный IP-адрес источника и порт, адрес и порт назначения, протокол. Совпадение всего этого с записью в EMC даст самую высокую скорость обработки. В противном случае совпадение найдено не будет и начнётся поиск в таблице dpcls.
В dpcls имеется гораздо больше записей (они организованы во множестве подтаблиц), она поддерживает сравнение идентификаторов с использованием шаблонов. Например, с её помощью можно обработать пакеты, для которых в ней задан целевой IP-адрес и порт, но при этом разрешён любой источник такого пакета. При использовании dpcls приходится обслуживать гораздо больший набор записей таблиц, в результате, если решение об обработке пакета принимается на основе этой таблицы, можно достичь примерно половины пропускной способности EMC. Если в dpcls найдено подходящее правило, оно записывается в EMC, в результате, следующие пакеты с тем же идентификатором могут быть обработаны на более высокой скорости.
Если же правило для идентификатора пакета не найдено и в dpcls, начинается проверка по таблице классификатора ofproto, в результате контроллер OpenFlow может решить, как именно обрабатывать пакет. Это – самый медленный путь прохождения данных, он более чем в 10 раз медленнее, чем в случае, когда совпадение найдено в таблице EMC. Когда совпадение находят в классификаторе ofproto, это ведёт к созданию новых записей в более быстрых таблицах коммутации, в результате последующие пакеты того же потока можно обработать быстрее.
В тот момент, когда был написан этот материал, в ветке master проекта OvS-DPDK были доступны следующие высокоуровневые возможности:
На рисунке ниже даны свежие результаты тестирования производительности обычного OvS и OvS-DPDK. Здесь показана пропускная способность (пакетов в секунду) для сценария использования, когда данные поступают в OvS с физического порта, обрабатываются и передаются на другой физический порт (Phy-OvS-Phy). Можно видеть, что OvS-DPDK работает примерно в 10 раз быстрее, чем обычный OvS. При этом, если на сервере включен режим Intel Hyper-Threading, OvS-DPDK оказывается примерно в 12 раз быстрее обычного OvS. На диаграмме этот вариант помечен как «1С2T», что означает одно физическое ядро с двумя потоками.
Сравнение производительности обычного OvS и OvS-DPDK
Похожие результаты получены в более сложном сценарии использования: (Phy-OvS-VM-OvS-Phy), когда данные с физического интерфейса поступают в OvS, потом идут в виртуальную машину, дальше – возвращаются в OvS, и, в итоге, снова передаются на физический интерфейс. А именно, здесь OvS-DPDK позволяет достичь примерно 9-кратного роста производительности.
Сведения о конфигурации аппаратного и программного обеспечения, на котором были проведены испытания, результаты которых упомянуты выше, можно найти в этом отчёте. Там же есть и данные по испытаниям для других сценариев использования.
OvS-DPDK можно найти в upstream-ветви репозитория openvswitch.org, он имеется в различных дистрибутивах Linux. Последний стабильный релиз – OvS 2.6. Он выпущен в сентябре 2016-го года. Подобные релизы выходят раз в полгода.
Обратите внимание на то, что вы можете загрузить ZIP-файл с веткой master OVS, или ветвь версии 2.6. Так же имеются инструкции по установке для ветки master и для версии 2.6. Пакеты OvS с SPDK доступны в следующих репозиториях:
Обычный Open vSwitch можно загрузить на openvswitch.org, на GitHub, его можно найти и в дистрибутивах Linux.
Мы представили краткий обзор OvS-DPDK – виртуального коммутатора, который отличается высокой производительностью и надёжностью. Интеграция с DPDK позволяет значительно ускорить обычный Open vSwitch. Если вы хотите больше узнать об OvS, вот список полезных материалов на английском.
Руководства для пользователей:
Руководства для разработчиков:
Статьи:
Вебинары по стабильным релизам OvS с DPDK:
Материалы университета INB:
Техническая документация:
Open vSwitch нашёл практическое применение во множестве проектов. Коммутатор поддерживает протокол OpenFlow, подходит для работы в программно-определяемых сетях (Software Defined Network, SDN). OvS можно конфигурировать с помощью протокола управления OVSDB.
Высокоуровневая архитектура OvS-DPDK
Обычный Open vSwitch занимается передачей сетевых пакетов через пространство ядра Linux (это показано на рисунке ниже). В канале передачи данных ядра, «быстрый путь» («fastpath») обработки данных реализуется благодаря простой таблице потоков, содержащей правила пересылки и обработки принятых пакетов. Если первый пакет в потоке не соответствует ни одной из существующих записей в таблице ядра, его отправляют для обработки демону, который работает в пространстве пользователя. Это – так называемый «медленный путь» («slow path»). После того, как в пространстве пользователя этот пакет будет обработан, демон обновляет таблицу потоков в пространстве ядра, в результате следующие пакеты в потоке могут пройти по «быстрому пути», их не нужно передавать в пространство пользователя. Следуя этому подходу, обычный Open vSwitch позволяет избавиться от ресурсоёмкой операции переключения контекста между пространствами ядра и пользователя для большого процента полученных пакетов. Однако, достижимая пропускная способность ограничена полосой пропускания сетевого стека Linux, который не подходит для вариантов использования, в которых необходима высокая скорость обработки пакетов. Например – в телекоммуникационных компаниях.
DPDK – это набор библиотек, работающих в пространстве пользователя Linux, которые позволяют создавать высокопроизводительные приложения для обработки сетевых пакетов. Фактически, он предлагает набор драйверов опрашиваемого режима (Poll Mode Driver, PMD) для различных физических и виртуальных устройств, которые позволяют осуществлять прямую передачу пакетов между пространством пользователя и сетевым интерфейсом, минуя сетевой стек ядра. Это даёт значительный рост производительности по сравнению с передачей данных через ядро. Подобное происходит благодаря избавлению от необходимости обработки прерываний и от необходимости пользоваться сетевым стеком ядра. При интеграции OvS с DPDK, «быстрый путь» коммутации проходит через пространство пользователя, а «путь первого пакета» — это тот же путь в пространстве пользователя, по которому проходят пакеты в обычном OvS, когда «быстрый путь» пролегает через ядро.
Вот общая схема интеграции DPDK с OvS:
Интеграция плоскости передачи данных DPDK с обычным Open vSwitch
На рисунке ниже показана высокоуровневая архитектура OvS-DPDK. Порты коммутации OvS представлены сетевыми устройствами (netdevs). Netdev-dpdk – это сетевое устройство, пользующееся возможностями DPDK, оно осуществляет обмен сетевыми данными через три различных интерфейса. Первый – физический интерфейс (работа с ним осуществляется с помощью библиотеки librte_eth в DPDK), далее – два виртуальных интерфейса (librte_vhost и librte_ring). Это – интерфейсы с физическими и виртуальными устройствами, подключенными к виртуальному коммутатору.
Высокоуровневая архитектура Open vSwitch с DPDK
Другие архитектурные уровни OvS дают дополнительную функциональность и организацию взаимодействия, например, с SDN-контроллером. Dpif-netdev предоставляет услуги передачи данных в пространстве пользователя, ofproto – это библиотека OvS, которая реализует коммутатор стандарта OpenFlow. Она взаимодействует с OpenFlow-контроллерами по сети и с программным или аппаратным обеспечением коммутатора через провайдера ofproto. Сервер ovsdb поддерживает актуальную информацию в таблицах коммутации для данного экземпляра OvS и взаимодействует с SDN-контроллером.
Подробности об архитектуре OvS можно найти на openvswitch.org.
Теперь поговорим о таблицах коммутации OvS-DPDK.
Таблицы коммутации OvS-DPDK
Пакет, поступающий в OvS-DPDK с физического или виртуального интерфейса, получает уникальный идентификатор, или хэш, основанный на полях его заголовка, который затем сравнивают с записями, которые имеются в трёх основных таблицах коммутации. Это – таблица точного совпадения (Exact Match Cache, EMC), таблица классификатора маршрута передачи данных (Data Path Classifier, dpcls), и таблица классификатора ofproto (Ofrproto Classifier).
Идентификатор пакета сравнивают с cодержимым таблиц, в том порядке, в котором они здесь приведены, до тех пор, пока не будет найдено совпадение. Если совпадение найдено, будет выполнено действие, на которое указывает запись в таблице, содержащая правило обработки для пакета. После завершения всех действий над пакетом, он покидает коммутатор. Этот процесс показан на рисунке ниже.
Иерархия таблиц коммутации в Open vSwitch с DPDK
У этих трёх таблиц разные характеристики пропускной способности и задержек. Таблица EMC предлагает самую быструю обработку для ограниченного числа записей. Идентификатор пакета должен точно совпасть с записью в таблице. Среди сравниваемых данных имеются точный IP-адрес источника и порт, адрес и порт назначения, протокол. Совпадение всего этого с записью в EMC даст самую высокую скорость обработки. В противном случае совпадение найдено не будет и начнётся поиск в таблице dpcls.
В dpcls имеется гораздо больше записей (они организованы во множестве подтаблиц), она поддерживает сравнение идентификаторов с использованием шаблонов. Например, с её помощью можно обработать пакеты, для которых в ней задан целевой IP-адрес и порт, но при этом разрешён любой источник такого пакета. При использовании dpcls приходится обслуживать гораздо больший набор записей таблиц, в результате, если решение об обработке пакета принимается на основе этой таблицы, можно достичь примерно половины пропускной способности EMC. Если в dpcls найдено подходящее правило, оно записывается в EMC, в результате, следующие пакеты с тем же идентификатором могут быть обработаны на более высокой скорости.
Если же правило для идентификатора пакета не найдено и в dpcls, начинается проверка по таблице классификатора ofproto, в результате контроллер OpenFlow может решить, как именно обрабатывать пакет. Это – самый медленный путь прохождения данных, он более чем в 10 раз медленнее, чем в случае, когда совпадение найдено в таблице EMC. Когда совпадение находят в классификаторе ofproto, это ведёт к созданию новых записей в более быстрых таблицах коммутации, в результате последующие пакеты того же потока можно обработать быстрее.
О возможностях и производительности OvS-DPDK
В тот момент, когда был написан этот материал, в ветке master проекта OvS-DPDK были доступны следующие высокоуровневые возможности:
- Поддержка DPDK 16.07 (при выходе новых релизов DPDK обновляется и поддерживаемая OvS версия)
- Поддержка портов vHost-user.
- Поддержка восстановления соединения vHost.
- Поддержка нескольких очередей vHost.
- Встроенная поддержка туннелирования: VxLAN, GRE, Geneve
- Поддержка VLAN
- Поддержка MPLS
- Поддержка QOS-политик Ingress/egress
- Поддержка jumbo-кадров
- Отслеживание соединений
- Статистические сведения: данные DPDK vHost и расширенная статистика DPDK
- Отладка: поддержка DPDK pdump
- Агрегирование каналов
- Сведения о состоянии каналов
- Поддержка VFIO
- Обнаружение ODL/OpenStack портов DPDK
- Учёт особенностей NUMA при работе с портами vHost-user
На рисунке ниже даны свежие результаты тестирования производительности обычного OvS и OvS-DPDK. Здесь показана пропускная способность (пакетов в секунду) для сценария использования, когда данные поступают в OvS с физического порта, обрабатываются и передаются на другой физический порт (Phy-OvS-Phy). Можно видеть, что OvS-DPDK работает примерно в 10 раз быстрее, чем обычный OvS. При этом, если на сервере включен режим Intel Hyper-Threading, OvS-DPDK оказывается примерно в 12 раз быстрее обычного OvS. На диаграмме этот вариант помечен как «1С2T», что означает одно физическое ядро с двумя потоками.
Сравнение производительности обычного OvS и OvS-DPDK
Похожие результаты получены в более сложном сценарии использования: (Phy-OvS-VM-OvS-Phy), когда данные с физического интерфейса поступают в OvS, потом идут в виртуальную машину, дальше – возвращаются в OvS, и, в итоге, снова передаются на физический интерфейс. А именно, здесь OvS-DPDK позволяет достичь примерно 9-кратного роста производительности.
Сведения о конфигурации аппаратного и программного обеспечения, на котором были проведены испытания, результаты которых упомянуты выше, можно найти в этом отчёте. Там же есть и данные по испытаниям для других сценариев использования.
Где взять OvS-DPDK
OvS-DPDK можно найти в upstream-ветви репозитория openvswitch.org, он имеется в различных дистрибутивах Linux. Последний стабильный релиз – OvS 2.6. Он выпущен в сентябре 2016-го года. Подобные релизы выходят раз в полгода.
Обратите внимание на то, что вы можете загрузить ZIP-файл с веткой master OVS, или ветвь версии 2.6. Так же имеются инструкции по установке для ветки master и для версии 2.6. Пакеты OvS с SPDK доступны в следующих репозиториях:
Обычный Open vSwitch можно загрузить на openvswitch.org, на GitHub, его можно найти и в дистрибутивах Linux.
Итоги и дополнительные материалы
Мы представили краткий обзор OvS-DPDK – виртуального коммутатора, который отличается высокой производительностью и надёжностью. Интеграция с DPDK позволяет значительно ускорить обычный Open vSwitch. Если вы хотите больше узнать об OvS, вот список полезных материалов на английском.
Руководства для пользователей:
Руководства для разработчиков:
Статьи:
- Rate limiting configuration and usage for OvS with DPDK
- QoS configuration and usage for OvS with DPDK
- Configure vHost User multiqueue for OvS with DPDK
- vHost User NUMA awareness in OvS with DPDK
- DPDK Pdump in OvS with DPDK
- Enabling OvS with DPDK in OpenStack
- Jumbo Frames in Open vSwitch* with DPDK
- vHost User Client Mode in Open vSwitch* with DPDK
- OVS-DPDK Datapath Classifier
Вебинары по стабильным релизам OvS с DPDK:
Материалы университета INB:
- Open vSwitch with DPDK Architectural Deep Dive
- DPDK Open vSwitch: Accelerating the Path to the Guest
Техническая документация:
Поделиться с друзьями
erlyvideo
Это очень интересная тема, но если бы мне живой человек на пальцах человеским языком не объяснил бы, что такое DPDK и что такое SDN, то эта статья была бы просто птичьим языком.
rustler2000
Кстати, ты не смотрел, на dpdk можно ли mpeg ts процессить?
erlyvideo
можно конечно, но что ты хочешь добиться?
fortyseven
Посмотрите эту статью https://habrahabr.ru/company/selectel/blog/313150/