Дополнение D. Как создать контейнер Docker с ускорением RDMA приложений поверх сетевой среды 100Gb InfiniBand
Данный раздел содержит перевод блога Knowledge Article Mellanox How to Create a Docker Container with RDMA Accelerated Applications Over 100Gb InfiniBand Network в редакции от 03 декабря 2018.
{Прим. пер.: Надеемся, что данный блог может оказаться полезным в плане повышения производительности ваших приложений.}
Содержание
- Дополнение D. Как создать контейнер Docker с ускорением RDMA приложений поверх сетевой среды 100Gb InfiniBand
В этом документе мы продемонстрируем некую процедуру развёртывания ускоряемых RDMA приложений, запускаемых в контейнерах Docker и сквозном решении Mellanox Infiniband (IB) 100Gb/s.
Данный документ описывает процесс сборки Docker CE из исходного кода для Ubuntu 16.04.2 LTS и Docker 17.12 в физических серверах.
Мы покажем как обновить и установить соответствующее программное обеспечение Mellanox и аппаратные компоненты в хосте и контейнере Docker.
В своей справке мы будем вставлять 1й порт в коммутатор Infiniband и не будем применять 2й порт.
В нашей установке мы будем применять два сервера.
Каждый сервер будет подключён к коммутатору SB7700 медным кабелем 100Gb IB. Порты коммутатора в нашем случае обвязываются так:
-
1й и 2й порты - соединены с хостами серверов
Названия серверов и настройки сетевой среды таковы:
Тип сервера | Название сервера | IP NICs | |
---|---|---|---|
внутренняя сеть | внешняя сеть | ||
Server 01 |
|
|
|
Server 02 |
|
|
|
Обновление программных пакетов Ubuntu
Для обновления/ модернизации пакетов программного обеспечения Ubuntu выполните приведённые ниже команды.
$ sudo apt-get update # Опросить список доступных обновлений
$ sudo apt-get upgrade -y # Обновление текущих пакетов в строгом соответствии
Включение диспетчера подсетей в коммутаторе IB
Для знакомства с программным обеспечением коммутатора обратитесь к Руководству пользователя MLNX-OS. Прежде чем применять свой коммутатор Mellanox, мы рекомендуем вам обновить этот коммутатор до самой последней версии MLNX-OS. Существует три варианта для выбора наилучшего места для расположения SM (диспетчера подсетей, Subnet Manager):
-
Включить SM в одном из ваших управляемых коммутаторов. Это очень удобный и быстрый вид работы, к тому же он упрощает ‘plug & play’ Infiniband.
-
Запустить
/etc/init.d/opensmd
в одном или более серверов. В случае когда у вас имеется 648 или более узлов рекомендуется запускать SM в неком сервере. -
Воспользоваться выделенным сервером Unified Fabric Management (UFM®). UFM предлагает много дополнительной функциональности помимо SM. UFM требует больше вычислительной мощности чем в наличии у имеющегося коммутатора, но при этом не требует дорогостоящего сервера. Это представляет дополнительную стоимость выделенного сервера.
Мы будем давать пояснения только для вариантов 1 и 2.
Вариант 1: Настройка SM в коммутаторе MLNX-OS® любых систем коммутации Mellanox
Для включения SM выполните следующие шаги:
-
Зарегистрируйтесь в коммутаторе и войдите в режим настроек:
Mellanox MLNX-OS Switch Management switch login: admin Password: Last login: Wed Aug 12 23:39:01 on ttyS0 Mellanox Switch switch [standalone: master] > enable switch [standalone: master] # conf t switch [standalone: master] (config)#
-
Выполните следующие команды:
switch [standalone: master] (config)#ib sm switch [standalone: master] (config)#
-
Проверьте запуск SM, выполните:
switch [standalone: master] (config)#show ib sm enable switch [standalone: master] (config)#
Для сохранения настроек (на постоянной основе) выполните:
switch (config) # configuration write
Вариант 2: Настройка SM в сервере (пропустите эту процедуру если вы настроили SM в коммутаторе)
Для запуска OpenSM в некотором сервере просто исполните opensm
в командной строке
в своём узле управления выполнив:
# opensm
Или: запускайте OpenSM автоматически на своём головном узле изменив свой файл
/etc/opensm/opensm.conf
. Создайте такой файл настроек выполнив:
# opensm –config /etc/opensm/opensm.conf
Замените в файле /etc/opensm/opensm.conf
следующую строку:
onboot=yes
В процессе начальной установки OpenSM конфигурируется и запускается с алгоритмом маршрутизации по умолчанию. При исполнении кластера толстого дерева со множеством уровней рекомендуется изменить следующие параметры чтобы создать наиболее действенный алгоритм маршрутизации, доставляющий наивысшую производительность:
–routing_engine=updn
Для ознакомления со всеми подробностями того как настраивать атрибуты OpenSM ознакомьтесь с главой OpenSM – Subnet Manager Руководства пользователя Mellanox OFED для Linux.
Установка Mellanox OFED для Ubuntu в качестве хоста
Данная глава описывает как установить и проверить пакет Mellanox OFED для Linux в некой отдельной машине хоста с установленной картой адаптера Mellanox ConnectX®-5. Для получения дополнительных сведений отсылаем вас к Mellanox OFED for Linux User Manual.
Выгрузка Mellanox OFED
-
Убедитесь что ваша система имеет установленным сетевой адаптер Mellanox (HCA/NIC):
# lspci -v | grep Mellanox
Приведённый ниже пример показывает некую систему с установленным HCA:
-
Вугрузите необходимый образ ISO в соответствии с ОС своего хоста. Название такого образа имеет формат
MLNX_OFED_LINUX-<ver>-<OS label><CPUarch>.iso
. Вы можете получить его сhttp://www.mellanox.com > Products > Software > InfiniBand/VPI Drivers > Mellanox OFED Linux (MLNX_OFED) > Download
.
-
Для того чтобы убедиться в целостности выгруженного файла проверьте его MD5SUM. Выполните приводимую ниже команду и сравните полученный результат со значением на странице выгрузки.
# md5sum MLNX_OFED_LINUX-<ver>-<OS label>.tgz
Установка Mellanox OFED
MLNX_OFED устанавливается путём запуска сценария mlnxofedinstall
. Этот
сценарий исполнения выполняет следующее:
-
Исследует установленное в настоящий момент ядро
-
Выполняет деинсталляцию всех стеков программного обеспечения, которые составляют часть самого дистрибутива операционной системы или стека иного коммерческого производителя
-
Устанавливает двоичные RPM MLNX_OFED_LINUX (если они доступны для вашего текущего ядра)
-
Выявляет установленные в настоящий момент сетевые адаптеры InfiniBand и Ethernet, а также автоматически обновляет их встроенное программное обеспечение
Данный сценарий установки удаляет все установленные ранее пакеты OFED Mellanox и повторно выполняет установку с нуля. Вы можете получить запрос на подтверждение удаления всех старых пакетов.
-
Зарегистрируйтесь в машине установки от имени root.
-
Скопируйте выгруженный tgz в
/tmp
:# cd /tmp # tar -xzvf MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz # cd MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64/
-
Исполните сам сценарий установки:
# ./mlnxofedinstall
-
После успешного выполнения установки осуществите перезагрузку:
# /etc/init.d/openibd restart # reboot
По умолчанию оба порта ConnectX®-5 VPI инициализируются в качестве портов Infiniband.
-
(Необязательно) отключите не используемый второй порт в своём устройстве. Определите PCI ID своих портов PCI:
# lspci | grep Mellanox 05:00.0 Infiniband controller: Mellanox Technologies Device 1019 05:00.1 Infiniband controller: Mellanox Technologies Device 1019
Отключаем 2й порт:
# echo 0000:05:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
-
Убедитесь что режимом соответствующего порта является Infiniband:
# ibv_devinfo
-
Если вы обнаружите то что представлено ниже, вам следует изменить значение порта интерфейсов на Infiniband.
Измените режим портов своих интерфейсов на Infiniband. Порты ConnectX®-5 могут индивидуально настраиваться на работу в качестве портов Infiniband или Ethernet. Вам следует изменить режим на Infiniband. После загрузки соответствующего драйвера воспользуйтесь сценарием mlxconfig.
* LINK_TYPE_P1=1 is a Infiniband mode
-
Запустите
mst
и просмотрите названия портов# mst start # mst status
-
Измените значение режима для обоих портов на Infiniband:
# mlxconfig -d /dev/mst/mt4121_pciconf0 s LINK_TYPE_P1=1 #Port 1 set to IB mode # reboot
После каждой перезагрузки вам следует отключать второй порт.
-
Опросите устройства Infiniband и выведите на печать информацию о них, которая доступна к применению из пространства пользователя.
# ibv_devinfo
-
-
Запустите утилиту
ibdev2netdev
чтобы увидеть все имеющиеся ассоциации между вашими устройствами Ethernet и соответствующими устройствами/ портами IB:# ibdev2netdev # ifconfig ib0 12.12.12.41 netmask 255.255.255.0
-
Вставьте в свой файл
/etc/network/interfaces
приводимые далее строки после таких строк:# vim /etc/network/interfaces auto eno1 iface eno1 inet dhcp
а именно, следующие строки:
auto ib0 iface ib0 inet static address 12.12.12.41 netmask 255.255.255.0
Например:
# vim /etc/network/interfaces auto eno1 iface eno1 inet dhcp auto ib0 iface ib0 inet static address 12.12.12.41 netmask 255.255.255.0
-
Убедитесь что ваши сетевые настройки установлены корректно:
# ifconfig -a
Деинсталяция старых версий
Для выполнения деинсталляции старых верссий мы рекомендуем применить такую команду:
$ sudo apt-get remove docker docker-engine docker.io
В случае успеха apt-get
выдаст отчёт что никакие из этих пакетов не установлены.
Само содержимое /var/lib/docker/
, включая образы, контейнеры, тома и сетевые
среды сохраняются.
Установка Docker CE
Для Ubuntu 16.04 и последующих версий, само ядро Linuxсодержит поддержку для OverlayFS, а Docker CE по умолчанию будет применять
драйвер хранилища overlay2
.
Установка с применением репозитория
Прежде чем вам устанавливать Docker CE пв самый первый раз в новой машине хоста вам понадобится установить репозиторий Docker. Впоследствии вы можете устанавливать и обновлять Docker из этого репозитория.
Настройка самого репозитория
-
Обновите индексацию пакета
apt
:$ sudo apt-get update
-
Установите необходимые пакеты чтобы позволить
apt
применять репозиторий поверх HTTPS:$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
-
Добавьте официальный GPG ключ Docker:
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Убедитесь что значением отпечатка пальца для данного ключа является
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
:$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb)
sub 4096R/F273FCD8 2017-02-22
Установка Docker CE
Установите самую последнюю версию Docker CE или перейдите к следующему шагу чтобы установить некую определённую версию. Заменяются все существующие установки Docker.
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
Персонализация моста docker0
Рекомендуемым методом настройки самого демона Docker является применение его файла
daemon.json
, который расположен в
/etc/docker/
. Если такой файл не существует, создайте его. Вы можете определить
одну или более следующих установок для настройки устанавливаемого по умолчанию сетевого моста:
{
"bip": "172.16.41.1/24",
"fixed-cidr": "172.16.41.0/24",
"mtu": 1500,
"dns": ["8.8.8.8","8.8.4.4"]
}
Те же самые параметры представлены в виде флагов для dockerd
с пояснениями
для каждого:
-
--bip=CIDR
: поддерживает конкретный адрес и сетевую маску для мостаdocker0
с применением стандартной нотации CIDR. Например:172.16.41.1/16
. -
--fixed-cidr=CIDR
: ограничивает соответствующий диапазон IP в устанавливаемой подсетиdocker0
при помощи стандартной нотации CIDR. Например:172.16.41.0/16
. -
--mtu=BYTES
: переопределяет значение максимальной длины пакета вdocker0
. Например:1500
. -
--dns=[]
: Подлежащие использованию серверы DNS. Например:--dns=8.8.8.8,8.8.4.4
.
После внесения изменений в файл daemon.json
перезапустите Docker/
$ sudo /etc/init.d/docker restart
{Прим. пер.: при использовании docker-compose сетевые настройки моста по умолчанию хранятся в
docker-compose.yml
, подробнее в Compose file version 3 reference и далее,
>ipv4_address, ipv6_address
, или
Docker compose example using
default 'bridge' network.}
Настройка взаимодействия с внешним миром
Проверьте ip перенаправления в ядре:
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
если он запрещён,
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 0
будьте добры, разрешите его и проверьте снова:
$ sysctl net.ipv4.conf.all.forwarding=1
По причинам безопасности Docker настраивает правила iptables чтобы предотвращать обмен контейнеров с внешним миром с самой хост машины в хостах Linux. Docker настраивает значения политики по умолчанию цепочки FORWARD в DROP.
Для перекрытия поведения значений по умолчанию вы можете вручную изменить значение политики по умолчанию:
$ sudo iptables -P FORWARD ACCEPT
Добавление маршрута IP с определённой подсетью
Добавьте маршрутизацию для сетевой среды контейнеров во втором хосте:
$ sudo ip route add 172.16.42.0/24 via 12.12.12.42
Быстрая проверка
Предоставьте своей среде быструю проверку запуска чтобы убедиться в верности всех ваших настроек:
$ docker run hello-world
Вариант 1
Вытаскивание необходимого образа из Docker Hub и запуск некого контейнера Docker в привилегированном режиме из удалённого репозитория при помощи:
$ sudo docker run -it --privileged --name=mnlx-verbs-prvlg mellanox/mofed421_docker:latest bash
Вариант 2
Вытаскивание необходимого образа из Docker Hub и запуск некого контейнера Docker в не привилегированном режиме из удалённого репозитория при помощи:
$ sudo docker run -it --cap-add=IPC_LOCK --device=/dev/infiniband/uverbs1 --name=mnlx-verbs-nonprvlg mellanox/mofed421_docker:latest bash
Вариант 3
Docker способен собирать образы автоматически считывая соответствующие инструкции из Dockerfile
.
Некий Dockerfile
является текстовым документом, который содержит все команды,
которые пользователь может вызывать в своей командной строке для сборки некого образа
{Прим. пер.: подробнее в Тонкая настройка нашего
образа Rail}.
Dockerfile
-
Создайте некий пустой каталог.
-
Измените каталог (
cd
) на текущий, создайте некий файл с именемDockerfile
и скопируйте вставкой приводимое ниже содержимое, после чего сохраните этот файл. Обратите внимание на комментарии, которые поясняют каждый оператор в вашем новомDockerfile
.
# В качестве родительского образа воспользуйтесь официальным Ubuntu 16.04
FROM ubuntu:16.04
MAINTAINER YOUR NAME <your@real.mail>
# Установите каталог MOFED рабочим каталогом и каталогом образа
ENV MOFED_DIR MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64
ENV MOFED_SITE_PLACE MLNX_OFED-4.2-1.0.0.0
ENV MOFED_IMAGE MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
WORKDIR /tmp/
# Подхватите некие зависимости MOFED
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
net-tools \
ethtool \
perl \
lsb-release \
iproute2 \
pciutils \
libnl-route-3-200 \
kmod \
libnuma1 \
lsof \
linux-headers-4.4.0-92-generic \
python-libxml2 && \
rm -rf /var/lib/apt/lists/*
# Выгрузите и установите Mellanox OFED 4.2.1 для Ubuntu 16.04
RUN wget http://content.mellanox.com/ofed/${MOFED_SITE_PLACE}/${MOFED_IMAGE} && \
tar -xzvf ${MOFED_IMAGE} && \
${MOFED_DIR}/mlnxofedinstall --user-space-only --without-fw-update --all -q && \
cd .. && \
rm -rf ${MOFED_DIR} && \
rm -rf *.tgz
Образ Docker и запуск контейнера
-
Теперь выполните команду сборки. Она создаст некий образ Docker, который мы намерены пометить тегом
-t
с тем чтобы он имел дружественное название.$ docker build -t myofed421image .
-
Где вы построили образ? Он находится в реестре образов Docker в вашей машине:
$ docker images
-
Запустите контейнер Docker в привилегированном/ не привилегированном режиме из имеющегося удалённого репозитория следующим образом:
$ docker run -it --privileged --name=mnlx-verbs-prvlg --name=my-verbs-nonprvlg myofed421image bash OR $ docker run -it --cap-add=IPC_LOCK --device=/dev/infiniband/uverbs1 --name=my-verbs-nonprvlg myofed421image bash
Проверьте перемещённую версию и uverbs:
Выполните стресс- тест пропускной способности поверх IB в контейнере:
Сервер:
ib_write_bw -a -d mlx5_1 &
Клиент:
ib_write_bw -a -F $server_IP -d mlx5_1 --report_gbits
Таким образом вы можете запустить нагрузочную проверку пропускной способности поверх IB между контейнерами.
И это всё.