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