Диагностика PCIe 2.0 x4 на 4x RTX 3090: полный гайд | AiManual
AiManual Logo Ai / Manual.
04 Июн 2026 Гайд

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

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

Реклама
hor_partv1

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

Вы собрали четыре 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 до того, как начнёте оптимизировать софт.

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