При использовании высокоскоростных адаптеров ConnectX и коммутатора Mellanox SX6036 в режиме Ethernet стандартные механизмы передачи пакетов (Best Effort) могут приводить к потерям данных при пиковых нагрузках. Для задач, критичных к задержкам — таких как работа систем хранения (NVMe-oF, iSER), миграция виртуальных машин или распределенные вычисления — используется технология RoCE (RDMA over Converged Ethernet).
Чтобы RoCE работал эффективно, фабрика должна стать «Lossless» (без потерь пакетов). В этой статье мы разберем, как настроить приоритизацию трафика (QoS), включить управление потоком (PFC) и явное уведомление о перегрузках (ECN), а также оптимизировать буферы портов на коммутаторе SX6036 под управлением MLNX-OS.
В отличие от InfiniBand, который изначально спроектирован как сеть без потерь на аппаратном уровне, стандартный Ethernet при перегрузках просто отбрасывает (дропает) пакеты. Для RoCEv2 это критично. Чтобы решить проблему, используются два механизма:
Заходим в CLI MLNX-OS и настраиваем глобальные параметры качества обслуживания, а также включаем PFC для приоритета «3» на портах, куда подключены хосты виртуализации (или СХД).
Входим в режим конфигурации
Switch > enable Switch # configure terminal
Включаем поддержку QoS глобально
Switch (config) # qos enable
Настраиваем trust-режим для доверия тегам приоритета из пакетов (802.1p / CoS)
Switch (config) # qos trust cos
Переходим к настройке интерфейсов (например, порты 1/1-1/4 или созданный ранее port-channel 1)
Switch (config) # interface ethernet 1/1-1/4
Включаем управление потоком на основе приоритетов (PFC)
Отключаем стандартный глобальный flow-control (admin) и включаем pfc
Switch (config interface ethernet 1/1-1/4) # flowcontrol control force-pfc Switch (config interface ethernet 1/1-1/4) # qos pfc priority 3 enable
Проверяем установленные приоритеты: направляем priority 3 в соответствующий пул буфера (traffic class)
На архитектуре SwitchX-2 по умолчанию priority 3 привязан к TC3
Switch (config interface ethernet 1/1-1/4) # exit
Маркировка ECN настраивается для пулов буферов (Traffic Classes). Мы укажем коммутатору начинать маркировку пакетов, когда глубина очереди для трафика RoCE (приоритет 3 / TC3) начинает превышать заданные пороги.
Настройка порогов WRED/ECN для трафика класса 3
Задаем минимальный порог, максимальный порог и вероятность маркировки
Switch (config) # qos wred-ecn c-mode am-threshold Switch (config) # interface ethernet 1/1-1/4 Switch (config interface ethernet 1/1-1/4) # qos traffic-class 3 wred-ecn minimum-threshold 150 maximum-threshold 1500 probability 100 Switch (config interface ethernet 1/1-1/4) # exit
Примечание: Пороги измеряются в килобайтах или страницах буфера в зависимости от версии MLNX-OS. Значения 150КБ/1500КБ являются классическими стартовыми рекомендациями NVIDIA для предотвращения лавинообразных пауз.
Коммутатор SX6036 обладает общим разделяемым пулом буферной памяти. Чтобы один «зафлудивший» порт не исчерпал весь буфер свитча, необходимо правильно распределить гарантированные и динамические лимиты для установленного Lossless-класса (TC3), увеличив так называемый Headroom — запас памяти, необходимый для приема пакетов, которые уже летят по кабелю после отправки кадра PAUSE.
Настройка пула буфера под Lossless трафик
Выделяем гарантированную часть памяти под Traffic Class 3 для предотвращения дропов
Switch (config) # qos pool default-pool dynamic-size 4 Switch (config) # interface ethernet 1/1-1/4 Switch (config interface ethernet 1/1-1/4) # qos share-buffer traffic-class 3 max-dynamic-buffer 4 Switch (config interface ethernet 1/1-1/4) # exit
Сохраняем изменения в память
Switch # configuration write
Настройка коммутатора — это лишь половина дела. Хосты также должны быть настроены на работу с приоритетом 3.
В настройках сетевых адаптеров ConnectX через консоль ESXi необходимо сопоставить трафик RoCE с тегом CoS 3 и активировать PFC:
Проверяем и включаем PFC приоритета «3» на стороне драйвера Mellanox
esxcli system module parameters set -m mlx5_core -p "pfctx=0x08 pfcrx=0x08"
(Параметр 0x08 — это битовая маска, соответствующая 3-му приоритету: 1 « 3 = 8 = 0x08)
Используется утилита lldpad или ручная конфигурация через mlnx_qos:
\Включаем PFC для приоритета «3» на интерфейсе enp1s0f0
mlnx_qos -i enp1s0f0 --pfc 0,0,0,1,0,0,0,0
После запуска трафика выполняем диагностику на коммутаторе SX6036, чтобы убедиться, что механизмы оптимизации работают, а дропы отсутствуют:
Switch # show interfaces ethernet 1/1 counters pfc
Switch # show interfaces ethernet 1/1 counters | grep -E "discard|drop"
Switch # show qos wred-ecn-counters interface ethernet 1/1