Comments 82
Любопытно стало. Автор, можете снять с материнок информацию при помощи CPU-Z и выложить куда-нибудь?
Кстати, если карты Ваши собственные, и каждой из них доступен полный DMA, не пробовали организовать их общение между собой в обход CPU? Если память быстрая, то можно выяснить практический максимум самой матплаты, максимально исключая издержки на ПО и интерфейсы к CPU.
Запись данных — в режиме DMA, с использованием механизма Common Buffer (который выделяется при старте ОС). Во время теста, записи в этот Common Buffer сейчас не производится. Исходно — производилась (что несколько повышало нагрузку на процессор). Сейчас во время теста процессор показывает единицы процентов загрузки.
Программа при старте проецирует все регистры на свою память, затем — просто работает с оборудованием. Так что все программные нагрузки — минимальны. Прыжков в ядро и обратно — нет. Подготовили команду, заполнили указатель на Common Buffer, поехали гнать 4 мегабайта средствами контроллера. Закончили — делаем то же самое, но для следующего блока LBA…
Из того, что может мешать — драйвер ловит прерывания. Но я пробовал исключать их из работы. На поток — не повлияло.
Пробовали ли использовать материнки других платформ Intel <-> AMD?
Ну вот, это исследование уже указывает некоторый путь к оптимизации.
Аппаратные ресурсы ограничены, а протокол PCIe — надежный, поэтому данные должны сохраняться в буфере до тех пор, пока получатель не подтвердит их получение. Размеры буферов для x4 порта должны быть больше, чем для x1, что может дать большую скорость на каких-то шаблонах работы и/или на небольшом payload'е. Кроме размера буфера еще должно влиять его распределение между запросами разного типа. Вы контроллер готовый использовали или как для USB на ПЛИС делали? В ПЛИС можно эти параметры покрутить и посмотреть, к чему это приведет.
Данные гонял по 8192 сектора на команду. То есть, по 4 мегабайта в блоке.
Раз при перестановке карты в другую мать становится лучше, то значит в самом контроллере Mavell на его приемной стороне буфера нормальные. А вот в чипсете на его приемной стороне для порта x1 буфера недостаточные для получения максимальной скорости. А на порте x4 буфера побольше, что приводит к разумной скорости на x1.
Надо у Интела выбивать информацию, чтобы он рассказал размеры буферов и другие ограничения у своих портов.
В общем, не думаю, что что-то специально режет пропускную способность просто так. Есть вполне осмысленные физические ограничения (размеры буферов), которые с одной стороны дают возможность приемной стороне регулировать скорость поступления пакетов (т.к. не всегда приемная сторона способна работать на полной скорости), а с другой приводят к таким странным замедлениям, когда на этих буферах экономят.
В документации на чипсет сказано:
Max Read Request Size (MRRS)—RO. Hardwired to 0.
В конфигурационном пространстве там действительно нули у всех портов. У всех — идентично.
Теперь смотрим этот же регистр у Марвеллов.
Там 0x2000. Это 0010000000000000
Интересующие нас биты 010 => 512 байт
Это значение у всех четырёх карт идентично. Короткий слот, длинный… Значения идентичны. Не найдём мы наверняка ничего тут. Я уже пытался… Всё идентично, а поведение — разное.
Что вызвало подозрения?
Дальше — я деталей не помню. Я зимой разбирался. Нашёл на форумах ссылку на какой-то WDK инструмент (забыл имя), который собирает статистику, кто грузит процессор.
Запустил, пособирал. Выяснил, что драйвер USB постоянно в прерывание входит-выходит. Тогда успокоились, так как машина — стенд, который используется не так часто.
Озаботились только сейчас, разбираясь с причинами просадки скорости. После замены материнки, ничего не изменилось. После замены процессора, сразу после загрузки нагрузка на процессор 0%. Ни программные ни аппаратные вещи иные — не менялись.
Машину под это дело специально выбирали помощнее. Не экономили. Собственно, сейчас взяли ещё более крутую, чтобы вопрос закрыть.
Может быть, что микрокод в процессоре старый?
А точно такой же i5 для теста в той же материнской плате — нельзя попробовать?
Я тут в командировке, так что возможности по добыванию железа ограничены тем, что есть у Заказчика. Был i3 — поставили. А так — Заказчика наука вообще не интересует. Нашли решение, плюс доказали повторяемость проблемы на старом железе — мне вообще перестали железки на пробу давать.
Пока — пусть будет 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 и т.д.) на взаимные наводки. Полагаю, что люди проектировавшие такие решение, знали об этом и заложили некоторые защитные механизмы.
Вот и получились такие результаты.
Собственно, что делать — тоже теперь ясно. Надеюсь, кому-то сэкономит время.
Так что за подход к изучению эффекта можно только похвалить, но за то, что вы о нём не знаете… Тут я просто не понимаю — как так могло получится…
А конкретных табличек со списками «хороших» и плохих чипсетов у вас нет (да и вряд ли удастся есть ресурсы, чтобы их создать), так что неясно как экономия времени-то получится…
Три слота свободны. В «коротком» слоте торчит одинокая карта.
Лимит — всё те же 290.
Не читайте за столом советских газет. Есть же первоисточник — 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 учитывать, так же как с памятью.
Насколько я помню, все «южные» мосты последних лет имеют шину к ЦП (и соответственно к памяти) эквивалентную 4 линиям PCI-e соответствующего мосту поколения.
А дальше все делится на сеть (контроллер на PCI-e 1x), SATA, чипсетные PCI-e и прочее.
В общем-то давно известный факт.
… пропускная способность 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)
Беда в том, что цифра 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…
На какой материнской плате всё работает без тормозов во всех слотах — сейчас не скажу, её утащили. Но точно помню, что память у неё DDR4.
Главная цель написания статьи — просто предупредить программистов. Чтобы прикидывали реальные вещи, не надеясь на цифры из обзорных статей или из теории. Чтобы не пугались ограничений, не искали баги в коде, а проверяли бы то же, что у меня. В общем, цель — проинформировать. А чтобы таблицы составлять — это надо отдельную работу проводить. Может, кто заинтересуется и сделает.
Во все слоты воткнуты совершенно одинаковые карточки с 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. Наверное, под них резервируется полоса.
Вот, решил создать хотя бы что-то для тех, кто такое же огребёт. Чтобы знали, что это не у них ошибки, а вот такие приколы. Чтобы пробовали другие слоты. Чтобы пробовали другие материнки. А уж с комментариями — вообще много чего понять можно теперь. Намного больше, чем просто из статьи.
А так — для текущего этапа задачи всё решилось сменой материнки. А приемлемость чипа определяется наличием понятности его программирования напрямую через регистры. AHCI — открытый стандарт. Для SAS — там отдельная тема, но тоже ясно, куда двигаться. Просто не в рамках этой статьи.
Огромное спасибо за раскрытие физических деталей, которые могут влиять на это дело. Пусть все выкладки лежат вместе.
Мало того, три карты подключены к портам одного и того же моста. А поведение — разное.
Да, я понимаю в 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 контроллеры. Можно — на сетевухи. Можно — менять ширину на разъёмах. Таблиц много, сюда приводить не буду. Но никаких внешних мостов — не требуется. Всё живёт в чипсете. И три разъёма идут — в него. Четвёртый — на скриншоте видно, что идёт мимо. Но три — в него.
Собственно, если я брежу — так разъясните детали. Делов-то. Пока я не вижу бреда. Но на то он и бред, чтобы несущий его, не видел ничего такого.
И да, извините, если был где то резок.
Так что всё на иерархии верно. Когда появляются дополнительные мосты — они там видны, просто я сейчас не могу скриншот снять. А с утра — вообще на самолёт. Так что если Вам надо картинку со сложной иерархией мостов — могу постараться в воскресенье снять. А так — поверьте на слово, что тут всё просто идёт. Когда ещё мосты влезают — они там видны. Тем удивительнее тот факт, что три слота включены идентично, а поведение — разное. Но, собственно, причина — наверняка выявлена.
Первый Realtek GBE — это встроенная в материнку сетевуха, GBE #2 — стоит в слоте x1, SAS-контроллер воткнут в слот x4. В чипсете 8 линий, а материнка с четырьмя x1, одним x4, M.2 PCIe (x2) и сетевушкой — 8 линий недостаточно, поэтому на порты x1 стоит мост.
А у EasyLy четко видно, что мостов нет. В чипсете так же 8 линий, они распределны по двум x1, одному x4, Ethernet и чему-то еще, мосты на порты попросту не нужны.
Linux пробовали? Так по крайней мере и в исходниках драйвера можно порыться.
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
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 бит по шине.
А, хорошо. Я посмотрел lspci на сервере с v3, и там нигде про это ни слова. Скорости (от 8 до 2.5GT/s) есть, коррекции ошибок и т.д. есть, payload есть, частота есть, а вот метод кодирования нигде не указан. :-/
У одного из производителей сетевых карт метод кодирования следует из скорости (signal rage), читают из того же байта, что и lspci — MLNX_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
Шина PCIe: только ли физические ограничения влияют на скорость передачи?