[Перевод] OvS, DPDK и Intel HT: 12-кратное ускорение виртуального коммутатора
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 доступны в следующих репозиториях:
- Red Hat OpenStack Platform
- Ubuntu
- Mirantis OpenStack
- Open Platform for NFV
Обычный Open vSwitch можно загрузить на openvswitch.org, на GitHub, его можно найти и в дистрибутивах Linux.
Итоги и дополнительные материалы
Мы представили краткий обзор OvS-DPDK — виртуального коммутатора, который отличается высокой производительностью и надёжностью. Интеграция с DPDK позволяет значительно ускорить обычный Open vSwitch. Если вы хотите больше узнать об OvS, вот список полезных материалов на английском.
Руководства для пользователей:
- Using OvS with DPDK for inter-VM NFV applications
- Using OvS with DPDK on Ubuntu
Руководства для разработчиков:
- OvS with DPDK installation guide
- OvS with DPDK advanced performance tuning guide
Статьи:
- 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:
- OvS with DPDK in OvS 2.5.0
- OvS with DPDK in OvS 2.4.0
Материалы университета INB:
- Open vSwitch with DPDK Architectural Deep Dive
- DPDK Open vSwitch: Accelerating the Path to the Guest
Техническая документация:
- OvS with DPDK enables SDN and NFV transformation