Перейти к содержанию
Telegram
Публикация AiManual

Как скрытый слот PCIe 2.0 x4 уничтожил производительность 4x RTX 3090 и как это исправить: полный гайд по диагностике multi-GPU rig

Реальный кейс: слот PCIe 2.0 x4 убил производительность 4x RTX 3090. Узнайте, как диагностировать и исправить проблему с multi-GPU rig. Команды, настройки, сове

Коротко

Что будет в материале

  1. 01

    Сборка мечты обернулась кошмаром

  2. 02

    Почему производитель пишет «x16», а работает «x4»

  3. 03

    Как переставить карты, чтобы не потерять производительность

  4. 04

    Три команды, которые спасут вашу сборку

Сборка мечты обернулась кошмаром

Вы собрали четыре RTX 3090. 96 ГБ VRAM на столе. Llama 3.1 70B запускается за секунду, но скорость генерации — жалкие 35 токенов в секунду. Вы проверяете vLLM, перебираете бенчмарки — результат стабильно ниже ожидаемого. Первая мысль: «карты бракованные». Вторая: «vLLM халтурит». Третья — правильная: «слоты PCIe врут».

Я наступил на те же грабли. Три недели диагностики, десятки перестановок карт, перепрошивок BIOS и чтения даташитов. В итоге всё упёрлось в один-единственный слот, который физически выглядел как PCIe x16, а электрически работал на PCIe 2.0 x4. Четыре карты тянули одну модель, а одна из них задыхалась на пропускной способности 2 ГБ/с. Когда я переставил карту в другой слот — скорость взлетела до 53 токенов/с.

Похожий сценарий встречается чаще, чем кажется. Физически слоты могут быть x16, но через чипсет идут на x4, особенно на платформах Ryzen/HEDT. Не верьте глазам — верьте lspci.

В этой статье я разберу, как выявить скрытые узкие горлышки PCIe, перераспределить карты и выжать из четырёх RTX 3090 максимум. Все команды актуальны на июнь 2026 года.

Почему производитель пишет «x16», а работает «x4»

Главная ловушка multi-GPU: количество линий PCIe, которые физически подведены к слоту, не всегда совпадает с заявленным. На материнских платах с двумя и более слотами x16 часто реализована схема x8/x8 или x8/x4/x4. Третий и четвёртый слоты подключаются через чипсет, и их лимит — 4 линии PCIe 2.0 или 3.0. При этом слот маркируется как «x16 mechanical» — вы можете вставить карту, и она заработает, но на скорости PCIe 2.0 x4.

RTX 3090 — прожорливая карта. Для инференса LLM она постоянно гоняет веса и активации. Даже при batch size = 1 один слой может требовать десятки мегабайт. Если пропускная способность шины всего 2 ГБ/с (PCIe 2.0 x4), карта будет простаивать, ожидая данные, пока остальные три бездельничают. В результате общая производительность падает не на 25%, а на 30–40%, потому что P2P-обмены тоже тормозят.

1 Проверка линков — первая команда

Не доверяйте BIOS и маркировке. Загрузите Linux и выполните:

sudo lspci -vvv | grep -A 10 "NVIDIA" | grep -E "(LnkSta:|LnkCap:|Width)"

Вы увидите нечто вроде:

LnkCap: Port #0, Speed 16GT/s, Width x16
LnkSta: Speed 2.5GT/s, Width x4

LnkCap — возможности слота, LnkSta — текущий режим. Если Speed 2.5GT/s (это PCIe 1.0) или 5GT/s (PCIe 2.0), а Width x4 и меньше — виновник найден. Настоящий слот PCIe 3.0 x16 должен показывать Speed 8GT/s, Width x16.

2 Топология P2P — вторая команда

Даже если линки выглядят нормально, возможна скрытая беда — недоступность peer-to-peer между картами через чипсет. Выполните:

nvidia-smi topo -m

Ищите строки вроде:

        GPU0    GPU1    GPU2    GPU3
GPU0     X      NV1     PIX     SOC
GPU1    NV1      X      SOC     SOC
GPU2    PIX     SOC      X      PHB
GPU3    SOC     SOC     PHB      X

Буквы обозначают тип связи: PHB (PCIe Host Bridge) — нормально, PIX (PCIe Switch) — хорошо, NV1 — NVLink, SOC (System on Chip) — доступ через системную память, PXB (PCIe Bridge) — через чипсет, NODE — через другой NUMA-узел. Если между парой GPU написано SOC или NODE, P2P обход будет идти через оперативную память — это в 10 раз медленнее. В моём случае GPU3 (та самая на PCIe 2.0 x4) соединялась со всеми через SOC.

Ошибка: игнорировать чипсетные линки. Многие считают, что раз слот физически большой, то он даст x16. Но на деле третий-четвёртый слоты часто работают через чипсет с 4 линиями. Хуже того — некоторые производители намеренно ограничивают скорость на нижних слотах для экономии.

Как переставить карты, чтобы не потерять производительность

Общий принцип: все четыре карты должны висеть на CPU PCIe контроллере, минуя чипсет. Идеально — иметь материнку с полным набором x8/x8/x8/x8 от CPU (например, на чипсете TRX40 или WRX80). Но большинство плат на LGA 1700/AM5 дают только два x16 от CPU. В таком случае третий-четвёртый слоты неизбежно будут чипсетными. Что делать?

  • Используйте райзер-кабели или PCIe-коммутаторы, чтобы вывести дополнительные линии. Подробнее читайте в статье 7 видеокарт на AM5 для LLM.
  • Переставьте карты так, чтобы на быстрых слотах были те, что участвуют в P2P чаще всего (например, GPU0-1-2 на CPU, а GPU3 — на чипсет, если вы используете tensor parallelism, это немного снизит урон).
  • Отключите лишние NVMe и SATA, которые отбирают линии у слотов.
  • Проверьте, не включён ли в BIOS режим «Auto» для скорости PCI Express — принудительно ставьте Gen3 или Gen4.

В моём случае перестановка GPU с «медленного» слота на CPU-слот сразу дала +40% скорости в llama.cpp. Рекомендую после каждой перестановки прогонять тест из нашего гайда по удвоению скорости в llama.cpp.

Три команды, которые спасут вашу сборку

После перестановки выполните проверку:

# 1. Убедитесь, что все четыре карты теперь на x16 или x8
sudo lspci -vvv | grep -A 10 "NVIDIA" | grep -E "(LnkSta:|LnkCap:|Width)"

# 2. Проверьте P2P-связи
nvidia-smi topo -m

# 3. Протестируйте скорость NVLink, если он есть
nvidia-smi nvlink -s

Если после перестановки какая-то карта всё ещё показывает Width x4 при вставке в слот, который должен быть x8, — возможно, райзер-кабель неисправен. О проблемах с длинными райзерами читайте в статье Почему не работают длинные PCIe 5.0 райзер-кабели.

Настройка драйвера NVIDIA для принудительного P2P

Даже если физически линки в порядке, драйвер может блокировать P2P на потребительских картах. В нашей статье Как выжать +50% скорости из vLLM на 4x RTX 3090 мы подробно разобрали патч драйвера. Кратко: нужно добавить опцию NVreg_EnablePCIeGen3=1 NVreg_EnableP2P=1 в параметры модуля nvidia.

Редкая ошибка: чипсетные линки и NUMA

На платформах AMD Threadripper и Intel Xeon W карты могут оказаться на разных NUMA-нодах. Тогда P2P идёт через системную память с задержкой в сотни наносекунд. Используйте numactl для привязки процессов и, если возможно, распределите tensor parallelism внутри одной NUMA-ноды. Для этого сгруппируйте GPU, которые физически висят на одном CPU, в одну команду CUDA_VISIBLE_DEVICES=0,1,2,3.

💡
Не советую смешивать в tensor parallelism карты с CPU-слотами и чипсетными слотами. Лучше использовать pipeline parallelism: быстрые карты для начала и середины, медленную — для последних слоев. Это даст +10–15% к общей пропускной способности.

Что в итоге: неочевидный совет

Когда вы переставили все карты, но одна всё равно показывает PCIe 2.0 x4 — не спешите менять материнку. Попробуйте загрузить Linux с pci=realloc и pci=assign-busses. Иногда BIOS криво распределяет линии, и ядро может перераспределить их корректно. Если не помогло — гуглите даташит вашего чипсета: часто третий слот физически подключен к чипсету всего на 4 линии, и это не лечится. Выход — покупать плату с полным набором слотов от CPU (например, Supermicro H12SSL-i) или использовать внешний PCIe-коммутатор, о котором я писал в статье 7 видеокарт на AM5 для LLM.

Помните: производитель материнской платы хочет продать вам дорогую модель с полным набором линий. Скрытые PCIe 2.0 x4 — это не баг, а маркетинговый ход, чтобы сэкономить на дешёвых платах. Не дайте себя обмануть: проверяйте lspci до того, как начнёте оптимизировать софт.

Подписаться на канал