Дорабатываем сетевой стек протоколов с помощью Gazelle в составе ОС openScaler 22.03 LTS

Gazelle — это высокопроизводительный стек протоколов для пользовательского режима. Он напрямую считывает и записывает пакеты сетевого интерфейса NIC в пользовательском режиме на основе DPDK (Data Plane Development Kit,набор для разработки на уровне данных, состоящий из библиотек для ускорения рабочих нагрузок по обработке пакетов) и передает пакеты через память HugePages memory и использует стек протоколов LwIP (Lightweight TCP/IP, небольшая независимая реализация пакета протоколов TCP/IP). Gazelle значительно повышает пропускную способность сетевого ввода-вывода приложений и ускоряет работу сети с базами данных, такими как MySQL и Redis. Его ключевые особенности и преимущества:

  • Высокопроизводительные пакеты с нулевым копированием и без блокировки, которые можно гибко масштабировать и адаптивно планировать.
  • Универсальность, совместимая с POSIX без каких-либо изменений и применимая к различным типам приложений.

В сценарии с одним процессом (single-process scenario), где сетевой интерфейс поддерживает несколько очередей (multiple queues) рекомендуется использовать библиотеку liblstack.so только для сокращения пути передачи пакетов (shorten the packet path).

Установка

Для установки Gazelle достаточно выполнить следующую команду:

dnf install dpdk libconfig numactl libboundscheck libpcap gazelle

Пример выполнения команды:

Рисунок 1. Пример установки Gazelle с помощью dnf

Порядок использования

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

  1. Установите файл .ko от имени пользователя root

Установите файлы подгружаемого модуля .ko в соответствии с требованиями среды выполнения для привязки сетевых адаптеров к драйверу пользовательского режима, чтобы включить виртуальные сетевые порты и привязать сетевые адаптеры к драйверу пользовательского режима (enable the virtual network ports and bind NICs to the user-mode driver). Чтобы включить функцию виртуального сетевого порта, используйте rte_kni.ko. Выполните команду:

modprobe rte_kni carrier=”on”

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

#Если технология IOMMU поддерживается

modprobe vfio-pci

#Если технология IOMMU не поддерживается и технология VFIO поддерживает no-IOMMU mode

modprobe vfio enable_unsafe_noiommu_mode=1

modprobe vfio-pci

#В других случаях использовать следующий вариант

modprobe igb_uio

Примечание. Вы можете проверить включена ли поддержка IOMMU на сервере, в зависимости от конфигурации его BIOS.

  1. Привязка сетевой карты с помощью DPDK

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

Для этого выполните команды:

#При использовании vfio-pci

dpdk-devbind -b vfio-pci enp3s0

#при использовании igb_uio

dpdk-devbind -b igb_uio enp3s0

  1. Настройка использования HugePages memory

Gazelle использует память с большими объемами страниц (HugePages memory) для повышения эффективности. Вы можете настроить любой размер страниц с большими объемами памяти, зарезервированных системой, используя права root. Для каждой страницы с большими объемами памяти требуется файловый дескриптор. Если объем оперативной памяти сервера достаточно велик, рекомендуется использовать объемные страницы объемом 1 ГБ, чтобы не занимать слишком много файловых дескрипторов. Выберите размер страницы в соответствии с требованиями ПО и настройте HugePages с достаточным объемом памяти. Например, выполните следующие команды:

#Настройка 1024 страниц памяти размером 2 МБ на node0. Общий объем памяти составляет 2 ГБ.

echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

#Настройка 5 больших страниц памяти объемом 1 ГБ на узле 0. Общий объем памяти составляет 5 ГБ.

echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages

  1. Монтирование страниц с большими объемами памяти

Создайте два каталога для процессов stack и ltran для доступа к страницам с большими объемами памяти. Выполните следующие команды:

mkdir -p /mnt/hugepages-ltran

mkdir -p /mnt/hugepages-lstack

chmod -R 700 /mnt/hugepages-ltran

chmod -R 700 /mnt/hugepages-lstack

mount -t hugetlbfs nodev /mnt/hugepages-ltran -o pagesize=2M

mount -t hugetlbfs nodev /mnt/hugepages-lstack -o pagesize=2M

Примечание. HugePage страницы, подключенные к /mnt/hugepages-ltran и /mnt/hugepages-stack, должны быть одинакового размера.

  1. Включение Gazelle для приложения

Активируйте Gazelle для приложения любым из следующих способов.

  • Перекомпилируйте приложение и замените интерфейс sockets.

#Добавьте Makefile из Gazelle в makefile приложения.

-include /etc/gazelle/lstack.Makefile

#Добавьте переменную STACK_LIBS при компиляции исходного кода.

gcc test.c -o test ${LSTACK_LIBS}

  • Используйте переменную среды LD_PRELOAD для загрузки библиотеки Gazelle. Используйте переменную среды GAZELLE_BIND_PROC NAME для указания имени процесса и LD_PRELOAD для указания пути к библиотеке Gazelle.

GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test

  1. Настройка Gazelle
  • Файл конфигурации lconf используется для указания параметров запуска lstack. Его путь расположения по умолчанию /etc/gazelle/lstack.conf.

Пример файла конфигурации lstack.conf:

dpdk_args=[“–socket-mem”, “2048,0,0,0”, “–huge-dir”, “/mnt/hugepages-lstack”, “–proc-type”, “primary”, “–legacy-mem”, “–map-perfect”]

use_ltran=1

kni_switch=0

low_power_mode=0

num_cpus=”2,22″

num_wakeup=”3,23″

host_addr=”192.168.1.10″

mask_addr=”255.255.255.0″

gateway_addr=”192.168.1.1″

devices=”aa:bb:cc:dd:ee:ff”

  • Файл конфигурацмм lconf используется для указания параметров запуска ltran. Путь по умолчанию /etc/gazelle/ltran.conf. Чтобы включить ltran, задайте use_ltran=1 в файле lstack.conf.

Пример файла конфигурации ltran.conf:

forward_kit_args=”-l 0,1 –socket-mem 1024,0,0,0 –huge-dir /mnt/hugepages-ltran –proc-type primary –legacy-mem –map-perfect –syslog daemon”

forward_kit=”dpdk”

kni_switch=0

dispatch_max_clients=30

dispatch_subnet=”192.168.1.0″

dispatch_subnet_length=8

bond_mode=1

bond_mtu=1500

bond_miimon=100

bond_macs=”aa:bb:cc:dd:ee:ff”

bond_ports=”0x1″

tcp_conn_scan_interval=10

Описание параметров конфигурационных файлов можно найти в документации ОС.

  1. Запуск приложения
  • Запуск процесса ltran. Если существует только один процесс приложения, а сетевая карта поддерживает несколько очередей (multiple queues), для распределения пакетов по каждому потоку (thread) используется мультиочередь сетевой карты (NIC multi-queue) и в этом случае запускать процесс ltran не требуется. Установите значение use_ltran в файле lstack.conf равным 0. Если вы не используете параметр -config-file для указания файла конфигурации при запуске ltran, используется путь к файлу конфигурации по умолчанию /etc/gazelle/ltran.conf.

ltran –config-file ./ltran.conf

  • Запустите приложение. Если переменная среды LSTACK_CONF_PATH не используется для указания файла конфигурации перед запуском приложения, используется путь к файлу конфигурации по умолчанию /etc/gazelle/lstack.conf.

export LSTACK_CONF_PATH=./lstack.conf

LD_PRELOAD=/usr/lib64/liblstack.so  GAZELLE_BIND_PROCNAME=redis-server redis-server redis.conf

  1. API-интерфейсы

Gazelle обертывает (wrap) POSIX-интерфейсы приложения. Код приложения не нуждается в изменении.

  1. Команды ввода в эксплуатацию

Если режим ltran не используется, команды gazellectl ltran xxx и gazellectl lstack show {ip | pid} -r не поддерживаются.

Параметры команды gazellectl:

Usage: gazellectl [-h | help]

  or:  gazellectl ltran  {quit | show | set} [LTRAN_OPTIONS] [time]

  or:  gazellectl lstack {show | set} {ip | pid} [LSTACK_OPTIONS] [time]

  quit            ltran process exit

  where  LTRAN_OPTIONS :=

                  show ltran all statistics

  -r, rate        show ltran statistics per second

  -i, instance    show ltran instance register info

  -b, burst       show ltran NIC packet len per second

  -l, latency     show ltran latency

  set:

  loglevel        {error | info | debug} set ltran loglevel

  where  LSTACK_OPTIONS :=

                  show lstack all statistics

  -r, rate        show lstack statistics per second

  -s, snmp        show lstack snmp

  -c, connetct    show lstack connect

  -l, latency     show lstack latency

  set:

  loglevel        {error | info | debug} set lstack loglevel

  lowpower        {0 | 1} set lowpower enable

  [time]          measure latency time default 1S

  1. Меры предосторожности

 Расположение файла конфигурации DPDK

Для пользователя root файл конфигурации сохраняется в каталоге /var/run/dpdk после запуска DPDK. Для пользователя, не являющегося пользователем root, путь к файлу конфигурации DPDK определяется переменной среды XDG_RUNTIME_DIR.

  • Если значение XDG_RUNTIME_DIR не задано, файл конфигурации DPDK сохраняется в /tmp/dpdk.
  • Если задан параметр XDG_RUNTIME_DIR, файл конфигурации DPDK сохраняется по пути, указанному параметром XDG_RUNTIME_DIR.
  • Обратите внимание, что XDG_RUNTIME_DIR установлен по умолчанию на некоторых серверах.

Ограничения

В Gazelle имеются следующие ограничения:

Функциональные ограничения

  • Блокировка функций accept() или connect() неподдерживается.
  • Поддерживается не более 1500 TCP-подключений.
  • В настоящее время поддерживаютсятолько TCP, ICMP, ARP и IPv4 сетевые протоколы
  • Когда производится опрос peer end pings к Gazelle, указанная длина пакета должна быть меньше или равна 14 000 байт.
  • TLB страницы не поддерживаются.
  • ltran не поддерживает гибридное подключение нескольких типов сетевых адаптеров.
  • Режим active/standby (режим bond1) ltran поддерживает переключение active/standby только при возникновении сбоя на канальном уровне (например, отсоединение сетевого кабеля),но не поддерживает переключение active/standby при возникновении сбоя на физическом уровне (например, питание сетевой карты выключен или удален).
  • Сетевые адаптеры виртуальных машин (VM NICs) не поддерживают несколько очередей.

Эксплуатационные ограничения

  • По умолчанию для работы с командными строками и конфигурационными файлами, предоставляемыми Gazelle, требуются права root. Для пользователей, не имеющих прав root, требуется повышение привилегий и смена владельца файла.
  • Чтобы привязать сетевой адаптер из драйвера пользовательского режима обратно к драйверу ядра, сначала необходимо выйти из Gazelle.
  • Страницы с большими объемами памяти не могут быть повторно подключены к подкаталогам, созданным в точке монтирования.
  • Минимальный объем памяти для больших страниц, требуемый ltran, составляет 1 ГБ.
  • Минимальный объем памяти для больших страниц для каждого потока стека протоколов экземпляра приложения составляет 800 МБ.
  • Gazelle поддерживает только 64-разрядные операционные системы.
  • Параметр -march=native используется при сборке x86-версии Gazelle для оптимизации Gazelle на основе набора команд процессора среды сборки (процессор Intel® Xeon® Gold 5118 с частотой 2,30 ГГц). Следовательно, центральный процессор операционной среды должен поддерживать расширения набора команд SSE4.2, AVX, AVX2 и AVX-512.
  • Максимальное количество IP-фрагментов равно 10 (максимальная длина пакета ping составляет 14 790 байт). Протокол TCP не использует IP-фрагменты.
  • Рекомендуется установить для параметра rp_filter сетевой карты значение 1 с помощью команды sysctl. В противном случае стек протоколов Gazelle может использоваться не так, как ожидалось. Вместо этого используется стек протоколов ядра.
  • Гибридное подключение нескольких типов сетевых адаптеров не поддерживается.
  • Режим active/standby (режим bond1) поддерживает переключение active/standby только при возникновении сбоя на канальном уровне (например, отсоединение сетевого кабеля), но не поддерживает переключение active/standby при возникновении сбоя на физическом уровне (например, питание сетевой карты выключено или удалено).
  • Если длина отправляемых UDP-пакетов превышает 45952 (32 x 1436) байт, увеличьте значение параметра send_ring_size как минимум до 64.

Меры предосторожности

Необходимо оценить использование Gazelle на основе сценариев применения.

Общая память (Shared Memory)

  • HugePage страницы памяти монтируются в каталог /mnt/hugepages-lstack. Во время инициализации процесса файлы создаются в каталоге /mnt/hugepages-lstack. Каждый файл странице и над файлами выполняется функция mmap. После получения регистрационной информации из lstask ltran настраивает файлы в каталоге mmap информационной страницы на основе конфигураций памяти огромных страниц, реализуя общую память огромных страниц. Эта процедура также применима к файлам в каталоге /mnt/hugepages-ltran.
  • Меры защиты: Разрешение на доступ к файлам подкачки большого размера равно 600. Только владелец может получить доступ к файлам. Владельцем по умолчанию является пользователь root. Можно настроить других пользователей. Файлы подкачки большого размера заблокированы DPDK и не могут быть напрямую записаны или сопоставлены.
  • Некоторые процессы, принадлежащие одному и тому же пользователю, могут имитировать логику реализации DPDK, чтобы совместно использовать HugePage память страниц, используя Huge Page файлы подкачки, и выполнять операции записи, чтобы повредить огромную память страниц. В результате программа Gazelle аварийно завершает работу и требует перезапуска. Рекомендуется, чтобы процессы пользователя принадлежали к одному и тому же домену доверия (belong to the same trust domain).

Traffic Limit функционал Gazelle не ограничивает трафик. Пользователи могут отправлять пакеты в сеть с максимальной пропускной способностью сетевой карты, что может привести к перегрузке сети (may congest the network).

Process Spoofing Если два процесса lstack A и B зарегистрированы в ltran, A может выдавать себя за B, чтобы отправлять подменяющие сообщения в ltran и изменять управляющую информацию для переадресации ltran. В результате связь с B становится ненормальной, и происходит утечка информации, когда пакеты для B отправляются в A. Убедитесь, что все процессы lstack являются надежными.

Результаты

По результатам успешной установки ПО Gazelle для ОС openScaler 22.03 LTS на совместимый сервер c ОС OpenScaler можно сделать вывод, что данное ПО совместимо с ОС и такое решение может быть в дальнейшем успешно использовано для обеспечения высокопроизводительных решений на основе СУБД.