PCIe 3/4/5/6: що змінюється для реальних користувачів

Було корисно?

Ваш «швидкий» масив NVMe повзе, ваші GPU дивним чином недоотримують дані, а новий сервер з усіма блискучими абревіатурами дає таку саму
пропускну здатність, як і старий. Хтось каже «вузьке місце PCIe» — і всі кивають, ніби розуміють.

PCIe — це тиха «трубопровідна» інфраструктура, яка вирішує, чи дійсно ваше сховище та акселератори отримають потрібні ресурси. Приріст поколінь виглядає лінійним — 3, 4, 5, 6 —
але практичний досвід хаотичний: бюджет ліній, топологія, BIOS за замовчуванням, ретаймери, розташування в NUMA і купа маленьких «залежить від», які охоче
перетворяться на великий інцидент о 2:00 ночі.

Що змінюється від PCIe 3 до 6 (і що залишилось незмінним)

Головна зміна між поколіннями PCIe — це пропускна здатність на лінію. Дрібний шрифт — наскільки складно доставити ту пропускну здатність по справжній материнській платі,
з реальними довжинами трас, реальними райзерами, реальними бекплейнами та корпоративними вимогами.

Що змінюється

  • Пропускна здатність на лінію: кожне покоління до PCIe 5 приблизно подвоює сиру швидкість передачі (GT/s). PCIe 6 знову подвоює, але змінює схему кодування й фреймінгу.
  • Вимоги до цілісності сигналу: на PCIe 5 і особливо на PCIe 6 «просто проложити трасу» перестає працювати. Появляються ретаймери, кращі матеріали та жорсткіші макети.
  • Поведінка помилок у логах: вищі швидкості значать менший запас; маргінальні канали проявляються виправленими помилками до явного збою.
  • Економіка ліній платформи: більше пристроїв конкурують за кінцеву кількість ліній CPU; виробники використовують біфуркацію, свічі й хитре підключення слотів.
  • Термальні й енергетичні аспекти: Gen5 NVMe може бути швидким і одночасно значною мірою нагрівати повітря в дата-центрі. Пропускна здатність — опціональна; фізика — ні.

Що не змінюється (надто сильно)

  • Очікування щодо затримки: покоління PCIe не зменшують затримку вводу-виводу автоматично так само, як подвоюють пропускну здатність. Багато «повільних» застосунків чекають у чергах, а не обмежені каналом.
  • «x16» усе ще означає «x16 ліній», а не гарантію: фізичний слот x16 може бути електрично x8 або x4, або зменшувати ширину під час роботи.
  • Топологія важить більше за маркетинг: два Gen4 x4 NVMe за одним апстрімом можуть конкурувати так само, як брати на задньому сидінні машини.

Моє операційне правило: не переходьте на нове покоління PCIe заради «швидкості», якщо ви не можете вказати конкретний пристрій і навантаження, що вже досягає межі лінка.
Інакше ви купуєте опціональну пропускну здатність і обов’язкову складність.

Жарт №1: пропускна здатність PCIe — як пуста конференц-зала: всі вважають, що вона доступна, поки не почнеться зустріч.

Ментальна математика пропускної здатності

Якщо ви не можете оцінити пропускну здатність PCIe за 10 секунд, ви прийматимете погані рішення щодо оновлення й станете легкою здобиччю для презентацій у слайдах.
Ось ментальна модель, яка витримує роботу на виклику.

Ключові терміни (використовуйте їх правильно на зустрічах)

  • GT/s: гіга-трансферів на секунду. Не те саме, що гігабіти на секунду; кодування має значення.
  • Накладні витрати кодування: PCIe 3–5 використовують 128b/130b (прибл. 1.54% накладних). PCIe 1–2 використовували 8b/10b (20% накладних). PCIe 6 використовує нову схему з FLIT і FEC.
  • Ширина лінку: x1, x4, x8, x16 ліній. Ширина і швидкість перемножуються.
  • Бідірекційність: пропускна здатність PCIe вказана для одного напрямку. Не додавайте обидва напрями, якщо ваше навантаження дійсно не читає і не записує одночасно на повних швидкостях.

Правило великого пальця: пропускна здатність на одну лінію (в одному напрямку)

Орієнтовна ефективна пропускна здатність (після 128b/130b) на лінію:

  • PCIe 3.0: ~1 GB/s на лінію → x4 ≈ 4 GB/s, x16 ≈ 16 GB/s
  • PCIe 4.0: ~2 GB/s на лінію → x4 ≈ 8 GB/s, x16 ≈ 32 GB/s
  • PCIe 5.0: ~4 GB/s на лінію → x4 ≈ 16 GB/s, x16 ≈ 64 GB/s
  • PCIe 6.0: його позиціонують як «ще одне подвоєння», але реальна корисна пропускна здатність більше залежить від реалізації, FEC і шаблонів навантаження, ніж у попередніх поколіннях.

Практична інтерпретація:

  • Типовий NVMe SSD — це x4. Якщо це Gen3 x4, в реальному світі він обмежиться приблизно ~3–3.5 GB/s. Gen4 x4 може давати ~7 GB/s. Gen5 x4 може досягати ~12–14 GB/s на послідовних читаннях — якщо не тротлити термічно.
  • 100GbE NIC має лінійний рівень ~12.5 GB/s до накладних витрат. Це означає, що Gen3 x16 (≈16 GB/s) може його витримати, а Gen3 x8 (≈8 GB/s) — ні без компромісів.

Якщо запам’ятати лише одне: пропускна здатність — це просто; спільна пропускна здатність — місце, де кар’єри гинуть.

Хто фактично виграє: NVMe, GPU, мережі та незвичні карти

NVMe сховище

NVMe — найпомітніший випадок «PCIe робить швидше». Але лінк — лише одні ворота.
Інші ворота: контролер флешу, NAND, прошивка, поведінка глибини черги, файлові системи, CPU-час на IO та шаблон IO вашого застосунку.

  • Gen3 → Gen4: важливо для топових SSD і масивів з багатьма дисками при послідовних читаннях/записах або інтенсивному паралельному IO.
  • Gen4 → Gen5: корисно не для такої широкої кількості робочих навантажень, як здається. Воно блищить у великих послідовних передачах, відновленнях RAID, швидких чекпойнтах і деяких аналітичних конвеєрах.
  • Випадкові IO: часто обмежені затримкою пристрою й накладними CPU, а не пропускною здатністю каналу. Якщо p99-затримка визначається програмним стеком, Gen5 вам не допоможе.

GPU та акселератори

Для багатьох GPU-навантажень PCIe не є основним шляхом передачі даних, коли дані вже опинились на карті. Але «коли дані вже на карті» — це дуже велика частина роботи.
Тренінг може бути менш чутливим, ніж inference-пайплайни, що безперервно стримлять дані, а комунікація між GPU може використовувати NVLink/Infinity Fabric, а не PCIe.

  • PCIe x8 vs x16: для багатьох обчислювальних задач ви можете цього не помітити. Для конвеєрів з великим споживанням даних — обов’язково помітите.
  • Peer-to-peer: топологія PCIe визначає, чи можуть GPU ефективно робити P2P. Свіч або неправильний root complex може зіпсувати все.

Мережеве обладнання (25/100/200/400GbE)

Тут неправильні уявлення про PCIe дорого коштують. NIC потребує не лише лінійної пропускної здатності; йому потрібна ефективність DMA, пом’якшення переривань, CPU-локальність і достатній резерв PCIe, щоб мікроудари не перетворювалися на втрати пакетів.

  • 100GbE: комфортно на Gen4 x8, на Gen3 x16 — на межі для завантажених систем, а на Gen3 x8 — погана ідея, якщо ви не готові до компромісів.
  • 200/400GbE: ви фактично проектуєте топологію PCIe, а не просто додаєте NIC. Gen5 і ретельний розподіл ліній стають частиною мережевого дизайну.

HBA, RAID-карти, DPU, карти захоплення, «той FPGA»

Спеціалізовані карти часто мають дивні обмеження: фіксовані ширини лінків, суворі вимоги до слотів, великі BAR-мапінги, прошивкові баги та талан для збоїв, що виглядають як «проблема Linux».
З PCIe 5/6 карти також можуть вимагати ретаймерів, щоб бути стабільними на повній швидкості.

Топологія: лінії, root complexes, свічі і чому ваш x16 слот бреше

Покоління PCIe — це обмеження швидкості. Топологія — мережа доріг. Більшість реальних проблем з продуктивністю — не «обмеження швидкості низьке», а «ви провели трасу автостради через паркувальний майданчик».

Бюджет ліній: єдина таблиця, яку варто підтримувати

CPU відкривають кінцеву кількість PCIe-ліній. Ці лінії розподіляються по root-портах (root complex). Далі материнська плата мапує фізичні слоти й вбудовані пристрої на ці порти.
Додавати другий CPU означає більше ліній — плюс складність NUMA і трафік між сокетами.

Практичні наслідки:

  • Один слот x16 може ділитися лініями з двома роз’ємами M.2.
  • Два слоти x16 можуть стати x8/x8 при одночасному встановленні карт.
  • «Вбудований» 10/25/100GbE може споживати цінні лінії, які ви вважали вільними.
  • Фронтальні NVMe-бекплейни часто використовують PCIe-свічі для розгалуження; ці свічі можуть оверсубскрайбити апстріми.

PCIe-свічі: корисні, але не магічні

PCIe-свіч — це пристрій розгалуження: один апстрім, багато даунстрімів. Він дозволяє багато NVMe-щойок без виділення x4 на диск прямо до CPU.
Але він також вводить:

  • Оверсубскрипцію: 16 дисків за свічем з апстрімом x16 означає, що диски ділять пропускну здатність. Це може бути нормальним, а може стати вузьким місцем.
  • Додаткову затримку: зазвичай мала, але іноді помітна для наднизьколатентних навантажень.
  • Режими відмов: свіч або його прошивка можуть зависнути і забрати весь сегмент із собою.

Біфуркація: функція BIOS, що вирішує вашу долю

Біфуркація розбиває широкий лінк на кілька вузьких (наприклад, x16 → 4×x4). Так працюють карти-носії з чотирма M.2 без свічу.
Але біфуркація потребує підтримки платформи й правильних налаштувань BIOS.

Якщо ви вставили 4×M.2 плату в надії побачити чотири диски, а бачите лише один — це не «настрій Linux». Це ви не ввімкнули біфуркацію.

NUMA-локальність: мовчазний вбивця пропускної здатності

У двосокетних системах PCIe-пристрій приєднаний до root complex одного CPU. Якщо ваше навантаження працює на іншому сокеті, кожний DMA і кожне переривання може їхати по міжсокетному інтерконекту.
Симптоми виглядають як «PCIe повільний», але виправлення — прив’язка CPU й правильне розміщення пристрою, а не нова материнська плата.

PCIe 6.0: чому це не «просто вдвічі швидше»

PCIe 6.0 — це момент, коли індустрія перестає вдавати, що підвищення частоти — безкоштовний десерт.
Замість лише збільшення GT/s, PCIe 6 змінює упаковку даних (FLIT-режим) і додає корекцію помилок вперед (FEC).

Що це означає операційно

  • Більша стійкість до шуму, більша складність: FEC допомагає витримувати вищі швидкості, але додає роботу кодування/декодування та змінює видимість помилок.
  • Інші компроміси затримки: FEC і FLIT-фреймінг можуть додавати невелику затримку, одночасно дозволяючи системі працювати швидше загалом. Чи «відчуєте» ви PCIe 6 — залежить від чутливості навантаження.
  • Більш жорстка цілісність сигналу: плати, райзери, кабелі і бекплейни повинні бути спроектовані під це. «Вмикається на Gen6» — не те саме, що «стабільно працює на Gen6 під навантаженням 18 місяців».

Більшість організацій повинні ставитися до PCIe 6 як до архітектурного вибору, який приймають, коли екосистема його вимагає (нові NIC, акселератори, композабельна інфраструктура),
а не як до випадкового «апгрейду сховища».

Цікаві факти та коротка історія (щоб утримати модель у голові)

  1. PCIe замінив PCI/AGP переходом на послідовні лінії: серійні лінії PCIe були відмовою від широких паралельних шин, які страждали від синхронізації та розбігу сигналів.
  2. PCIe 1.0 і 2.0 використовували 8b/10b кодування: ви «втрачали» 20% сирої пропускної здатності на накладні. 128b/130b у PCIe 3.0 був великим практичним стрибком.
  3. NVMe не просто «використовував PCIe»: його створили для зменшення програмних накладних і підтримки глибоких черг у порівнянні з AHCI, що був призначений для шпиндельних дисків.
  4. M.2 — це форм-фактор, а не протокол: M.2 може нести SATA або PCIe/NVMe. Плутати ці речі — класична помилка закупівель.
  5. «x16 слот» став культурним артефактом від GPU: сервери зберегли фізичний стандарт, але електричне підключення дуже відрізняється вендорів і SKU.
  6. Ретаймери стали мейнстрімом з Gen5: попередні покоління часто обходилися без або з ре-драйверами; Gen5 штовхає системи до активного кондиціювання сигналу.
  7. PCIe-свічі тихо дали старт ері NVMe-серверів: щільні фронтальні NVMe-щойки часто — історія про свічі, а не про «безліч ліній».
  8. Resizable BAR перейшов з нішевого до мейнстріму: більші BAR-мапінги покращують доступ CPU до деяких пристроїв; підтримка платформи доросла з часом.
  9. Виправлені помилки — не «нормально»: в корпоративних системах дедалі частіше відстежують рівні виправлених помилок AER, бо вони передбачають майбутню нестабільність на вищих швидкостях.

Три корпоративні міні-історії з реальних випадків

Міні-історія #1: інцидент через хибне припущення

Середня компанія розгорнула нові хости баз даних з «Gen4 повсюди». Мета була проста: більше NVMe-пропускної здатності для швидших аналітичних запитів.
Хости були двосокетними, заповнені U.2 NVMe у фронтальних відсіках і мали потужний NIC для реплікації.

Хибне припущення: кожен NVMe-диск мав виділений x4 шлях до CPU. Насправді фронтальний бекплейн використовував PCIe-свіч з одним апстрімом.
Під звичайним OLTP ніхто не помічав. Під час нічних пакетних задач весь кластер перетворився на сумну трубу: час виконання запитів подвоївся, затримка реплікації зросла,
а графіки «використання диска» виглядали як сучасне мистецтво.

Інженер на виклику пройшов звичний ритуал: звинуватив файлову систему, ядро, вендора сховища, фазу Місяця.
Потім вони провели кілька спрямованих тестів: один диск поодинці досяг очікуваної пропускної здатності; багато дисків разом зупинялися на підозріло круглій мегапризначеній величині, що збігалася з апстрімом.
Плато було в топології, а не в дисках.

Виправлення було нудним: перерозподілити, які відсіки заповнені в межах домену свічу, переставити реплікаційний NIC з загального root complex, і прийняти, що сервер
спроектований для щільності ємності, а не для повного насичення пропускної здатності. Вони також оновили внутрішній чек-лист закупівель, щоб вимагати опублікованої діаграми топології PCIe.
Раптом «Gen4 повсюди» стало «Gen4 там, де важливо», і інциденти припинилися.

Міні-історія #2: оптимізація, що відкотилася

Команда, що працювала з GPU inference, хотіла зменшити затримку. Вони помітили, що GPU налагоджуються на Gen4, і подумали: «Давайте примусимо Gen5 у BIOS. Швидший лінк — швидший inference».
Платформа підтримувала це, GPU підтримували, зміна зайняла 30 секунд.

Протягом дня все виглядало нормально. Потім почалися періодичні збої: випадкові помилки CUDA, раптові скидання драйвера і рідкісні зависання вузлів під піковим навантаженням.
У логах з’явився AER-спам — спочатку виправлені помилки, потім іноді невиправлені. Перезавантаження «вирішувало» проблему, що означає: вона повернеться в наступну відпустку.

Справжня причина була в маржинальності сигналу. Ноди використовували довгі райзери і щільний шасі. На швидкостях Gen5 канал працював з меншим запасом, ніж у бюджетній авіакомпанії.
FEC не застосовувався (Gen5), і виправлені помилки були раннім попередженням, що фізичний канал маргінальний.

Відкат був негайним: повернення слотів в Auto/Gen4, зниження рівня помилок практично до нуля і відновлення стабільності. Чистіше стало й затримка, бо система перестала повторювати й затримуватись.
Пізніше вони розгорнули валідаційну платформу Gen5 з потрібними ретаймерами, коли дійсно знадобилася пропускна здатність для прийому даних на багато-GPU.

Міні-історія #3: нудна, але правильна практика, що врятувала день

Команда корпоративного сховища мала політику, яка виглядала дратівливо бюрократично: перед введенням хоста в продукцію вони фіксували «пакет правди про апарат».
Він включав топологію PCIe, погоджені швидкості/ширини лінків, версії прошивок і базовий fio-профіль для кожного NVMe.

Через місяці партія серверів почала повідомляти спорадичні таймаути NVMe. Не достатньо для провалу перевірок здоров’я. Достатньо, щоб зіпсувати p99-затримку і розсердити команду бази даних.
Вендор наполягав, що це «проблема софту», бо диски пройшли SMART.

Команда сховища порівняла поточний пакет правди з базовим. Одна деталь кидалась у вічі: кілька дисків тепер налагоджувалися на меншу ширину лінка, ніж раніше.
Не швидкість — ширина. x4 стало x2 у підмножини відсіків.

Це вказало прямо на фізичну проблему: посадка у роз’ємі бекплейна, маргінальний кабель або збійний ретаймер. Вони відкрили шасі,
перепідключили бекплейн і лінки повернулися до x4 з чистими лічильниками помилок. Таймаути зникли.
Жодного героїчного дебагу. Просто докази і базова лінія для порівняння.

Практичні завдання: команди, виводи та рішення (12+)

Це перевірені у полі перевірки. Кожна має: команду, що ви повинні побачити, і рішення, яке потрібно прийняти.
Запускайте їх на Linux-хостах, де ви підозрюєте вузьке місце PCIe або неправильну налагодженість лінка.

Task 1: Identify the device and its PCIe address

cr0x@server:~$ lspci -nn | egrep -i 'non-volatile|ethernet|vga|3d|infiniband'
0000:01:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller [144d:a808]
0000:3b:00.0 Ethernet controller [0200]: Mellanox Technologies MT28908 Family [ConnectX-6] [15b3:101b]
0000:af:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:20b0]

Значення: Тепер у вас є BDF-адреси (domain:bus:device.function) як-от 0000:01:00.0.
Рішення: Використовуйте BDF у наступних командах, щоб перевіряти ширину лінка, швидкість і лічильники помилок для конкретного пристрою, що вас цікавить.

Task 2: Check negotiated link speed and width (the thing everyone forgets)

cr0x@server:~$ sudo lspci -s 0000:01:00.0 -vv | egrep -i 'LnkCap:|LnkSta:'
LnkCap: Port #0, Speed 16GT/s, Width x4, ASPM L1, Exit Latency L1 <64us
LnkSta: Speed 8GT/s (downgraded), Width x2 (downgraded)

Значення: Пристрій підтримує Gen4 x4 (16GT/s x4), але зараз працює на рівні Gen3-ish (8GT/s) і шириною x2.
Рішення: Розглядайте це як неправильну конфігурацію або проблему цілісності сигналу, а не «повільний SSD». Перевірте проводку слоту, біфуркацію, налаштування BIOS, райзери і помилки AER.

Task 3: Find the parent port and see if the bottleneck is upstream

cr0x@server:~$ sudo lspci -t
-[0000:00]-+-00.0  Host bridge
           +-01.0-[01]----00.0  Non-Volatile memory controller
           \-03.0-[3b]----00.0  Ethernet controller

Значення: Ви бачите дерево: root complex → шина → пристрій. Це допомагає зрозуміти, що ділить апстрім.
Рішення: Якщо кілька важких пристроїв знаходяться за одним апстрім-портом або свічем, плануйте конкуренцію або перемістіть пристрої на інші root complex, якщо можливо.

Task 4: Confirm NVMe link information via sysfs (fast and scriptable)

cr0x@server:~$ readlink -f /sys/class/nvme/nvme0/device
/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0

cr0x@server:~$ cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/current_link_speed
8.0 GT/s

cr0x@server:~$ cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/current_link_width
2

Значення: Та сама історія, що і в lspci, але дружніше для автоматизації.
Рішення: Побудуйте перевірку для парку серверів, яка оповіщатиме, коли критичні пристрої домовляються про швидкість/ширину нижче очікуваної.

Task 5: Check for PCIe AER errors in the kernel log

cr0x@server:~$ sudo dmesg -T | egrep -i 'AER:|pcieport|Corrected error|Uncorrected'
[Sat Jan 10 10:21:34 2026] pcieport 0000:00:01.0: AER: Corrected error received: 0000:01:00.0
[Sat Jan 10 10:21:34 2026] nvme 0000:01:00.0: AER: [0] RxErr

Значення: Виправлені помилки означають, що лінк відновлюється після проблем фізичного рівня. Це часто корелює зі зниженнями швидкості, повторними спробами або нестабільністю під навантаженням.
Рішення: Якщо виправлені помилки часті, припиніть «оптимізації» і почніть стабілізацію: перепідключення, заміна райзерів, оновлення прошивок або зниження домовленої швидкості (Auto/Gen4 замість примусового Gen5).

Task 6: Inspect PCIe capabilities and max payload settings

cr0x@server:~$ sudo lspci -s 0000:3b:00.0 -vv | egrep -i 'MaxPayload|MaxReadReq|DevCap:|DevCtl:'
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
DevCtl: Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported+
        MaxPayload 256 bytes, MaxReadReq 512 bytes

Значення: Пристрій підтримує 512B payload, але налаштований на 256B. Це може бути важливо для високопропускних пристроїв (часто NIC).
Рішення: Не міняйте це без потреби у проді. Якщо у вас доведена проблема з пропускною здатністю і є вказівки від вендора, узгодьте розмір payload по всьому шляху. Інакше лишіть як є.

Task 7: Confirm NVMe drive capabilities and current performance ceiling

cr0x@server:~$ sudo nvme id-ctrl /dev/nvme0 | egrep -i 'mn|fr|rab|mdts|oacs'
mn      : ACME Gen4 SSD 3.84TB
fr      : 2B1QGXA7
rab     : 6
mdts    : 9
oacs    : 0x17

cr0x@server:~$ sudo nvme list
Node             SN                   Model                      Namespace Usage                      Format           FW Rev
---------------- -------------------- -------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1      S1234567890          ACME Gen4 SSD 3.84TB       1         3.84  TB /   3.84  TB    512   B +  0 B  2B1QGXA7

Значення: У вас є версія прошивки та ідентифікація моделі для підтримки вендора, і MDTS підказує максимальні розміри передач.
Рішення: Якщо ви бачите зниження лінка, у вас є точна ідентифікація пристрою для кореляції з відомими проблемами прошивки чи сумісності платформи.

Task 8: Measure real throughput with fio (and interpret it correctly)

cr0x@server:~$ sudo fio --name=seqread --filename=/dev/nvme0n1 --direct=1 --ioengine=io_uring --bs=1m --iodepth=16 --rw=read --numjobs=1 --runtime=20 --time_based --group_reporting
seqread: (groupid=0, jobs=1): err= 0: pid=21456: Sat Jan 10 10:33:10 2026
  read: IOPS=6100, BW=6100MiB/s (6396MB/s)(119GiB/20001msec)

Значення: ~6.1 GiB/s вказує, що Gen4 x4 ймовірний; Gen3 x4 зазвичай буде нижчим.
Рішення: Якщо пропускна здатність набагато нижча за очікувану, зіставте з шириною/швидкістю лінка. Якщо лінк в порядку — перевірте термальне троттлінг, насичення CPU, файлову систему або рівень RAID.

Task 9: Check for NVMe thermal throttling signs

cr0x@server:~$ sudo nvme smart-log /dev/nvme0 | egrep -i 'temperature|warning|critical|thm'
temperature                             : 78 C
warning_temp_time                       : 632
critical_temp_time                      : 0

Значення: Диск провів значний час вище своєї warning-температури. Це часто означає троттлінг під час бенчмарків або пакетних робіт.
Рішення: Покращіть повітряний потік, додайте радіатори, зменшіть щільність дисків у шасі або прийміть нижчу тривалу пропускну здатність. Апгрейд до Gen5 без охолодження — це самосаботаж.

Task 10: Check NIC PCIe link and ensure it matches line-rate ambitions

cr0x@server:~$ sudo lspci -s 0000:3b:00.0 -vv | egrep -i 'LnkCap:|LnkSta:'
LnkCap: Port #0, Speed 16GT/s, Width x8
LnkSta: Speed 16GT/s, Width x8

Значення: Gen4 x8 — хороша база для 100GbE; для 200GbE ви будете обережні залежно від накладних і патернів трафіку.
Рішення: Якщо 100GbE NIC показує Gen3 x8, очікуйте проблем під навантаженням. Перенесіть його в кращий слот або перегляньте очікування.

Task 11: Verify NUMA node locality for a PCIe device

cr0x@server:~$ cat /sys/bus/pci/devices/0000:3b:00.0/numa_node
1

cr0x@server:~$ lscpu | egrep -i 'NUMA node\(s\)|NUMA node1 CPU\(s\)'
NUMA node(s):                         2
NUMA node1 CPU(s):                    32-63

Значення: NIC приєднаний до NUMA-вузла 1. Якщо ваші мережеві потоки працюють на CPU 0–31, ви платите ціну міжсокетного трафіку.
Рішення: Прив’яжіть IRQ і процеси застосунків до локального NUMA-вузла для високої пропускної здатності або низької затримки.

Task 12: Inspect interrupt distribution (spot the “everything on CPU0” classic)

cr0x@server:~$ cat /proc/interrupts | egrep -i 'mlx|nvme' | head
  88:  1023491    2345    1987    2101  IR-PCI-MSI 524288-edge  mlx5_comp0@pci:0000:3b:00.0
  89:  1098833    2401    2011    2190  IR-PCI-MSI 524289-edge  mlx5_comp1@pci:0000:3b:00.0
 120:   883221    1900    1750    1802  IR-PCI-MSI 1048576-edge  nvme0q0@pci:0000:01:00.0

Значення: Переривання розподілені по CPU. Якщо ви бачите один CPU, що виконує всю роботу, пропускна здатність падає, а затримка зростає.
Рішення: Якщо є дисбаланс, налаштуйте IRQ affinity (або ввімкніть irqbalance обережно) і вирівняйте з NUMA-локальністю.

Task 13: Check CPU frequency throttling that masquerades as “PCIe bottleneck”

cr0x@server:~$ sudo turbostat --Summary --quiet --interval 2 --num_iterations 3
Avg_MHz  Busy%  Bzy_MHz  TSC_MHz  IRQ  SMI  CPU%c1  CPU%c6
  1875    92.1    2035     2400  152k    0    0.2    6.8

Значення: Якщо Avg_MHz значно нижче очікуваного під навантаженням, ліміти потужності або термальний троттлінг можуть обмежувати обробку IO.
Рішення: Не купуйте лінії PCIe 5, щоб «вилікувати» CPU, що працює на півшвидкості. Виправте охолодження, ліміти потужності та профілі BIOS спочатку.

Task 14: Verify negotiated speed on the root port too (catch upstream downgrades)

cr0x@server:~$ sudo lspci -s 0000:00:01.0 -vv | egrep -i 'LnkCap:|LnkSta:'
LnkCap: Port #1, Speed 16GT/s, Width x16
LnkSta: Speed 8GT/s (downgraded), Width x16

Значення: Навіть якщо endpoint виглядає нормально, апстрім-порт може працювати на нижчій швидкості, обмежуючи все під ним.
Рішення: Шукайте налаштування BIOS, що примушують покоління, проблеми прошивки або цілісності сигналу, що впливають на весь сегмент.

Жарт №2: Примусити Gen5 у BIOS — як їхати швидше у тумані, бо спідометр показує більше.

Швидкий план діагностики (перший/другий/третій)

Коли продуктивність погана, потрібна безжальна послідовність, яка швидко виведе вас до обмежувального фактора.
Ось версія для on-call.

Перший: перевірте, чи лінк такий, яким ви його вважаєте

  • Перевірте LnkSta speed/width для підозрілого пристрою та його апстрім-порту (lspci -vv).
  • Перевірте sysfs current_link_speed/current_link_width для скриптової правди.
  • Рішення: Якщо відбулося пониження, зупиніться. Виправте топологію/фізику/BIOS перед подальшими бенчмарками.

Другий: перевірте нестабільність на фізичному рівні та повтори

  • Скануйте dmesg на предмет AER виправлених помилок; корелюйте з періодами навантаження.
  • Рішення: Спам виправлених помилок — не «нормально». Це система, що згорає у запасі. Зменшіть швидкість (Auto), перепідключіть, замініть райзери, оновіть прошивку.

Третій: ізолюйте, чи пристрій є межею, чи платформа

  • Бенчмарк одного пристрою (fio на одному NVMe; iperf або тест трафіку на одному NIC; GPU memcpy тести для host-to-device).
  • Масштабний бенчмарк (багато NVMe одночасно, кілька черг NIC, кілька GPU) і пошук плато.
  • Рішення: Плато на круглій величині, що відповідає апстріму або пропускній здатності root-порту, кричить «спільний вузький прохід» (свіч, апстрім або root-порт).

Четвертий (за потреби): перевірте NUMA і накладні CPU

  • NUMA-вузол пристрою і розподіл переривань.
  • Частота CPU/енергетика під навантаженням.
  • Рішення: Якщо є міжсокетний трафік або троттлінг CPU, виправте афінність і параметри платформи перед тим, як звинувачувати покоління PCIe.

Одна цитата, щоб утримувати реальність: Надія — не стратегія — парафразована ідея, яку часто цитують лідери інженерії в операціях.
Корисна частина: вимірюйте, потім приймайте рішення.

Типові помилки: симптоми → причина → виправлення

1) «Мій Gen4 SSD працює як Gen3»

Симптоми: послідовні читання плато ≈ ~3 GB/s; fio ніколи не перевищує цього; диск працює прохолодно і здорово.

Причина: пристрій домовився про Gen3 або зменшену ширину (x2) через проводку слоту, біфуркацію, райзер або BIOS, що примушує сумісність.

Виправлення: перевірте LnkSta; перемістіть диск/карту в відомо робочий слот; увімкніть біфуркацію; встановіть швидкість PCIe на Auto; оновіть BIOS і прошивку бекплейна.

2) «Швидко поодинці, але повільно з багатьма дисками»

Симптоми: один NVMe досягає очікуваної пропускної, 8+ дисків разом виходять на жорстку межу; затримка збільшується з конкурентністю.

Причина: оверсубскрипція PCIe-свічем або спільна пропускна здатність апстріму/root-порту.

Виправлення: спрямувати диски по доменах свічу; розподілити навантаження; використовувати більше апстрімів (залежить від платформи); прийняти оверсубскрипцію і налаштувати планування завдань.

3) «Після оновлення прошивки з’явилися дивні помилки PCIe»

Симптоми: нові виправлені помилки AER; іноді скидання пристрою; пониження лінку.

Причина: зміни параметрів еквалізації або новий дефолт швидкості Gen; маргінальний канал став видимим.

Виправлення: відкотіть/оновіть прошивку відповідно до вказівок вендора; встановіть Auto замість примусового покоління; перевірте сумісність ретаймерів/бекплейна.

4) «100GbE не може досягти лінійної швидкості»

Симптоми: пропускна здатність обмежується ≈60–80Gbps; високий CPU; втрати або паузи під навантаженням.

Причина: NIC знаходиться в Gen3 x8 слоті; переривання не розподілені; NUMA-невідповідність; занадто малий payload або неоптимальні налаштування.

Виправлення: помістіть NIC у Gen4 x8 або Gen3 x16; вирівняйте NUMA; перевірте переривання; налаштовуйте payload тільки з розумінням і тестуванням.

5) «Навчання GPU в порядку, inference-пайплайн стрибає»

Симптоми: використання обчислень падає; трансфери host-to-device домінують; p99-затримка стрибає.

Причина: ширина PCIe зменшена (x8), спільний root complex з NVMe або DMA через інший сокет.

Виправлення: перевірте ширину/швидкість GPU; перемістіть пристрої на інші root complex; прив’яжіть CPU-потоки до локального NUMA; уникайте сильної конкуренції зі сторони сховища на тому ж сегменті.

6) «Все виглядає нормально, але p99 IO-затримка погана»

Симптоми: бенчмарки пропускної здатності в порядку; але у застосунку p99-затримка висока; CPU завантажений у softirq або файлових шляхах.

Причина: програмні накладні, черги або конкуренція; не покоління PCIe.

Виправлення: профілювання (off-CPU time, IO scheduler, файлову систему); зменшення конкуренції; використовуйте io_uring де доречно; масштабування CPU і налаштування афінності.

Чек-лісти / покроковий план

Чек-лист A: перед купівлею обладнання (перестаньте платити за фантазійні лінії)

  1. Перелічіть пристрої за потребою в пропускній здатності: кількість NVMe, швидкості NIC, кількість GPU, будь-які HBA/DPUs.
  2. Розрахуйте потрібні лінії для пристрою (зазвичай x4 на NVMe, x8/x16 на NIC/GPU залежно від класу).
  3. Попросіть діаграму топології PCIe для конкретного шасі + материнської плати + опції бекплейна.
  4. Визначте, де є свічі і які ширини апстрімів.
  5. Підтвердіть підтримку біфуркації для будь-яких карт-носіїв.
  6. Підтвердіть наявність/вимоги ретаймерів для Gen5+ на ваших райзерах/бекплейнах.
  7. Вирішіть, чи ви надаєте перевагу: менше пристроїв на повній пропускній здатності, або більше пристроїв з оверсубскрипцією.

Чек-лист B: при введенні сервера в експлуатацію (звичка «пакет правди про апарат»)

  1. Збережіть lspci -nn і lspci -t виводи.
  2. Для кожного критичного пристрою: зафіксуйте LnkCap і LnkSta та статус апстрім root-порту.
  3. Записати версії прошивок: BIOS, BMC, NIC, NVMe.
  4. Запустіть single-device fio і невеликий multi-device стрес-тест (в межах безпечних лімітів).
  5. Перевірте dmesg на предмет AER помилок під час стресу.
  6. Збережіть цей пакет у вашій CMDB або в тікеті. Майбутнє «ви» скаже вам дякую.

Чек-лист C: при оновленні покоління PCIe (план «не зламати прод»)

  1. Доведіть, що поточна система обмежена лінком (плато + правильний статус лінка) перед тим, як витрачати гроші.
  2. Оновлюйте компоненти платформи як комплект: плата + райзери + бекплейн/ретаймери + прошивки. Змішувати очікування Gen5 з механікою ери Gen4 — хобі, а не стратегія.
  3. Валідуйте стабільність під найгіршим навантаженням і температурою. Не 30-секундний бенч.
  4. Моніторьте AER виправлені помилки і зниження лінків як першокласні SLO-сигнали.
  5. Якщо ви змушені примусово встановити покоління, робіть це тільки після валідації — і задокументуйте процедуру відкату.

Поширені запитання

1) Мені потрібен PCIe 5.0 для NVMe?

Лише якщо ваше навантаження може використати ту пропускну здатність. Багато баз даних і сервісів обмежені затримкою або CPU. Якщо ви виконуєте великі послідовні IO або інтенсивний паралельний інгест — Gen5 може допомогти.
Інакше Gen4 зазвичай оптимальне рішення за вартістю, терміками та здоровим глуздом.

2) Чому в LnkSta вказано «downgraded»?

Тому що переговори встановили нижчу швидкість/ширину через обмеження платформи, налаштування BIOS, якість кабелів/райзерів або проблеми цілісності сигналу.
Розглядайте це як конфігураційну/фізичну проблему, поки не доведено інше.

3) Пропускна здатність PCIe на напрямок чи сумарна?

На напрямок. Лінки PCIe — full-duplex. Не подвоюйте числа, якщо ваше навантаження одночасно не читає і не пише на повних швидкостях.

4) PCIe 6.0 зменшить затримку?

Не автоматично. PCIe 6 зосереджений на вищій пропускній здатності з FLIT-режимом і FEC. Затримка може покращитись у деяких випадках через менше вузьких місць,
але може й не змінитись або трохи зрости через додаткове фреймінг/корекцію помилок.

5) PCIe-свіч поганий для сховища?

Ні. Це спосіб побудувати щільні NVMe-системи. Ризик — оверсубскрипція і вузький апстрім. Якщо ви розумієте ширину апстріму і конкурентність навантаження,
свіч цілком розумне рішення.

6) Мій GPU працює на x8. Панікувати?

Не за замовчуванням. Багато обчислювальних навантажень не насичують PCIe. Але якщо ви постійно стримите дані, часто робите host-device трансфери або покладаєтесь на P2P-шляхи,
x8 може нашкодити. Виміряйте конвеєр перед тим, як переробляти шасі.

7) Яка найпоширеніша причина, чому NVMe повільний у новому сервері?

Неправильна домовленість лінка (пониження покоління або зменшення ширини) або топологічна оверсубскрипція. Далі: термальний троттлінг, NUMA-невідповідність і ліміти живлення CPU.

8) Чи варто примушувати швидкість PCIe у BIOS?

Уникайте цього, якщо немає валідації. Примусові налаштування покоління хороші для лабораторних відтворень і погані як «підсилювач продуктивності» на маргінальних каналах.
Використовуйте Auto, а потім виправляйте основні проблеми стабільності.

9) Як зрозуміти, чи я обмежений PCIe, а не софтом?

Якщо LnkSta правильний і ви все одно не досягаєте очікуваної пропускної здатності, порівняйте одиночний пристрій і масштабування по кількості пристроїв та перевірте CPU/NUMA/переривання.
Чистий лінк з поганою p99-затримкою часто вказує на програмні черги або накладні CPU, а не на PCIe.

Наступні кроки, які ви реально можете виконати

Якщо ви керуєте продакшн-системами, покоління PCIe — це не імідж. Це вимірювана межа в вимірюваній топології.
Зробіть наступне:

  1. Опишіть реальні лінки: запустіть lspci -vv перевірки для ваших топ-5 критичних пристроїв (NIC, NVMe, GPU) і зафіксуйте LnkSta.
  2. Побудуйте оповіщення про пониження і сплески AER: пониження — раннє попередження; виправлені помилки — дим перед вогнем.
  3. Змапте домени конкуренції: побудуйте просту діаграму з lspci -t і документації вендора. Позначте, що ділиться апстрімом або root-портом.
  4. Рішайте про оновлення на підставі доказів вузького місця: якщо не можете показати плато лінка, що відповідає теоретичному максимуму, не купуйте нове покоління «просто так».
  5. Коли оновлюєте: оновлюйте платформу системно — плата, райзери, бекплейн/ретаймери, прошивки — і валідуйте під навантаженням та під нагрівом.

PCIe 3/4/5/6 — це не про права хвастатися. Це про те, щоб нагодувати пристрої, за які ви вже заплатили, не створюючи нового класу відмов, який з’явиться після закінчення терміну повернення.

← Попередня
Debian 13 застряг у initramfs: що це означає і як повернути систему в робочий стан
Наступна →
Міграція recordsize у ZFS: змінюємо стратегію без переписування всього

Залишити коментар