DPDK (Data Plane Development Kit)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:45, 11 декабря 2016.
DPDK / dpdk.org
DPDK logo.png
Разработчики: 6WIND, Intel
Постоянный выпуск: 16.07 / 28 July 2016 (2016-07-28)
Состояние разработки: Active
Написана на: C
Операционная система: FreeBSD, Linux
Тип ПО: Routing
Лицензия: BSD
Веб-сайт dpdk.org

DPDK (англ. Data Plane Development Kit) - это набор библиотек, драйверов контроллера сетевого интерфейса, предназначенный для быстрой пакетной обработки. Первый процессор, который поддерживался этим набором, был Intel архитектуры x86, а сейчас набор расширен до IBM Power 8, EZchip TILE-Gx and ARM. Запускается в основном в Linux. Они поддерживаются и сопровождаются под открытым исходным кодом лицензии BSD.[ссылка 1]

Обзор

Основной целью DPDK является создание простой, полную основу для быстрой обработки пакетов. Пользователи могут использовать код, чтобы понять некоторые из применяющихся методов, строить собственные решения на существующих прототипах или добавлять свои собственные стеки протоколов.

DPDK создает набор библиотек для конкретной аппаратной/программной среды путем создания Environment Abstraction Layer[примечание 1] (EAL). EAL предоставляет стандартный программируемый интерфейс для библиотек, аппаратные ускорители и другое аппаратное обеспечение и элементы операционных систем Linux и FreeBSD. Как только EAL создан для конкретной среды, разработчики подключаются к библиотеке для создания собственных приложений. Например, EAL предоставляет платформы для поддержки Linux, FreeBSD, Intel IA 32- or 64-bit or IBM Power8. EAL также предоставляет дополнительное сопровождение, например доступ к шине PCI, отладочные функции и функции трассировки.

DPDK включает в себя также примеры программ, являющихся лучшими решениями программной архитектуры, советы по проектированию дизайна и хранилищ данных, утилиты, повышающие производительность и советы, касающиеся низкой производительности общей сети.

DPDK осуществляет сборку моделей для пакетной обработке, где все ресурсы должны быть инициализированы и размещены прежде вызова приложений, работающих в качестве исполнительных устройств на логических ядрах. Модель не поддерживает планирования, а также все устройства, доступ к которым осуществляется голосованием. Основная причина отказа от использования прерываний - накладные расходы, отражающиеся на производительности.

Модель трубопровода также может быть использована для посылки пакетов между ядрами через кольца. Это позволяет вести работу поэтапно и может позволить более эффективно использовать код в ядрах.

Библиотеки

DPDK включает в себя библиотеки и оптимизированные NIC-драйверы для нижеследующего:

  • Менеджер очередей - реализует беззамочную очередь
  • Менеджер буфера - заранее размещает буферы фиксированного размера
  • Менеджер памяти - выделяет пулы объектов в памяти и гарантирует, что все они распределены одинаково по каналам памяти DRAM
  • Драйверы режима опроса - предназначены для работы без асинхронных уведомлений, уменьшая накладные расходы
  • Дополнительный набор библиотек - они являются помощниками в разработке обработки пакетов

Все библиотеки хранятся в dpdk/lib/librte_* directories

Эти библиотеки могут быть использованы для:

  • Приема и отправки пакетов в пределах минимального количества циклов процессора (обычно меньше 80)
  • Разработка алгоритмов быстрого захвата пакетов

Некоторые функции обработки пакетов были улучшены до сотен миллионов пакетов в секунду, используя 64-байтовые пакеты с PCIe NIC.

Существует несколько библиотек, необходимых для приложений, осуществляющих высокопроизводительную обработку пакетов:

Диспетчер памяти

Рис.1. Пример кучи и элементов в этой библиотеке

Назначение этой библиотеки в предоставлении функций, позволяющих управлять выделением памяти, и облегчающих портирование приложений. Она необходима приложениям, требующим функций, выделяющих память во время инициализации и не требует физического адреса для отдельных блоков памяти. Для выделения или освобождения данных во время выполнения следует использовать эту библиотеку. Если нужен конкретный блок памяти с известным физическим адресом, рекомендуется использовать дополнительную память. В этой библиотеке используются два типа структур данных:

  • куча - нужна для отслеживания свободного места в каждом сокете, а также для управления им. Существует одна куча на каждый узел NUMA, что позволяет нам выделять память потоком, опирающимся на этот узел. Хотя это и не гарантирует, что память будет использоваться в этом узле, это не хуже, чем схема, согласно которой память всегда выделяется в фиксированном или случайном узле.
  • malloc-элемент - основной элемент распределения и отслеживания свободного пространства внутри библиотеки. Используется в качестве общей структуры заголовка для различных блоков памяти в memzone тремя различными способами:
  1. В качестве заголовка на блоке свободной или выделенной памяти
  2. В качестве заголовка заполнения внутри блока памяти
  3. В качестве флага окончания memzone

Все они представлены на рисунке 1.

Менеджер пулов объектов в памяти

Пул памяти представляет собой аллокатор фиксированного размера. В DPDK он идентифицируется по имени и использует кольцо для хранения объектов. Также он предоставляет дополнительные возможности, например, кэш объектов и сопровождение выравнивания, чтобы гарантировать, что объекты заполнены для их распространения в одинаковой степени или на DRAM, или на DDR3 каналы.

Все размещения, которые требуют высокой производительности, следует использовать этот менеджер памяти. Например:

  • Библиотеке Mbuf
  • EAL, для регистрации службы
  • Любому приложению, которому необходимо выделить память под несколько объектов фиксированного размера, и они будут использоваться системой в дальнейшем

Ограничения по выравниванию памяти

В зависимости от конфигурации аппаратного обеспечения памяти производительность может быть значительно улучшена добавлением уникальной вставки между объектами. Цель состоит в том, чтобы гарантировать, что начало каждого объекта будет начинаться с нового канала и сектора памяти, чтобы все каналы были одинаково загружены. Это может быть осуществлено для пакетных буферов во время классификации потока. Обращение идет только к первым 64 байтам, поэтому производительность может быть улучшена путем распространения начального адреса объектов по разным каналам. Число секций на любом модуле памяти DIMM является числом независимых наборов DRAM-ов, к которым могут обратиться за информацией о ширине бита DIMM. Секции не могут быть доступны одновременно с того момента, как они обращаются к одинаковому пути. Физическое расположение чипов DRAM на модуле DIMM не обязательно зависит от числа секторов.

При запуске приложения опции командной строки EAL предоставляют возможность добавлять количество каналов памяти и секторов. Примеры выравнивания для различных DIMM архитектур показаны ниже.

Пример двухканальной и четырехсекционной DIMM
Пример трехканальной и двухуровневой двухсекционной DIMM

Кэш объектов

Пример архитектуры этой библиотеки

С точки зрения использования процессора, стоимость нескольких ядер, получающих доступ к пулам памяти кольца свободных буферов, может быть высокой, так как каждая операция получения доступа требует операций установки и сравнения. Чтобы избежать большого количества запросов на доступ, распределитель памяти может вести поддержку одно ядро кэша и посылать объемные запросы к кольцу пула памяти. Таким образом, каждое ядро имеет полный доступ к его кэшу свободных объектов и только когда кэш заполняется, что порождает необходимость ядру поместить некоторые из свободных объектов в кольцо или получить больше объектов, когда кэш пустой. Это может означать, что определенное число буферов будет простаивать на некоторых кэшах ядер, скорость, с которой ядро может получить доступ к собственному кэшу для определенного пула памяти без блокировок дает прирост к производительности.

Кэш состоит из небольшой таблицы указателей и его длины, используемой в качестве стека. Этот кэш может быть как включен, так и выключен из процесса создания пула. Максимальный размер кэша является постоянным и определяется во время компиляции. Пример использования кэша представлен на рисунке.

Менеджер буферов сообщений

Эта библиотека предоставляет возможность выделения и освобождения буферов, которые могут быть использованы в приложения DPDK для хранения сообщений. Они сохраняются в пуле памяти, для чего используется и менеджер пулов объектов в памяти. Используется, в основном, сетевыми приложениями для передачи пакетов. Для хранения пакетных данных здесь рассматриваются два подхода:

  • Встраивание метаданных в пределах одного буфера, за которым следует зона фиксированного размера для пакетных данных
  • Использование отдельных буферов памяти для структуры метаданных и пакетных данных

Преимущество первого метода заключается в том, что нужна только одна операция выделения или освобождения памяти, необходимой для пакета и метаданных. С другой стороны, второй подход является более гибким и позволяет полное отделение структур метаданных от пакетных данных. Для DPDK был выбран первый метод. Метаданные содержат информацию о пакетах, например, тип сообщения, длина, смещение относительно начала и указатель на дополнительные структуры, позволяющие соединить буферы.

Менеджер буферов предлагает стандартный набор функций для управления пакетными данными, например:

  • Get data length - получить длину данных
  • Get a pointer to the start of data - получить указатель на начало данных
  • Prepend data before data - сначала имя, потом данные
  • Append data after data - вставить данные после данных
  • Remove data at the beginning of the buffer (rte_pktmbuf_adj()) - удалить данные с начала буфера
  • Remove data at the end of the buffer (rte_pktmbuf_trim()) - удалить данные с конца буфера
Пример структуры с одним сегментом
Пример структуры с несколькими сегментами


Управление таймером и счетчиком

Эта библиотека предоставляет возможность использования таймера для исполнительных устройств DPDK, чтобы включить выполнение функции обратного вызова в асинхронном режиме. Особенности библиотеки заключаются в следующем:

  • Таймеры могут быть периодическими или одиночными
  • Таймеры могут быть загружены с одного ядра и выполняться на другом
  • Таймеры обеспечивают высокую точность (зависит от частоты вызова функции rte_timer_manage(), что проверяет истечение таймера для конкретного ядра)
  • Если таймер не требуется, он может быть отключен во время компиляции

Также эта библиотека предоставляет интерфейс для добавления, удаления и перезапуска таймера. Она используется для периодических вызовов. например, сборщики мусора.[ссылка 2]

Среда

DPDK был первоначально разработан для запуска в режиме bare-metal[примечание 2], который сейчас не используется. Сейчас EAL предоставляет поддержку для приложений под Linux или FreeBSD. EAL можно расширить для поддержки любого процессора.

DPDK позволяет полностью исключить сетевой стек Linux из обработки пакетов. Приложение, работающее в User Space, напрямую общается с аппаратным обеспечением.

Работа в Linux с использованием DPDK и без него

Использование DPDK также позволяет привязывать задачу к определенному ядру. Это исключает накладные расходы, создаваемые планировщиком Linux при переключении задач. Благодаря использованию многопоточности, DPDK сокращает количество обращений к памяти и PCI, более эффективно используя процессорные мощности. Также DPDK позволяет оптимизировать использование памяти путем выравнивания структуры данных к размеру кэша, тем самым сводя к минимуму доступ к внешней памяти.[ссылка 3]

Работа с DPDK в Linux

Установка DPDK из исходников

  1. Распакуйте архив и переходите в исходный каталог
user@host:~$ unzip DPDK-<version>.zip
user@host:~$ cd DPDK-<version>
user@host:~/DPDK-<version>$ ls

DPDK состоит из нескольких каталогов:

  • lib: исходный код библиотек DPDK
  • app: исходный код приложений DPDK (автоматических тестов)
  • examples: исходный код примеров приложений DPDK
  • config, tools, scripts, mk: скрипты, конфигурация, привязанные к платформе

Установка целевой среды

Формат команды такой: ARCH-MACHINE-EXECENV-TOOLCHAIN, где:

  • ARCH может быть i686, x86_64, ppc_64
  • MACHINE может быть native, ivshmem, power8
  • EXECENV может быть linuxapp, bsdapp
  • TOOLCHAIN может быть gcc, icc

Среды, которые необходимо установить, зависят от 32 или 64-битных пакетов и компиляторов, установленных в хосте. Доступные среды можно найти в каталоге DPDK/config directory. Например, для компиляции 64-битной среды с использованием icc необходимо запустить:

make install T=x86_64-native-linuxapp-icc

Для компиляции 32-битной сборки с использованием gcc необходимо запустить:

make install T=i686-native-linuxapp-gcc

После того, как целевая среда создана, пользователь может перейти в ее каталог и продолжить вносить изменения в код. Пользователь также может вносить изменения в конфигурацию DPDK редактированием файла .config в каталоге сборки.

cd x86_64-native-linuxapp-gcc
vi .config
make

Загрузка модулей для создания пользовательской среды

Для того, чтобы запустить любое приложение DPDK, можно загрузить подходящий модуль UIO в работающее ядро. В большинстве случаев, стандартный модуль UIO, включенный в ядро Linux, может обеспечить такую возможность. Загрузить модуль можно следующей командой:

sudo modprobe uio_pci_generic

В качестве альтернативы DPDK включает igb_uio модуль, который может быть найден в подкаталоге kmod:

sudo modprobe uio
sudo insmod kmod/igb_uio.ko

Загрузка модуля VFIO

Чтобы запустить приложение DPDK и использовать VFIO, необходимо загрузить его:

sudo modprobe vfio-pci

При этом следует иметь в виду, что для использования этого модуля необходимо, чтобы ядро его поддерживало. Он был включен в ядро Linux с версии 3.6.0. Кроме того, ядро и BIOS должны поддерживать и быть настроены на виртуализацию ввода-вывода. Для корректной работы VFIO во время запуска приложений DPDK из-под непривилегированного пользователя нужно правильно установить необходимые разрешения. Это можно осуществить с помощью DPDK установочного скрипта (setup.sh).[ссылка 4]

Примечания

  1. Environment Abstraction Layer, - среда предоставляет общий интерфейс, который скрывает ее специфику от приложений и библиотек.
  2. bare-metal, - представляет собой компьютерную систему или сеть, в которой виртуальная машина устанавливается непосредственно на аппаратную часть, а не в операционной системе. Термин "bare-metal" относится к жесткому диску.

Источники

  1. DPDK [Электронный ресурс] : Data Plane Development Kit / Дата обращения: 11 декабря 2016 - Режим доступа: http://dpdk.org/
  2. Intel [Электронный ресурс] : Руководство для программистов / Дата обращения: 11 декабря 2016 - Режим доступа: http://www.intel.com/content/dam/www/public/us/en/documents/guides/dpdk-programmers-guide.pdf
  3. SDN BlOG [Электронный ресурс] : Блог о DPDK / Дата обращения: 11 декабря 2016 - Режим доступа: https://sdnblog.ru/what-is-intel-dpdk/
  4. Intel [Электронный ресурс] : Руководство для работы с DPDK в Linux / Дата обращения: 11 декабря 2016 - Режим доступа: http://www.intel.com/content/dam/www/public/us/en/documents/guides/dpdk-getting-started-guide.pdf

Ссылки