Pull to refresh

Comments 82

Любопытно стало. Автор, можете снять с материнок информацию при помощи CPU-Z и выложить куда-нибудь?

Возможно, на кристалле хаба есть ограничения по суммарной пропускной способности из-за того, что все каналы PCI-Ex зависимы друг от друга и по очереди используют одни и те же не модули кристалла. Если это так, то возможна ситуация, когда слоты свободны, и один из них может работать как 4x, а стоит занять все, выше 1x он подняться не сможет. Для окончательных выводов интересно было бы найти на точно таком же чипсете плату с такой же конфигурацией слотов, но без таких проблем.
Используемые платы — все 1x. Беда в том, что в «коротких» слотах скорость ещё ниже, чем 1x. А в «длинных» — как раз соответствует ожидаемой от 1x.
Так о том и речь, что полноценных модулей на чипе может быть меньше, чем виртуально предоставляемых процессору линий. Тогда при загрузке нескольких слотов одновременно с работой накопителей и периферии самой платы на таком же интерфейсе возникают просадки даже на 1x.

Кстати, если карты Ваши собственные, и каждой из них доступен полный DMA, не пробовали организовать их общение между собой в обход CPU? Если память быстрая, то можно выяснить практический максимум самой матплаты, максимально исключая издержки на ПО и интерфейсы к CPU.
Карты на Марвелловских чипах.
Запись данных — в режиме DMA, с использованием механизма Common Buffer (который выделяется при старте ОС). Во время теста, записи в этот Common Buffer сейчас не производится. Исходно — производилась (что несколько повышало нагрузку на процессор). Сейчас во время теста процессор показывает единицы процентов загрузки.

Программа при старте проецирует все регистры на свою память, затем — просто работает с оборудованием. Так что все программные нагрузки — минимальны. Прыжков в ядро и обратно — нет. Подготовили команду, заполнили указатель на Common Buffer, поехали гнать 4 мегабайта средствами контроллера. Закончили — делаем то же самое, но для следующего блока LBA…

Из того, что может мешать — драйвер ловит прерывания. Но я пробовал исключать их из работы. На поток — не повлияло.
Вот вроде мне и не надо — а понравилось. И стиль изложения, и суть материала познавательная. Спасиб.
По всей видимости дело реально в чипсетах или их настройках.
Пробовали ли использовать материнки других платформ Intel <-> AMD?
Так взяли другую Intel материнку (более новую) — всё заработало на предельной скорости для 1x. Дальше уже чисто из спортивного интереса собрал снова старую и проверил на восьмиканальном контроллере, работающем в режиме 4x.
Вот Вы сейчас одной статьей всколыхнули огромную аудиторию, возможно даже не подозревая об этом.

image
Так проблема майнинга не в скорости передачи данных, а в алгоритмах. От/к видеокарт(ам) идёт не такой и большой поток информации.
Действительно, это так. Но на тематических форумах идут бурные дискуссии, почему одна и та же видеокарта выдает разную производительность в разных конфигурациях. В частности, (без приведения доказательств и исследований) постулируется, что в х16 слоте скорости на 4-7% выше из-за неких «лагов» в передаче данных. А за такой прирост производительности люди уже готовы биться в кровь.
Ну вот, это исследование уже указывает некоторый путь к оптимизации.
Лаги возможно связаны с тем что в современных ПК линии PCI-E которые идут на слот для ВК обычно идут от самого процессора, а остальные уже через чипсет организованы из-за чего соответственно могут быть и лаги и просадки скорости как у ТС.
Не удалось найти размеры аппаратных буферов и количества запросов (posted/non-posted/completion), которые может отправить устройство или в устройство до получения подтверждения о их выполнении?

Аппаратные ресурсы ограничены, а протокол PCIe — надежный, поэтому данные должны сохраняться в буфере до тех пор, пока получатель не подтвердит их получение. Размеры буферов для x4 порта должны быть больше, чем для x1, что может дать большую скорость на каких-то шаблонах работы и/или на небольшом payload'е. Кроме размера буфера еще должно влиять его распределение между запросами разного типа. Вы контроллер готовый использовали или как для USB на ПЛИС делали? В ПЛИС можно эти параметры покрутить и посмотреть, к чему это приведет.
Готовый четырёхканальный AHCI контроллер фирмы Marvell. Фирма — известная. Модель чипа — 9215, чип — тоже известный и популярный.

Данные гонял по 8192 сектора на команду. То есть, по 4 мегабайта в блоке.
Я немного про другое. По PCIe ходят пакеты (TLP-пакеты), максимальный размер (вернее, полезный размер) которых и есть payload size. Но уходят пакеты быстро, а подтверждения, что пакет правильно получен и обработан приходят с задержкой. Чтобы это не сказывалось на пропускной способности используется кредитный механизм: когда отправитель может отправить без получения подтверждения только ограниченных объем данных. Это ограничение определяется и суммарным объемом пакетов каждого типа, так и просто количеством. Т.е. при инициализации принимающая сторона сообщает передающей свои ограничения (размер буферов и количества пакетов), а отправляющая гарантированно не посылает больше этого числа, не получив подтверждение.

Раз при перестановке карты в другую мать становится лучше, то значит в самом контроллере Mavell на его приемной стороне буфера нормальные. А вот в чипсете на его приемной стороне для порта x1 буфера недостаточные для получения максимальной скорости. А на порте x4 буфера побольше, что приводит к разумной скорости на x1.

Надо у Интела выбивать информацию, чтобы он рассказал размеры буферов и другие ограничения у своих портов.

В общем, не думаю, что что-то специально режет пропускную способность просто так. Есть вполне осмысленные физические ограничения (размеры буферов), которые с одной стороны дают возможность приемной стороне регулировать скорость поступления пакетов (т.к. не всегда приемная сторона способна работать на полной скорости), а с другой приводят к таким странным замедлениям, когда на этих буферах экономят.
Если будет время, то посмотрите значение Maximum Read Request Size в PCIe Capabilities. Устройства такого типа обычно работают в режиме DMA — когда устройство само запрашивает данные из памяти. Тогда размер пакета ограничен не Max Payload (это максимальный размер пакета, который процессор может послать в устройство), а Maximum Read Request Size (максимальный размер запроса на чтение из устройства).
Именно чтобы откинуть этот вариант, производились только тесты записи. Данные писались в карты.
Вряд ли процессор сам записывал данные на диск (режим PIO). Это медленно и процессор загружен. Обычно (я дисками не занимаюсь, но это легко проверить: загрузка процессора должна быть минимальна) Marvell сам читал данные из памяти (режим DMA) и сам записывал их на диск (а процессор простаивал).
Наконец-то до Зоркого Глаза дошло, что от него хотят. Зоркий Глаз — это я.

В документации на чипсет сказано:
Max Read Request Size (MRRS)—RO. Hardwired to 0.

В конфигурационном пространстве там действительно нули у всех портов. У всех — идентично.

Теперь смотрим этот же регистр у Марвеллов.

Там 0x2000. Это 0010000000000000
Интересующие нас биты 010 => 512 байт

Это значение у всех четырёх карт идентично. Короткий слот, длинный… Значения идентичны. Не найдём мы наверняка ничего тут. Я уже пытался… Всё идентично, а поведение — разное.
А как определили что процессор барахлит?
Что вызвало подозрения?
Запускаем машину. Нагрузка 13%. Ничего не запущено. Причём это одно ядро почти на 50% нагружено.

Дальше — я деталей не помню. Я зимой разбирался. Нашёл на форумах ссылку на какой-то WDK инструмент (забыл имя), который собирает статистику, кто грузит процессор.
Запустил, пособирал. Выяснил, что драйвер USB постоянно в прерывание входит-выходит. Тогда успокоились, так как машина — стенд, который используется не так часто.

Озаботились только сейчас, разбираясь с причинами просадки скорости. После замены материнки, ничего не изменилось. После замены процессора, сразу после загрузки нагрузка на процессор 0%. Ни программные ни аппаратные вещи иные — не менялись.
Может просто процессор слабый. У меня неттоп на атоме начинал тормозить при активном использовании Wi-Fi т.к. прерывания отъедали большую часть процессора. Собственно, пропускная способность Wi-Fi упиралась на нем в процессор.
Который барахлил — i5. Сейчас в этой материнке стоит i3 (других под рукой в нужном корпусе не было)
Машину под это дело специально выбирали помощнее. Не экономили. Собственно, сейчас взяли ещё более крутую, чтобы вопрос закрыть.
Чудеса какие-то. При этом ОС работает и ничего не виснет?
Может быть, что микрокод в процессоре старый?
А точно такой же i5 для теста в той же материнской плате — нельзя попробовать?
При установке ОС — синие экраны. Ранее установленная — работала и не висла.

Я тут в командировке, так что возможности по добыванию железа ограничены тем, что есть у Заказчика. Был i3 — поставили. А так — Заказчика наука вообще не интересует. Нашли решение, плюс доказали повторяемость проблемы на старом железе — мне вообще перестали железки на пробу давать.
Понятно. Просто мне, например, «барахлящий» процессор в этой статье не менее интересен, чем сама суть статьи; никогда о таком не слышал. Ошибки — да, но подобных симптомов я ни разу не наблюдал и не слышал.
с атлоном (или феномом) лет 5-6 назад похожая ерунда была — установка винды падает, и ХР, и семёрка, при этом ливки работают нормально, как линуксовая, так и виндовая
камень был абсолютно новый, поменяли по гарантии, сказали, что очень редкий случай, но порой бывает
А операционную систему менять не пробовали? Что будет если запустить вашу программу под Wine на линуксе?
Целевые программа и драйвер жёстко завязаны на Windows. Причём (Заказчику виднее) на WIN7 x64. А подгонялась скорость именно под этот комплект «программа + драйвер». Первична была сдача комплекса…
Если Вы хотите выяснить причину тормозов — пробуйте альтернативную операционку (в идеале — FreeDOS). Если же хотите сдать комплекс и забыть — то оставайтесь на Windows.
Если уж переходить, то на ОСРВ МАКС, так как я являюсь автором статей по работе под ней. Разумеется, под PC она ещё не сделана (и даже не планируется), но в каждой шутке есть доля правды.

Пока — пусть будет Windows, всё же работает. Возникла конкретная проблема под конкретным железом. Она решилась. Разбираясь с причинами, я не нашёл никаких публикаций, которые бы подталкивали к выходу, поэтому потерял много времени придумывая эксперименты. Решил опубликовать это дело для тех, кто будет искать в будущем, чтобы они знали какие вещи перебирать в первую очередь.
Там ещё такое дело. ОС в работе почти не используется. Проекция регистров на память основной программы, дальше — программа сама всем рулит. ОС рулит прерываниями, но я отметил, что пробовал исключать их из работы. Скорости не изменились.
Знакомая проблема.

Вначале я наткнулся на ограничения по портам SATA (чипсет Z97) — при одновременном чтении-записи на разные порты SATA суммарная скорость упиралась в этак 300 МБ/с, хотя в один порт бенчмарки выдавали 400. На SAS-контроллере, поддерживающем x8, но установленном в слот x4, уперся в схожий с вашим предел.

Самое интересное, что M.2 SSD, упирающийся в лимит PCIe 2.0 x2 на этой материнке, выдает скорости под 800 МБайт/с. Приоритеты? Сейчас хочу взять плату PCIe-M2, чтобы проверить скорость SSD на разъеме x4 на той же материнке.

DMI2 — фактически 4 линии PCIe 2.0 (2ГБайт/с)

На вашей материнке распаяно 6 чипсетных линий… 290*6=1740, т.е. как раз приблизительно лимит DMI2. Таким образом легко предположить, что чипсет ставит пропорциональный общий лимит на каждый разъем PCIe. Остается только вопрос, этот лимит статичный, или динамически изменяется от количества использованных слотов? Из текста не увидел, вы пробовали измерять скорость, когда к материнке подключен только один контроллер, а не 4?
Сейчас уже проверить не смогу, втыкая платы в отдельные слоты. Командировка подходит к концу, нет возможности спокойно вести опыты. Но по крайней мере, когда я вёл проверку — остальные слоты не были нагружены. Кто на скриншотах жёлтый — там идёт обмен. Остальные — пассивны, хоть контроллеры и воткнуты.
Возможно, при больших скоростях/объемах передаваемых данных просто возрастают взимные наводки между электрическими проводниками шины и возрастает количество ошибок при передаче, требуется больше попыток повторной передачи.
Были подобраны параметры чипов и разводки плат так, что бы вероятность этого была минимальна и не приводила к фатальным последствиям.
Опять же, есть некоторые зависимости от потока данных (последовательность 101, 1100 и т.д.) на взаимные наводки. Полагаю, что люди проектировавшие такие решение, знали об этом и заложили некоторые защитные механизмы.
Вот и получились такие результаты.
Ну, собственно, статья — предостережение программистам. Чтобы имели это дело в виду. Я — несколько дней врага искал. Кто прочёл — меньше времени потратит.
Собственно, что делать — тоже теперь ясно. Надеюсь, кому-то сэкономит время.
Не очень только понятно — кому. Все эти эффекты наблюдались всегда: то, что у вас есть какой-нибудь Ultra-ATA-66 вовсе не значило, что вы получите вдвое больше, чем у тех, у кого на чипсете только Ultra-ATA-33. И то же самое — с передачей данных на VGA-карту. Разные ISA-карты по скорости легко вдвое могли отличаться. Более того — есть куча сайтов, где разные чипсеты и матерински по этому параметру сравшиваются!

Так что за подход к изучению эффекта можно только похвалить, но за то, что вы о нём не знаете… Тут я просто не понимаю — как так могло получится…

А конкретных табличек со списками «хороших» и плохих чипсетов у вас нет (да и вряд ли удастся есть ресурсы, чтобы их создать), так что неясно как экономия времени-то получится…
Улучил минутку, проверил.
Три слота свободны. В «коротком» слоте торчит одинокая карта.
Лимит — всё те же 290.
>>Масса статей, в которых говорится, что одна дифференциальная пара PCIe gen. 1 и gen 2 даёт примерно 500 мегабайт в секунду, ошибочны.
Не читайте за столом советских газет. Есть же первоисточник — PCI-SIG. С учётом кодирования теоретический потолок получается 250, 500, 984.6 МиБ/с на линию для 1.0, 2.0, 3.0 соответственно.
Дальше в дело вступают другие факторы:
Размер пакета. Если он ограничен 128 байтами, то всё плохо — в пакет добавляется 20–30 байт служебных данных. Во-вторых — DLL-пакеты. В общем, средняя температура по больнице получается на уровне 200/400/800 МиБ/с на линию в идеальных условиях. По крайней мере, с PCIe 3.0 я это регулярно наблюдаю на практике: современные (производительность которых упирается не в ядро, а в PCIe) SAS HBA или RAID, подключаемые к PCEe 3.0 ×8, при достаточном количестве быстрых накопителей упираются в 6 с небольшим ГиБ/с (примеры: HBA Broadcom 9300, 9400, RAID Broadcom многопортовые 9361 и 9460, Adaptec 8-й серии и 3100). Современные NVMe с PCEe 3.0 ×8 (HGST SN260) тоже упираются в 6 с небольшим ГиБ/с с последовательным доступом на больших блоках в теории и на практике.
В-третьих — с чтением всё ещё интереснее. Например, можно покурить вот этот документ от Xilinx.
В-четвёртых — в данном конкретном случае тут присутствуют чипсетные PCIe 2.0 (между процессором и PCH находится DMI 2.0 со своими особенностями и на PCH ещё много чего висит) и процессорные PCIe, которых, ЕМНИП, 16 линий максимум.
В-пятых — для многопроцессорных систем и быстрых накопителей (NVMe) приходится ещё и топологию NUMA учитывать, так же как с памятью.
присутствуют чипсетные PCIe 2.0 (между процессором и PCH находится DMI 2.0
Насколько я помню, все «южные» мосты последних лет имеют шину к ЦП (и соответственно к памяти) эквивалентную 4 линиям PCI-e соответствующего мосту поколения.

А дальше все делится на сеть (контроллер на PCI-e 1x), SATA, чипсетные PCI-e и прочее.

В общем-то давно известный факт.
Так и я о чём. Пропускная способность DMI существенно меньше тех 8 линий PCIe 2.0 и висящих на PCH встроенных контроллеров.
… пропускная способность PCIe gen 1 и gen 2 для x1 составляет 500 МБ/с

Почему вы пишите, что у gen1 и gen2 скорости одинаковые?
PCIe gen1 x1 — 2.5Gb/s (на физ.уровне), т.е. 250MB/s (после 8b/10b)
PCIe gen2 x1 — 5.0Gb/s (на физ.уровне), т.е. 500MB/s (после 8b/10b)
Ой, опечатка. Спасибо. Я как-то задумался про 8b/10b, но совсем забыл про скорость. Сейчас буду править.
Загрузите линукс и посмотрите на вывод lspci -vvvvvv — там куча служебной информации про используемые протоколы на PCI шине, типы кодирования, количество линий и т.д.
Да вроде, и под Windows всё видно, если правильными программами пользоваться.
Беда в том, что цифра 290 — не документирована нигде.

Просто интересно было бы посмотреть на вывод. Потому что я там много странного вижу. Вот пример:


09:00.0 USB controller: ASMedia Technology Inc. ASM1042A USB 3.0 Host Controller (prog-if 30 [XHCI])
    Subsystem: Dell ASM1042A USB 3.0 Host Controller
    Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0, Cache Line Size: 128 bytes
    Interrupt: pin A routed to IRQ 18
    Region 0: Memory at c4000000 (64-bit, non-prefetchable) [size=32K]
    Capabilities: <access denied>
    Kernel driver in use: xhci_hcd

3a:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)
    Subsystem: Bigfoot Networks, Inc. QCA6174 802.11ac Wireless Network Adapter
    Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0
    Interrupt: pin A routed to IRQ 164
    Region 0: Memory at dc000000 (64-bit, non-prefetchable) [size=2M]
    Capabilities: <access denied>
    Kernel driver in use: ath10k_pci
    Kernel modules: ath10k_pci

Например, поля Latency и Control…

UFO just landed and posted this here
Мы пока не нашли контроллеры, которые бы работали в режиме третьего Express (и были бы приемлемыми по цене: AHCI — это всё-таки не топовая вещь, для топовой — есть на примете очень мощный SAS контроллер).

На какой материнской плате всё работает без тормозов во всех слотах — сейчас не скажу, её утащили. Но точно помню, что память у неё DDR4.

Главная цель написания статьи — просто предупредить программистов. Чтобы прикидывали реальные вещи, не надеясь на цифры из обзорных статей или из теории. Чтобы не пугались ограничений, не искали баги в коде, а проверяли бы то же, что у меня. В общем, цель — проинформировать. А чтобы таблицы составлять — это надо отдельную работу проводить. Может, кто заинтересуется и сделает.
UFO just landed and posted this here
Во все слоты воткнуты совершенно одинаковые карточки с AHCI-контроллерами, каждый из которых поддерживает исключительно PCIe x1.

…и были бы приемлемыми по цене…

Насколько приемлемыми? Какой-нибудь 9305-16i (16-портовый SAS3 HBA, PCIe 3.0 ×8) заменит 4 Ваших контроллера, при этом стоить будет около $100 в пересчёте на каждую «четверть». Конечно, те Марвелы стоят раза в три дешевле, но иногда просто нет выбора.

Магические 290 МиБ/с на линию, которые существенно меньше средних практических 400 МиБ/с для PCIe 2.0 (и тем более 500 МиБ/с теоретических) связаны, как уже упоминали выше, с а) ограничением MPS в 128 байт (в теории может быть до 4096 байт, но ограничен возможностями устройств на данном рут-комплексе) б) это чипсетный PCIe 2.0 (8 линий), до процессора там идёт DMI 2.0, т.е. 2 ГиБ/c на всё, включая набортные SATA и USB. Наверное, под них резервируется полоса.
Критерий приемлемости, собственно, выходит за рамки темы. Статья создана, так как я отхватил проблемы, полез искать причины — а их нет нигде. Масса статей с ошибками, а путная — ну разве что тот AppNote от Xilinx. И тот — не по моей теме.

Вот, решил создать хотя бы что-то для тех, кто такое же огребёт. Чтобы знали, что это не у них ошибки, а вот такие приколы. Чтобы пробовали другие слоты. Чтобы пробовали другие материнки. А уж с комментариями — вообще много чего понять можно теперь. Намного больше, чем просто из статьи.

А так — для текущего этапа задачи всё решилось сменой материнки. А приемлемость чипа определяется наличием понятности его программирования напрямую через регистры. AHCI — открытый стандарт. Для SAS — там отдельная тема, но тоже ясно, куда двигаться. Просто не в рамках этой статьи.

Огромное спасибо за раскрытие физических деталей, которые могут влиять на это дело. Пусть все выкладки лежат вместе.
А зачем вам PCIe3.0, если он обычно только в одном слоте GPU? Или вам в принципе нужен 1 контроллер на один ПК в слот GPU?
Не увидел ни слова о мостах. А нужно понимать, что в отличии от прародителя, каждый слот PCIe подключен к системной шине через свой собственный мост, ибо, топология у PCIe — точка-точка. А на этих мостах каких только чудес не бывает. Имхо, именно с исследования конфигурационного пространства этих мостов и следует начинать поиск причины подобного рода непоняток.
Слов нет. Есть скриншот с иерархией подключения. Конфигурационное пространство — полностью идентично в рамках настроек. Собственно, в ответе на самый первый комментарий есть ссылка, где можно все дампы увидеть.

Мало того, три карты подключены к портам одного и того же моста. А поведение — разное.
Не могут быть все 3 карты подключены к портам одного и того же моста. Еще раз повторяю, что в силу того, что pcie имеет топологию типа точка-точка, каждый слот подключен на свой мост. Этот факт совершенно не виден на приведенном скриншоте. А настройки у этих мостов могут быть совершенно разные, по тем или иным причинам.
А как надо писать?
Да, я понимаю в PCIe только чуточку. Вот SATA и SAS — делал ядра под Альтеру. Так что как идёт гигабитный сигнал — представляю.
Но касаемо портов моста… Вот у нас Intel® 8 Series/C220 Series Chipset Family Platform Controller Hub (PCH). Три карты подключены к линиям, выходящим из него.

Вот в нём имеются устройства, которые в документации называются D28:F0/F1/F2/F3/F4/F5/F6/F7. На иерархии в основной статье видно, что платы воткнуты непосредственно туда. Никаких мостов между ними нет. У меня есть плата, где имеется промежуточный мост, но это — не тот случай.

Ещё там сказано The PCH provides up to 8 PCI Express Root Ports, supporting the PCI Express Base Specification, Revision 2.0. Each Root Port x1 lane supports up to 5 Gb/s bandwidth in each direction (10 Gb/s concurrent). PCI Express Root Ports 1–4 or Ports 5–8 can independently be configured to support multiple port width configurations.

и потом идёт масса таблиц с возможными конфигурациями. Можно пускать линии на разъёмы. Можно — на USB 3.0 контроллеры. Можно — на сетевухи. Можно — менять ширину на разъёмах. Таблиц много, сюда приводить не буду. Но никаких внешних мостов — не требуется. Всё живёт в чипсете. И три разъёма идут — в него. Четвёртый — на скриншоте видно, что идёт мимо. Но три — в него.

Собственно, если я брежу — так разъясните детали. Делов-то. Пока я не вижу бреда. Но на то он и бред, чтобы несущий его, не видел ничего такого.
Линии выходят из чипсета — да. Но(!), в самом чипсете имеется для каждого слота мост. Именно pci-pci bridge, классический. И как их там производитель МП конфигурирует в efi — не угадаешь. Именно поэтому важно, получить всю (!) информацию по топологии шины (sudo lspci -tv) и по конфигурации отдельных устройств, в том числе всех мостов (sudo lspci -vvv). Тогда можно будет, не ковыряясь в дампах, попытаться делать какие либо выводы по ситуации. Повторюсь, имхо, с этого нужно начинать поиск всяких непоняток.
И да, извините, если был где то резок.
Чип — на то и чип, чтобы в нём всё бегало по старым, не добрым параллельным шинам. В моей любимой Альтере сразу после приёмников стоит десериалайзер (с эластичным буфером и ловлей примитива ALIGN). Ну, и перед передатчиками тоже сериалайзер стоит непосредственно. До того — всё в параллельном коде. Я видел наработки знакомых на Xilinx — тоже всё в параллельных шинах реализовано в чипе. Последовательная — только наружу выходит. Рисунок Figure 2-1. PCH Interface Signals Block Diagram (not all signals are on all SKUs) из документации на чипсет также подразумевает общую внутреннюю шину.

Так что всё на иерархии верно. Когда появляются дополнительные мосты — они там видны, просто я сейчас не могу скриншот снять. А с утра — вообще на самолёт. Так что если Вам надо картинку со сложной иерархией мостов — могу постараться в воскресенье снять. А так — поверьте на слово, что тут всё просто идёт. Когда ещё мосты влезают — они там видны. Тем удивительнее тот факт, что три слота включены идентично, а поведение — разное. Но, собственно, причина — наверняка выявлена.
В винде мосты чипсета тоже видны:
Пример


Первый Realtek GBE — это встроенная в материнку сетевуха, GBE #2 — стоит в слоте x1, SAS-контроллер воткнут в слот x4. В чипсете 8 линий, а материнка с четырьмя x1, одним x4, M.2 PCIe (x2) и сетевушкой — 8 линий недостаточно, поэтому на порты x1 стоит мост.

А у EasyLy четко видно, что мостов нет. В чипсете так же 8 линий, они распределны по двум x1, одному x4, Ethernet и чему-то еще, мосты на порты попросту не нужны.
Ну и да, ковыряться в дампах — это такое себе. Крайне желателен вывод lspci -tv и lspci -vvv для разных случаев.

Linux пробовали? Так по крайней мере и в исходниках драйвера можно порыться.

Я же написал в основном текста, что драйвер — наш. Так что тоже можно порыться.
Так ещё есть драйвера чипсета, pci, iommu, буферизация ОС и тп В windows до таких глубин не добраться, не протрассировать.
Настройки чипсета видны прекрасно. Буферизация ОС отсутствует. Я использую режим Common Buffer DMA. Всё управление железом — с уровня User Mode (кроме прерываний, но я их пробовал отключать и работать по опросу). Всё там прекрасно разбирается. Но увы, три порта настроены полностью идентично, а ведут себя — по-разному. Четвёртый — он стоит особняком, так как воткнут в слот, предназначенный для видеокарты. А три — идентичны.
Действительно интересная находка — реальность против маркетинга!
Вполне можно добраться, если знать куда тыкать. Просто многие линуксоиды знают винду не сильно больше обычного юзера. Тот же кернеллог — о его существовании знают единицы.
Бывают платы у которых длинные разьемы PCIe — ревизии 2.0 или 3.0, а маленькие почему-то работают по стандарту ревизии 1.0. Очень хорошо коррелирует с полученными вами результатами.
Брак. Стоит поменять по гарантии.
Брак, который указан в описании на сайте производителя?
Т.е. не брак, а фича? Ну, производитель выкрутился, неохота было выбрасывать партию.
Мат.Плата H87M-G43 (MS-7823)

PCI Express Gen 3: World's 1st PCI Express Gen 3 Motherboard Brand
— говорят, что первая в своем роде с третьей версией ревизии. Возможны велосипеды и детские болезни внутри.

www.msi.com/Motherboard/H87M-G43/Specification

Slots

• 1 x PCIe 3.0 x16 slot
• 1 x PCIe 2.0 x16 slot
— PCI_E4 supports up to PCIe 2.0 x4 speed
• 2 x PCIe 2.0 x1 slots
1. Какая задача-то решалась этим железом?
2. Зачем подключать 16 дисков к плате microATX? Какой корпус будет использоваться?
3. Взяли устаревший ширпотреб и удивляетесь возникшими сложностями?
4. Какой смысл ставить 4 порта SATA на плату с PCI-E 2.0 1x? На камне ASMedia 106x на плате с разъёмом PCI-E 2.0 1x паяют 2 SATA 6 Гбит/с, и даже двух SATA будет много при подключении SSD.
5. Стоит обновить прошивку МП и контроллеров SATA до новейших, и поотключать функции энергосбережения.
6. Как используются 6 каналов SATA 6Гб/с от чипсета? Они дб быстрее, чем с дочерних плат.
7. Что там насчёт RAID? Что там с надёжностью?
8. «Главная цель написания статьи — просто предупредить программистов.» — такое нужно железячникам, не программистам.
9. MSI часто экономят и выпускают изделия низкого инженерного качества. Пробуйте других производителей.
10. Зачем чипсет Intel H87, если Intel Z87 позволяет расщепить процессорные PCI-E 3.0 16x на 8+8 или 8+4+4?
11. Flexible I/O www.intel.com/content/dam/www/public/us/en/documents/datasheets/8-series-chipset-pch-datasheet.pdf#M3.9.42549.02Level.21.Flexible.IO
Возможно понавесили слишком много. Что-то лучше отключить (USB) и пользоваться встроенными портами SATA.
12. Ставьте SAS контроллер. Для SAS есть разветвители и преходники на SATA.
Отвечаю в произвольном порядке, так как в пунтах я запутаюсь.

Это нужно программистам. Во всём виноваты программисты. Пока те не докажут, что сбои не у них. Поэтому не нужно искать, где не оптимальна программа, когда виновата не она. Именно на этом будет сэкономлено время. Программа виновата не всегда оказывается.

Зачем H87 — железо было спущено сверху. Не прокатило — спустили другое. Даташит изучен вдоль и поперёк. Но, собственно, вопрос решился сменой мамки.

Корпус — самодельный. Фото публиковать нельзя. Это ремонтный комплекс. По этой же причине все остальные ограничения на выбор железа. Оно должно быть однородно, оно должно быть хорошо известно. Оно не должно быть ASMedia, так как у неё имеется хорошо изученный баг во время посылки некоторых нестандартных команд.
Статья очень интересная!
В вашем случае вряд ли помогут прошивки и прочее, скорее всего какая-то особенность конфигурации PCIe. Интересно, что длинный PCIe, сидящий на южном мосту показывает нормальный результат. Возможно, его режим отличается от PCIe 1x, например, дуплекс или сжатие. По нюансам скорости работы PCIe (для подключения внешнего видео) есть неплохой FAQ здесь: forum.notebookreview.com/threads/diy-egpu-experiences.418851
но вашего случая нет.
Раз с процессорными портами проблемы нет, стоит завести это на платформе Intel HEDT (либо AMD), там гораздо больше линий PCI-E и портов, напрямую подключённых к процессору. Либо же поискать PCI-E 3.0 x16 HBA, такие тоже есть. У LSI точно были такие.
Это ремонтный комплекс. По этой же причине все остальные ограничения на выбор железа. Оно должно быть однородно, оно должно быть хорошо известно.


Эммм, а ничего, что срок жизни той матушки, как продукта, уже подходил к концу? т.е. через не столь большое время, замену будет не найти?
Странный выбор в любом случае. Но ладно, это вопрос не к ТСу, а к заказчику.

Линукс честно пишет скорость в GT/s (Giga transfers), а не мегабайтах. А оверхед очень простой — кодирование 8/10, на 8 бит данных делается 10 бит по шине.

UFO just landed and posted this here

А, хорошо. Я посмотрел lspci на сервере с v3, и там нигде про это ни слова. Скорости (от 8 до 2.5GT/s) есть, коррекции ошибок и т.д. есть, payload есть, частота есть, а вот метод кодирования нигде не указан. :-/

У одного из производителей сетевых карт метод кодирования следует из скорости (signal rage), читают из того же байта, что и lspciMLNX_OFED_LINUX-4.4-2.0.7.0-rhel7.5-x86_64/common.pl (https://www.liberouter.org/repo/mlnx-ofed/7.8/common.pl) — sub pci_get_link_speed


   # PCIe Gen1 = 2.5GT/s signal-rate per lane with 8/10 encoding    = 0.25GB/s data-rate per lane
   # PCIe Gen2 = 5  GT/s signal-rate per lane with 8/10 encoding    = 0.5 GB/s data-rate per lane
   # PCIe Gen3 = 8  GT/s signal-rate per lane with 128/130 encoding = 1   GB/s data-rate per lane
   # PCIe Gen4 = 16 GT/s signal-rate per lane with 128/130 encoding = 2   GB/s data-rate per lane
   if ( $speed eq "1" ) {             return "2.5GT/s";
   } elsif ( $speed eq "2" ) {            return "5GT/s";
   } elsif ( $speed eq "3" ) {            return "8GT/s";
   } elsif ( $speed eq "4" ) {            return "16GT/s";
   } else {            return "Unknown";
   }

У других вендоров так же: ni (Table 4), intel (2.1 PCI Express PHY Layer).


Кроме кодирования есть потери на заголовки пакетов — https://www.xilinx.com/support/documentation/white_papers/wp350.pdf — Understanding Performance of PCI Express Systems, Jason Lawley 2014. Transaction Layer Packet Overhead, System Parameters Affecting Performance, Maximum Payload Size, Maximum Read Request Size:
MPS (Bytes) Packet Efficiency (%)
128 86
256 92
512 96
1024 98
Theoretical Maximum Data Throughput in Mb/s (MPS=128)
Link Width Write Read
x1 1720 1520
x4 6880 6080
x8 13760 12160

Ого, спасибо! Ради таких комментариев и имеет смысл "набрасывать".

Sign up to leave a comment.

Articles