Введение
DPVS — это высокопроизводительный балансировщик нагрузки 4-го уровня, основанный на DPDK. Он происходит от Linux Virtual Server (LVS) и его модификации alibaba/LVS.
Примечание: название DPVS происходит от «DPDK-LVS».
Несколько методов применяются для обеспечения высокой производительности:
Основные функции DPVS включают:
Функции модулей DPVS проиллюстрированы на следующем рисунке.
Быстрый старт
Этот быстрый старт протестирован со следующей средой.
Другие среды также должны быть подходящими, если работает DPDK, пожалуйста, проверьте dpdk.org для получения дополнительной информации.
Примечания: чтобы dpvs работал правильно с многоядерными процессорами, элементы rte_flow должны поддерживать "ipv4, ipv6, tcp, udp", а действия rte_flow - "drop, queue" как минимум.
$ git clone https://github.com/iqiyi/dpvs.git
$ cd dpvs
Что ж, давайте начнём с DPDK.
В настоящее время для DPVS рекомендуется версия dpdk-stable-20.11.1, и мы больше не будем поддерживать версии DPDK более ранние, чем dpdk-20.11. Если вы всё ещё используете более ранние версии DPDK, такие как dpdk-stable-17.11.2, dpdk-stable-17.11.6 и dpdk-stable-18.11.2, используйте более ранние выпуски dpvs, например, v1.8.10 (https://github.com/iqiyi/dpvs/releases/tag/v1.8.10).
Примечания: Вы можете пропустить этот раздел, если имеете опыт работы с DPDK, и обратиться к ссылке для получения подробной информации.
$ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz # скачать с сайта dpdk.org, если ссылка не работает.
$ tar xf dpdk-20.11.1.tar.xz
Есть некоторые патчи для DPDK для поддержки дополнительных функций, необходимых для DPVS. Примените их, если необходимо. Например, есть патч для драйвера DPDK kni для аппаратного многоадресного трафика, примените его, если вы собираетесь запускать ospfd на устройстве kni.
Примечания: предполагается, что мы находимся в корневом каталоге DPVS и dpdk-стабильный-20.11.1 находится под ним, обратите внимание, что это не обязательно, просто для удобства.
$ cd <путь-к-dpvs>
$ cp patch/dpdk-stable-20.11.1/*.patch dpdk-stable-20.11.1/
$ cd dpdk-stable-20.11.1/
$ patch -p1 < 0001-kni-use-netlink-event-for-multicast-driver-part.patch
$ patch -p1 < 0002-pdump-change-dpdk-pdump-tool-for-dpvs.patch
$ ...
Советы: Рекомендуется применять все патчи, если вы не уверены, для чего они предназначены.
Используйте meson-ninja для сборки библиотек DPDK и экспортируйте среду. variable PKG_CONFIG_PATH
for DPDK app (DPVS).
The dpdk.mk
в DPVS проверяет наличие libdpdk:
$ cd dpdk-stable-20.11.1
$ mkdir dpdklib # user desired install folder
$ mkdir dpdkbuild # user desired build folder
$ meson -Denable_kmods=true -Dprefix=dpdklib dpdkbuild
$ ninja -C dpdkbuild
$ cd dpdkbuild; ninja install
$ export PKG_CONFIG_PATH=$(pwd)/../dpdklib/lib64/pkgconfig/
Советы: можно использовать скрипт dpdk-build.sh для облегчения сборки DPDK. Запустите dpdk-build.sh -h
, чтобы узнать, как использовать скрипт.
Далее необходимо настроить DPDK hugepage. Наша тестовая среда — это система NUMA. Для одноузловой системы см. ссылку: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html.
$ # для системы NUMA
$ echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
$ echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
$ mkdir /mnt/huge
$ mount -t hugetlbfs nodev /mnt/huge
Установите модули ядра и привяжите сетевой адаптер с помощью драйвера uio_pci_generic
. Быстрый запуск использует только один сетевой адаптер, обычно мы используем два для кластера FNAT или даже четыре для режима объединения. Например, предположим, что сетевой адаптер, который мы будем использовать для запуска DPVS, — это eth0, при этом у нас всё ещё остаётся другой отдельный сетевой адаптер eth1 для отладки.
$ modprobe uio_pci_generic
$ cd dpdk-stable-20.11.1
$ insmod dpdkbuild/kernel/linux/kni/rte_kni.ko carrier=on
$ ./usertools/dpdk-devbind.py --status
$ ifconfig eth0 down # предполагая, что eth0 — это 0000:06:00.0
$ ./usertools/dpdk-devbind.py -b uio_pci_generic 0000:06:00.0
Примечания:
- Альтернативой
uio_pci_generic
являетсяigb_uio
, который перемещён в отдельный репозиторий dpdk-kmods.- Параметр модуля ядра
carrier
добавлен вrte_kni.ko
начиная с DPDK v18.11, и его значение по умолчанию — «off». Необходимо загрузитьrte_kni.ko
с дополнительным параметромcarrier=on
, чтобы устройства KNI работали правильно.
dpdk-devbind.py -u
можно использовать для отмены привязки драйвера и переключения обратно на драйвер Linux, такой как ixgbe
. Вы также можете использовать lspci
или ethtool -i eth0
, чтобы проверить идентификатор шины PCI сетевого адаптера. Дополнительную информацию см. на сайте DPDK: http://www.dpdk.org.
Примечание: PMD Mellanox NIC построен на основе libibverbs с использованием Raw Ethernet Accelerated Verbs AP. Он не полагается на драйверы UIO/VFIO. Таким образом, сетевые адаптеры Mellanox не должны привязывать драйвер
igb_uio
. См. Mellanox DPDK для получения дополнительной информации.
Это просто, просто установите PKG_CONFIG_PATH
и соберите его.
$ export PKG_CONFIG_PATH=<путь-of-libdpdk.pc> # обычно находится в dpdklib/lib64/pkgconfig/
$ cd <путь-of-dpvs>
$ make # или "make -j" для ускорения
$ make install
Примечания:
- Могут потребоваться зависимости для сборки, такие как
pkg-config
(версия 0.29.2+),automake
,libnl3
,libnl-genl-3.0
,openssl
,popt
иnumactl
. Вы можете установить недостающие зависимости с помощью менеджера пакетов системы, например,yum install popt-devel automake
(CentOS) илиapt install libpopt-dev autoconfig
(Ubuntu).- Ранние версии
pkg-config
(до v0.29.2) могут привести к сбою сборки dpvs. Если это так, пожалуйста, обновите этот инструмент.
Файлы вывода устанавливаются в dpvs/bin
.
$ ls bin/
dpip dpvs ipvsadm keepalived
dpvs
— основная программа.dpip
— инструмент для установки IP-адреса, маршрута, VLAN, neigh и т. д.ipvsadm
и keepalived
взяты из LVS и оба были изменены.Теперь dpvs.conf
должен находиться в /etc/dpvs.conf
, просто скопируйте его из conf/dpvs.conf.single-nic.sample
.
$ cp conf/dpvs.conf.single-nic.sample /etc/dpvs.conf
и запустите DPVS:
$ cd <path-of-dpvs>/bin
$ ./dpvs &
Проверьте, запущен ли он?
$ ./dpip link show
1: dpdk0: socket 0 mtu 1500 rx-queue 8 tx-queue 8
UP 10000 Mbps full-duplex fixed-nego promisc-off
addr A0:36:9F:9D:61:F4 OF_RX_IP_CSUM OF_TX_IP_CSUM OF_TX_TCP_CSUM OF_TX_UDP_CSUM
Если вы видите это сообщение. Вот перевод текста на русский язык:
Отлично, DPVS работает с NIC dpdk0!
Не беспокойтесь, если увидите эту ошибку:
EAL: Error - exiting with code: 1
Cause: ports in DPDK RTE (2) != ports in dpvs.conf(1)
Это означает, что количество сетевых карт DPVS не соответствует
/etc/dpvs.conf
. Пожалуйста, используйтеdpdk-devbind
, чтобы настроить номер сетевой карты или изменитьdpvs.conf
. Мы улучшим эту часть, чтобы сделать DPVS более «умным», чтобы избежать изменения файла конфигурации, когда количество сетевых карт не совпадает.
Какие конфигурационные элементы поддерживает dpvs.conf
? Как их настроить? Что ж, DPVS поддерживает файл конфигурационных элементов conf/dpvs.conf.items
, в котором перечислены все поддерживаемые записи конфигурации и соответствующие возможные значения. Кроме того, некоторые файлы примеров конфигураций, хранящиеся как ./conf/dpvs.*.sample
, показывают конфигурации dpvs в некоторых конкретных случаях.
Топология теста выглядит следующим образом:
Настройте VIP и локальный IP (LIP, необходимый для режима FNAT) на DPVS. Давайте поместим команды в setup.sh
. Вы можете выполнить проверку с помощью ./ipvsadm -ln
, ./dpip addr show
.
$ cat setup.sh
VIP=192.168.100.100
LIP=192.168.100.200
RS=192.168.100.2
./dpip addr add ${VIP}/24 dev dpdk0
./ipvsadm -A -t ${VIP}:80 -s rr
./ipvsadm -a -t ${VIP}:80 -r ${RS} -b
./ipvsadm --add-laddr -z ${LIP} -t ${VIP}:80 -F dpdk0
$
$ ./setup.sh
Получите доступ к VIP от клиента, всё выглядит хорошо!
client $ curl 192.168.100.100
Your ip:port : 192.168.100.3:56890
Дополнительные примеры настройки можно найти в документации по обучению. В том числе:
FNAT
.DR
).keepalived
).SNAT
для доступа в Интернет из внутренней сети.Bonding
, VLAN
, kni
, ipip
/GRE
).UOA
для получения реального IP-адреса и порта UDP-клиента в режиме FNAT
.Мы также перечислили некоторые часто задаваемые вопросы в документе FAQ, который может помочь при возникновении проблем с DPVS.
Наш тест показывает, что скорость пересылки (pps) у DPVS в несколько раз выше, чем у LVS, и такая же хорошая, как у Google's Maglev.
Нажмите здесь для получения последних данных о производительности.
Пожалуйста, обратитесь к файлу License для подробностей.
Пожалуйста, обратитесь к файлу CONTRIBUTING для деталей.
В настоящее время DPVS широко принят десятками участников сообщества, которые успешно использовали его и внесли большой вклад в развитие DPVS. Мы просто перечисляем некоторые из них в алфавитном порядке ниже.
CMSoft | ![]() |
---|---|
IQiYi | ![]() |
NetEase | ![]() |
Shopee | ![]() |
Xiaomi | ![]() |
DPVS разрабатывается командой QLB iQiYi с апреля 2016 года. Он широко используется в IDC iQiYi для L4 балансировщиков нагрузки и SNAT-кластеров, и мы уже заменили почти все наши LVS-кластеры на DPVS. Мы открыли исходный код DPVS в октябре 2017 года и рады видеть, что больше людей могут принять участие в этом проекте. Добро пожаловать, попробуйте, сообщайте о проблемах и отправляйте запросы на вытягивание. И, пожалуйста, не стесняйтесь обращаться к нам через Github или Email.
https://github.com/iqiyi/dpvs
iig_cloud_qlb # qiyi.com
(Пожалуйста, удалите пробелы и замените #
на @
).Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )