Продвинутый

Размещение четырёх 32 ГБ PCIe‑bars за коммутатором в Linux

Алексей Кузнецов
Алексей Кузнецов
Системный администратор13 ноября 2026 г.10 мин чтения

Как разместить четыре 32 ГБ PCIe‑bars за коммутатором в Linux, настройка ZFS‑пулов, тесты производительности и рекомендации по стабильности.

Размещение четырёх 32 ГБ PCIe‑bars за коммутатором в Linux

Как разместить четыре 32 ГБ PCIe‑bars за коммутатором в Linux, настройка ZFS‑пулов, тесты производительности и рекомендации по стабильности.

Выбор и подготовка PCIe‑switch

Выбор и подготовка PCIe‑switch

Исходные требования к оборудованию

Для размещения четырёх 32 ГБ PCIe‑bars за коммутатором необходимо, чтобы splint соответствовал следующим параметрам:

  • PCIe‑версия и ширина канала. Каждый бар типично использует PCIe 3.0 ×8 (или ×4 при высокой плотности). Коммутатор должен предоставлять минимум ×8 на каждый downstream‑порт, а суммарная пропускная способность ≥ 32 GT/s (4 × 8 GT/s).
  • Поддержка Linux‑драйвера. Обычные PCIe‑switch‑карты работают через встроенный драйвер pcieport в ядре ≥ 5.4. Убедитесь, что ваш дистрибутив поставляется с таким ядром (Debian 12, Ubuntu 22.04 и новее).
  • Энергопотребление и охлаждение. 32 ГБ‑баров обычно потребляют до 75 W каждый. Убедитесь, что ваш блоку питания имеет запас ≥ 20 % от номинального тока, а в корпусе есть хорошая вентиляция.
  • Форм-фактор. Наиболее распространённые – карты PCIe 2.0 ×8, но при наличии достаточно места подойдёт и PCIe 4.0 ×8 (например, Mellanox MSE2100, Broadcom BCM57810).

Практический совет – перед покупкой проверьте совместимость в Практические практики для инженеров. Там описано, как сравнивать спецификации и выбирать оптимальное решение.

Физическая установка и подключение баров

  1. Подготовка корпуса

    • Отключите питание и снимите боковую панель.
    • Оцените свободное место в слот‑буке: для коммутатора нужен минимум один слот ×8, а для четырёх баров – четыре свободных downstream‑порта (часто они находятся на той же карте).
  2. Установка коммутатора

    bash
    # Проверяем доступные слоты
    lspci -nn | grep -i -E 'slot|controller'
    
    • Выбираем слот, соответствующий по ширине (обычно это слот ×8).
    • Вставляем коммутатор, закрепляем его screws‑ом.
  3. Подключение 32 ГБ‑баров

    • Каждый бар имеет разъём PCIe ×8 (или ×4). Вставляем его в соответствующий downstream‑порт коммутатора до щёлчка.
    • При необходимости фиксируем кабель‑мостом (если у коммутатора есть внешние кабели).
  4. Проверка обнаружения

    bash
    # Список всех PCI‑устройств
    lspci -nn
    
    # Фильтрация только коммутатора и баров
    lspci -nn | grep -i -E 'switch|pci|device'
    
    • Убедитесь, что каждое устройство отображается с корректным ID (например, 14e4:14e5 – типовое vendor‑device для Mellanox).
  5. Настройка ядра (опционально)

    • Иногда требуется включить IOMMU для последующей работы с ZFS. Добавьте параметр в GRUB_CMDLINE_LINUX_DEFAULT:
      bash
      # /etc/default/grub
      GRUB_CMDLINE_LINUX_DEFAULT="... iommu=pt ..."
      
    • После изменения запустите sudo update-grub и перезагрузитесь.

Важно – после физической установки проверьте, что все четыре бар‑а видны в lspci. Если какое‑то устройство не появляется, проверьте плотность вставки, наличие достаточного питания и корректность использования слота ×8.

Yogurt: Free, Private, Open‑Source Meeting Assistant – полезен, если планируете документировать процесс настройки в виде meeting‑notes.

Патч для ядра Linux в Ubuntu не вышел три недели – может быть актуален, если вы сталкиваетесь с известными багами PCIe‑switch‑а.

Ubuntu не выпустила патч для 0day RCE в ядре Linux – рекомендуется следить за security‑bulletin, особенно при работе с новыми PCIe‑устройствами.

Настройка Linux‑окружения

Настройка Linux‑окружения

### Установка и конфигурация драйверов

Перед тем как приступить к работе с 32 ГБ PCIe‑bars, убедитесь, что ядро Linux поддерживает нужный драйвер. На сервере на базе Ubuntu 22.04 LTS (ядро 5.15) достаточно пакета linux-modules-extra-5.15, но для некоторых моделей (например, Mellanox ConnectX‑5) требуется дополнительный модуль.

bash
# проверяем текущую версию ядра
uname -r

# обновляем репозитории и ставим базовые пакеты
sudo apt update
sudo apt install -y build-essential dkms

# устанавливаем дополнительные модули ядра (если драйвер в них)
sudo apt install -y linux-modules-extra-$(uname -r)

# пример загрузки драйвера Mellanox ConnectX‑5
sudo modprobe mlx5_core

После загрузки проверьте, что устройство появилось в списке:

bash
lspci | grep -i eth

Если драйвер не загружается автоматически, добавьте его в /etc/modules:

bash
echo "mlx5_core" | sudo tee -a /etc/modules

Практический совет: перед тем как компилировать драйвер из исходников, проверьте, нет ли готового пакета в репозитории. Часто в официальных репозиториях уже есть mlx5_core и mlx5_ib, что избавит от необходимости сборки.

Навыки для реальных инженеров: практические практики – полезно, если вы впервые сталкиваетесь с кастомными драйверами.

### Создание ZFS‑пула для четырёх баров

ZFS удобно работает с набором устройств, образующих vdev. Для четырёх одинаковых 32 ГБ SSD/HDD (например, /dev/sdb, /dev/sdc, /dev/sdd, /dev/sde) удобно использовать vdev‑режим RAIDZ2 (две parity‑диска), чтобы выдержать любые два сбоя.

bash
# создаём пул named "tank" с ashift=12 (4 КБ) – оптимально для SSD
sudo zpool create -f -o ashift=12 \
    -o autotrim=on \
    -o compression=lz4 \
    -o atime=off \
    tank /dev/sdb /dev/sdc /dev/sdd /dev/sde

Проверяем статус пула:

bash
sudo zpool status tank

Если всё в порядке, создаём файловые системы под нужные задачи:

bash
# пример: отдельный dataset для баз данных
sudo zfs create tank/db

# отдельный dataset для резервных копий
sudo zfs create tank/backup

Настройте свойства пула, чтобы повысить надёжность и производительность:

bash
sudo zpool set failmode=wait tank          # ждать ручного вмешательства
sudo zpool set health=on tank               # включать автоматический мониторинг

Практический пример: после создания пула скопируйте базу данных PostgreSQL в dataset tank/db и настройте wal_dir на отдельный диск (например, /dev/sde), чтобы изолировать I/O.

Yogurt: Free, Private, Open‑Source Meeting Assistant – в проектах, где требуется удобный интерфейс для мониторинга, такие инструменты часто используют ZFS‑дашборды.

Итоги

  • Установите актуальные драйверы, проверьте их загрузку через lspci и lsmod.
  • Создайте ZFS‑пул с RAIDZ2‑vdev, включите сжатие lz4 и отключите доступное время (atime=off).
  • Делите пул на отдельные dataset‑ы для разных нагрузок (БД, резервные копии, логи).

Эти шаги гарантируют, что ваши четыре 32 ГБ PCIe‑bars будут использоваться эффективно и надёжно в Linux‑окружении.

Конфигурация коммутатора

Базовая настройка портов и VLAN

Для размещения четырёх 32 ГБ PCIe‑bars за коммутатором необходимо, чтобы каждый бар был виден как отдельный сетевой интерфейс. Обычно бар подключается к NIC, а NIC – к порту коммутатора. Ниже пример конфигурации на Linux‑сервере с Ubuntu 22.04 и управляемом коммутаторе (Cisco‑like CLI).

bash
# Включаем интерфейс, задаём IP‑адрес
ip link set dev eth0 up
ip addr add 10.0.0.1/24 dev eth0

# Создаём VLAN 10 для отдельного сегмента
vconfig add eth0 10
ip link set dev eth0.10 up
ip addr add 10.0.10.1/24 dev eth0.10

# На коммутаторе (пример CLI)
# port 1: trunk, allowed VLANs 10,20
# port 2: access, vlan 10
# (конкретные команды зависят от модели, пример для Cisco)
configure terminal
interface GigabitEthernet1/0/1
 description Подключение к серверу с PCIe‑bars
 switchport mode trunk
 switchport trunk allowed vlan 10,20
 exit
interface GigabitEthernet1/0/2
 description Подключение к отдельному серверу
 switchport mode access
 switchport access vlan 10
 exit
end
write memory

Последовательно проверяем, что VLAN‑интерфейс получил адрес и может ping‑иться:

bash
ping -c 3 10.0.10.2

Если ping проходит, связь между портом и VLAN‑интерфейсом установлена.

Примечание. Для стабильного драйвера PCIe‑баров рекомендуется использовать ядро 6.5 и новее, где уже включена поддержка BAR‑ширинга. Последний патч, исправляющий регресс в Ubuntu 22.04, доступен в Патч для ядра Linux в Ubuntu не вышел три недели.


Тестирование связности и пропускной способности

После того как физический уровень и VLAN‑маркинг настроены, проверяем пропускную способность между серверами, подключёнными к коммутатору. Самый простой способ – воспользоваться iperf3. Ниже пример теста между двумя серверами, каждый из которых имеет один 32 ГБ PCIe‑бар.

bash
# На сервере‑клиенте (IP 10.0.0.1)
iperf3 -c 10.0.0.2 -t 30 -i 5
bash
# На сервере‑хосте (IP 10.0.0.2)
iperf3 -s

Вывод покажет среднюю пропускную способность, потерю пакетов и дисперсию. Для более детального анализа используем ethtool -S для получения статистики ошибок и rx/tx‑байтов.

bash
ethtool -S eth0 | grep -E 'errors|dropped| multicast'

Если результаты показывают значительные потери, проверяем настройки коммутатора:

bash
# На коммутаторе (Cisco‑like)
show interfaces GigabitEthernet1/0/1
show interfaces GigabitEthernet1/0/2

Важно, чтобы ни один из портов не был в режиме half‑duplex, а скорость совпадала (10 GbE – full‑duplex).

Для проверки «предсказуемости» соединения удобно запустить ping в длительном режиме и смотреть на jitter:

bash
ping -i 0.2 -c 1000 10.0.0.2

Если jitter стабильно < 1 мс, а потеря пакетов = 0, то связь удовлетворительна.

Ссылка на практические рекомендации – Навыки для реальных инженеров: практические практики описывает методику построения нагрузки и интерпретацию результатов.


Итого: базовая настройка портов и VLAN – это небольшая, но обязательная подготовка, без которой дальнейшие тесты не дадут осмысленных данных. Тестирование пропускной способности с iperf3 и проверка статистики интерфейса позволяют убедиться в «предсказуемости» работы четырёх 32 ГБ PCIe‑bars в Linux‑окружении.

Оптимизация и стабильность

### Тюнинг параметров ядра и сетевого стека

Для стабильного размещения четырёх 32 ГБ PCIe‑bars за коммутатором важно выровнять параметры ядра, которые регулируют сетевой поток и память. Ниже пример конфигурации в /etc/sysctl.d/99-network.conf:

bash
# Максимальное количество соединений в очереди
net.core.somaxconn = 65535

# Позволить переиспользовать TIME_WAIT сокеты
net.ipv4.tcp_tw_reuse = 1

# Уменьшить время жизни TIME_WAIT
net.ipv4.tcp_fin_timeout = 15

# Увеличить размеры сокетов
net.core.rmem_max = 12582912
net.core.wmem_max = 12582912
net.ipv4.tcp_rmem = 4096 87380 12582912
net.ipv4.tcp_wmem = 4096 65536 12582912

# Параметры keepalive
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5

# Ограничение на количество сетевых интерфейсов
net.core.netdev_max_backlog = 5000

# SYN‑backlog
net.ipv4.tcp_max_syn_backlog = 4096

# ZFS‑специфичные настройки (если используется ZFS)
# Увеличить кэш vdev‑ов
zfs_vdev_cache_size = 1G
# Установить таймаут TXG
zfs_txg_timeout = 5
# Ограничить async‑write активность
zfs_vdev_async_write_max_active_time = 5
zfs_vdev_async_write_min_time = 1

После изменения параметров применяем их без перезагрузки:

bash
sudo sysctl --system

Проверка – убедиться, что новые значения загружены:

bash
sysctl -a | grep -E 'somaxconn|tcp_tw_reuse|tcp_fin_timeout|rmem_max|wmem_max'

Если в системе используется AF_XDP или XDP, включите их в ethtool:

bash
sudo ethtool -K eth0 xdp on

Связь с другими материалами – подробный разбор параметров ядра можно найти в статье Патч для ядра Linux в Ubuntu не вышел три недели.


### Мониторинг и алерты

Стабильность инфраструктуры проверяется не только на этапе настройки, но и в режиме реального времени. Наиболее удобный стек – Prometheus + node_exporter + Alertmanager + Grafana.

Метрики, которые стоит отслеживать

МетрикаОписаниеПример запроса
node_network_receive_bytes_totalОбъём принятых байтовrate(node_network_receive_bytes_total[1m])
node_network_transmit_bytes_totalОбъём отправленных байтовrate(node_network_transmit_bytes_total[1m])
node_cpu_seconds_totalCPU‑время в режиме пользователяrate(node_cpu_seconds_total[1m])
zfs_vdev_rdops_totalЧтение операций ZFSrate(zfs_vdev_rdops_total[1m])
zfs_vdev_wrops_totalЗапись операций ZFSrate(zfs_vdev_wrops_total[1m])

Пример конфигурации prometheus.yml

yaml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['10.0.0.5:9100', '10.0.0.6:9100']
    metrics_path: /metrics
    scheme: http

  - job_name: 'zfs'
    static_configs:
      - targets: ['10.0.0.5:9100']
    metrics_path: /metrics
    scheme: http

Правило оповещения в Alertmanager

yaml
groups:
  - name: network-stability
    rules:
      - alert: HighNetworkReceive
        expr: rate(node_network_receive_bytes_total[5m]) > 10Gbps
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Высокий приём сетевого трафика на {{ $labels.instance }}"
          description: "Скорость приёма превысила 10 Gbps в течение 2 минут."

      - alert: ZFSVdevDegraded
        expr: zfs_vdev_state{state!="ONLINE"} == 1
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "ZFS‑устройство в деградированном состоянии"
          description: "Один из vdev‑ов не в режиме ONLINE."

Systemd‑юнит для node_exporter

ini
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=exporter
Group=exporter
ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfiles
Restart=always

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

Практические рекомендации

  • Регулярно проверяйте dmesg и journalctl -u node_exporter – ранние ошибки часто указывают на конфликт драйверов PCIe.
  • Настройте systemd watchdog (например, WatchdogSec=30s) – если процесс «зависает», systemd автоматически его перезапустит.
  • Для ZFS – включайте zfs_snapdir и zfs_auto_snapshot только при необходимости, иначе нагрузка на диски возрастает.
  • Тестируйте производительность через iperf3 и fio в режиме «постоянной нагрузки», чтобы убедиться, что коммутатор и PCIe‑bars не становятся узким местом.

Связь с другими материалами – методика построения систем мониторинга описана в статье Навыки для реальных инженеров: практические практики.

Соблюдая указанные настройки и регулярно проверяя метрики, вы обеспечите предсказуемую работу четырёх 32 ГБ PCIe‑bars в Linux‑окружении, минимизируя риск падения сервисов.

Поделиться:TelegramX / TwitterVK

Читайте также