От переводчика
В данном случае я не просто переводчик, но и автор оригинала. Писать подобные вещи на английском для меня проще и слог в оригинале скорее всего более понятный, поэтому, я позиционирую статью на хабре именно как перевод (с соответствующей пометкой).
В процессе перевода, для адаптации статьи к аудитории, сделано несколько небольших изменений в сравнении с оригиналом, нарпимер, убраны цены в франках и оставлены только доллары.
Начало
Я живу в маленьком сельском городке в Швейцарии и довольно давно являюсь клиентом init7 (местный провайдер). Этот провайдер стал известен тем, что только он начал пару лет назад предлагать доступное для частных лиц 25 Гбит/с подключение. Впрочем, обычно, ему требуется время, чтобы обновить оборудование в точке присутствия, а, в моем случае, ему нужно было открыть где-нибудь поблизости новую точку присутствия (до этого у них был договор с другим провайдером об аренде части оборудования и места в стойке, что по прежнему давало мне оптику в квартиру, она по прежнему была не GPON'ом, но скорость ограничена гигабитом).
В 2023 году они наконец анонсировали скорое открытие POPа и перевод всех пользователей на их основной продукт (fibre7). То, что это новый POP, для меня означает, что там сразу будет доступен 25 Гбит/с тариф.
Отдельно отмечу, что работаю SRE в Google Switzerland (примечание автора: статья и все что мною сказано является исключительно моими мыслями и позицией, никакого отношения к работе и компании она не имеет) и у меня есть небольшой опыт работы с сетями. Но все же, именно практического опыта у меня мало. Кроме того, в остальном, дома в деревне бывает скучновато, так что я решил — вот мой шанс получить новый опыт, хотя и 25 Гбит дома это сильный перебор. В этой серии статей я постараюсь рассказать мой путь и мыслительный процесс на протяжении всего проекта. Также, будет как минимум одна фотография котика (а их у меня много) и некоторые другие фотографии, которые я сделал в процессе (включая фоточки железа).
Планирование
Учимся на чужом опыте
После небольшого исследования интернета я обнаружил серию блог-постов Михаэлля Стапелберга о его опыте сборки роутера (статья на английском), а также о его опыте c Mikrotik CCR2004 (25 гбитный роутер). Правда, в случае микротика, какие либо тесты отсутствовали, что не позволяло оценить подходит ли он на самом деле. Впрочем, на форуме Mikrotik'а люди обсуждают всякое, включая производительность. Давайте процитирую некоторые сообщения:
Когда я впервые получил мой 2004-ый, маршрутизация казалось упиралась в 2-3 Гбит/с, далековато от потенциальных 20-40 Гбит/с указанных на сайте
Но это было в начале, дальше тот же пользователь писал:
В районе 19 Гбит/с оба 2004-ых достигли 90% утилизации, вне зависимости от того по UDP или TCP. Используя встроенный тест скорости на 2116-м, по TCP скорость варьировалась от 4 Гбит/с в одну сторону до 8.8 или в редких случаях даже 9.2 Гбит/с. У меня было 0 правил файрвола, очередей и прочего на всех 4-х роутерах, просто IP адрес и пара статических маршрутов.
Звучит вроде бы неплохо, да? 19 Гбит/с в принципе сойдет, может быть мне и не нужно заморачиваться со сборкой роутера? Я в принципе могу смириться с проблемами, что Михаэль описывал у себя...
Но подождите...
На 7.6 и 7.7бета9 мои тесты скорости стали заметно хуже, скорее 6-7 Гбит/с вместо прежних 8-9 Гбит/с на порт. То есть, хоть 7.7 и заявляет что исправило поддержку различных скоростей на SFP+, но производительность просела где-то в другом месте.
И другой пользователь в том же треде говорит:
Локально я получаю не более 7 Гбит/с, а тестируя скорость к init7 iperf3 сервером (25 Гбит/с соединение!), получаю около 5.5 Гбит/c.
И этот роутер стоит примерно 570$ в Швейцарии на момент написания статьи. В интернете люди обсуждают другие варианты и общий вывод, кажется, что если хочется получить стабильные 20+ Гбит/с, то нужно покупать CCR2216, у которого официальная цена — 2795$, а в Швейцарии в реальности — около 2760$.
Поэтому я и решил собирать мой собственный роутер.
Сбор требований
Подумать о том, что хочется от своего роутера звучит как разумный первый шаг, позволяющий понять что же покупать. После некоторых раздумий я определил для себя следующий набор требований:
Он должен маршрутизировать ≥ 20 Гбит/с.
У него должен быть хотя бы 1 SFP28 для входящего соединения и как минимум два SFP28 для исходящих. Но в идеале 1 входящий и 4 исходящих SFP28 (то есть всего 5).
Один из портов должен выдавать нормальные 10 Гбит/с, SFP+ или RJ45 — не важно.
Он должен быть тихим, так как будет стоять в гостиной (там находится "розетка" для оптики).
В идеале, у него должно быть низкое энергопотребление.
В идеале, неплохо переиспользовать железо, которое у меня уже есть.
В плане железа, с момента апгрейда основной системы, у меня осталась практически готовая система на Ryzen 3000, не хватает только корпуса и дисков (Ryzen 3900X, 32 GB памяти, MSI X570 Ace в качестве материнки и довольно старая AIO водянка, также есть несколько каких-то видеокарт).
Про выбор сетевых карт
Немного про PCIe
Так как мы говорим про пропускную способность — требуется сделать немного расчетов на тему того, что нужно в плане пропускной способности PCIe шины.
Если вам хочется узнать больше про PCIe (простыми словами), я бы порекомендовал видео за авторством Gynvael Coldwind под названием PCI Express To Hell (на английском). Но главное что нужно помнить — ограничивающий фактор в плане пропускной способности — это как версия поддерживаемая материнской платой, так и версия поддерживаемая устройством. После чего можно, в принципе, умножить пропускную способность одной линии нужной версии на количество линий которое дает слот или устройство (меньшее из двух). Так как мне важна цена устройства, я не буду даже смотреть в сторону устройств на PCIe 5.0 (к тому же, только Ryzen 7000 и Core 12-ого поколения или новее из десктоп процессоров имеют поддержку). Большинство сетевых карт, которые я буду рассматривать, достаточно старые, поэтому основной кандидат — PCIe 3.0. Хотя есть небольшой шанс на что-то чуть поновее, поэтому PCIe 4.0 я не буду полностью сбрасывать со счетов.
Для PCIe 3.0, пропускная способность одной линии это 8 GT/s (можно было бы сказать, что сырая пропускная способность — 8 Гбит/с, но в реальности есть небольшие дополнительные накладные расходы и на практике можно получить что-то ближе к 7.5 Гбит/с), а для PCIe 4.0 — вдвое выше, то есть 16 GT/s (накладные расходы никуда не деваются, так что я буду примерно считать её равной 15 Гбит/с).
Еще одна вещь, про которую надо помнить, выбирая из домашних компонентов, что домашние процессоры имеют 20-24 линии PCIe суммарно, то есть даже теоретически не получится получить более 360 Гбит/с для устройств. Тут есть еще один подвох — на практике количество линий PCIe на слот кратно степени двойки, то есть они могут быть x16, x8, x4, x2 или x1. Притом в реальности x2 встречается редко. То есть если карта не способна загрузить все 8 линий, вставленная в слот с 8 линиями она займет их все.
Один 25 Гбит/с сетевой порт требует примерно 3.34 линии PCIe 3.0 (округляем вверх до 4х), а в случае с PCIe 4.0 — половину от этого (округляем до 2х). То есть в случае с PCie 3.0 картами можно вставить 2 карты в x8 слот, по два 25-и Гбитных порта на каждой (SFP28) или одну карту с 4-я портами в x116 слот. В случае с PCIe 4.0 (если вообще удастся найти соответствующие недорогие карты), в теории можно получить 8 портов в PCIe 4.0 x16 слоте или две 4-х портовые карты в x8 слотах. Есть еще карты с 2xQSFP28 на PCIe 4.0, впрочем на практике, скорее всего, придется ограничиться картами с 4мя портами SFP28.
Для карт важно проверить что они поддерживают. Некоторые карты могут работать как в режиме PCIe 4.0 x8, так и в режиме PCIe 3.0 x16 (хотя встречаются реже). И более новые карты чаще дороже.
О самих сетевых картах
После некоторых исследований, вот то что я нашел в интернете.
Примечание: я искал новое и только сносного качества поддержанное железо, но я буду упоминать цену на поддержанное только если она отличается от нового более чем в 2 раза, потому что так, даже купив лишнюю карту в качестве запасной, будет выигрыш по деньгам и об этом стоит упомянуть.
Broadcom P425G — её относительно сложно найти поддержанной на eBay, но иногда встречается, например такой лот за 195$ + 29.33$ доставка + растоможка (суммарно 241.60$). У карты 4 порта SFP28, она поддерживает как режим PCIe 4.0 x8, так и PCIe 3.0 x16 (заявлена поддержка для той же модели карты), у нее пассивное охлаждение и заявленное общее энергопотребление в 19 Вт, она умеет в разные модные штуки типа оффлоадинга RoCE и NVMe-oF. Подвох в том, что она разработанна для классических предприятий, поэтому часть настроек доступна только через BIOS самой карты (куда попасть можно только во время загрузки).
Intel XXV710 — 99.99$ + 32.46$ за доставку + растаможка (всего 132.45$). У карты 2 порта SFP28, PCIe 3.0 x8, пассивное охлаждение. Заявленное энергопотребление — 14.1 Вт, почти никаких модных оффлоадингов. Народ также жалуется, что прошивка на карту ведет себя странно и, возможно, для стабильной работы придется экспериментировать с разными версиями (например, из того что я слышал, карта может уйти в себя, если объединить её порты в мост с другими сетевыми картами).
Intel E810 — 384.04$ новая на Distrelec (предложения на eBay есть, но цена почти не отличается от новой). Она новее чем XXV710, у нее появились оффлоады (RoCE v2, NVMe-oF и прочие вещи), но энергопотребление выросло до 16-20 Вт и люди также жалуются на проблемы с прошивками как и у XXV710.
Mellanox ConnectX-4 LX. Самая дешевая, которую я смог найти на eBay стоила 49.48 GBP (62.70$). Она рекламируется как "абсолютно новая, сделана в Китае", правда я не уверен что это правда. У карты 2 SFP28, PCIe 3.0 x8 и пассивное охлаждение. Энергопотребление я точно определить не смог, так как разные источники говорят про 7.8 или 11.1 Вт. У нее есть некоторые базовые оффлоады, но ничего модного.
Mellanox ConnectX-5. Самая дешевая, что я нашел, стоила 158$. У этой версии также 2 SFP28, а самое важное (для дома) отличие — это поддержка модных оффлоадов, включая даже Open V-Switch (что уже перебор для дома).
Mellanox ConnectX-5 MCX516A-CCAT. У этой конкретной модели 2 порта QSFP28, что означает общую пропускную способность до 200 Гбит/с в теории. Её цена была 269.99$ + 30.05$ доставка + растаможка (333.63$ всего). Правда есть и подвох...
Во первых, PCIe 3.0 x16 — его общая пропускная способность около 126 Гбит/с, то есть несколько меньше необходимых 200. Хотя, если верить форумам, есть способы перепрошить её в MCX516A-CDAT, отличие которой в поддержке PCIe 4.0. Это выглядит потенциально возможным, так как чип и плата идентичные. Правда, никто не гарантирует, что это безопасно и карта будет работать стабильно.
Во-вторых — QSFP28. Это значит, что придется использовать специальные кабели (breakout), если, конечно, не хочется получить 100 Гбит/с на порт (по сути, QSFP28 это агрегированный канал из 4-х SFP28). В свою очередь это значит, что придется либо довольствоваться DAC кабелем (direct-attached copper), либо специальной оптикой (у которой на конце будет либо SFP28 или просто несколько хвостов). Обычно такие кабели рассчитаны на то, что все 4 конечных устройства находятся поблизости друг от друга (в одной стойке), поэтому если нужно тянуть их в разные места — не вариант. Также, в случае с активным кабелем, на конце будет 4 одинаковых SFP28, что не подходит, если одно из устройств требует исключительно SFP+.Netronome Agilio CX 2x25 GbE. Эта карточка стоит около 118$ + 27.21$ доставка + растоможка (156.39$ всего). У нее 2xSFP28, поддержка кучи оффлоадов, и, что делает её интересной, наличие SDK с возможностью как использовать eBPF оффлоадинг, так и писать свои собственную обработку на P4.
В итоге, я выбрал смесь из ConnectX-4 LX и Netronome'а, потому что мне интересна возможность поработать с P4. Я взял 6 меланоксов (2 в роутер, 1 в ПК, 1 в Thunderbolt->PCIe для ноутбука и две про запас) и 2 Netronome'а.
Немного о ConnectX
Я покупал свои у нескольких разных продавцов (включая того, что я упомянул выше, двое других были чуть-чуть дороже) и, в итоге, получил микс из "Сделано в Китае" и "Сделано в Израиле", и еще они шли с разными прошивками. Те, что "Сделаны в Китае", шли с древней, но, судя по всему, родной прошивкой (2018-ого года, что совпадает с датой изготовления на стикере), но одна из них была OEM Mellanox'ом для Huawei.
Одно из заметных отличий — для оригинальной можно просто скачать mlxup с сайта NVidia и, если есть интернет на устройстве, просто обновить прошивку через него (будьте осторожны: карта с прошивкой 2018 года заработала не во всех моих устройствах, например мой десктоп на X670E просто не увидел карту в том числе в ОС; мне кажется, что причина в том, что у них была не-UEFI совместимая версия прошивка (как минимум утилита в графе UEFI firmware показывала N/A). Но этот подход не сработает с OEM для Huawei, так как у нее другой Product ID. Есть методика по перепрошивке таких карт в оригинальную, она описана в нескольких постах на servethehome (работоспособность естественно не гарантируется, все подобные действия повторять исключительно на свой страх и риск).
TLDR: я буду предполагать, что у вас что-нибудь debian-образное и вы уже скачали новую прошивку с сайта nVidia. Важно использовать mstflint из дистрибутива или из GitHub, а не с сайта, потому что в версии на сайте nVidia не работает флаг allow_psid_change. Следующий скрипт представлен исключительно как пример и я не несу ответственность если что-то пойдет не так и вы сломаете свою карту или любое другое железо:
echo "You are about to flash your Mellanox card to a different firmware without any validation. That can cause irreversible damage to your network card or PC, please STOP IF YOU ARE NOT SURE YOU KNOW WHAT YOU ARE DOING AND YOU TAKE FULL RESPONSIBILITY FOR WHAT IS ABOUT TO HAPPEN"
sleep 60
sudo apt install mstflint
NEW_FIRMWARE_BIN="<set this to the path to your new firmware>"
# This will get the only ID of the first card, you should modify that if you need another one
PCI_ID=$(sudo lspci | gawk '($0 ~ /ConnectX/ && $1 ~ /\.0$/){print $1}' | head -n 1)
mkdir -p "mellanox_${PCI_ID}_backup"
sudo mstflint -d "${PCI_ID}" query full > "mellanox_${PCI_ID}_backup"/full_query.txt
sudo mstflint -d "${PCI_ID}" hw query > "mellanox_${PCI_ID}_backup"/hw_query.txt
sudo mstflint -d "${PCI_ID}" ri "mellanox_${PCI_ID}_backup"/orig_firmware.bin
sudo mstflint -d "${PCI_ID}" dc "mellanox_${PCI_ID}_backup"/orig_firmware.ini
sudo mstflint -d "${PCI_ID}" -i "${NEW_FIRMWARE_BIN}" -allow_psid_change burn
sudo reboot # alternatively you can try:
# mstfwreset -d "${PCI_ID}" reset
# Restore old GUID and MAC (can be found in query full)
# that should be the same as above
PCI_ID=$(sudo lspci | gawk '($0 ~ /ConnectX/ && $1 ~ /\.0$/){print $1}' | head -n 1)
GUID=$(gawk '($1 == "Base" && $2 == "GUID:"){print $3}' "mellanox_${PCI_ID}_backup"/full_query.txt)
MAC=$(gawk '($1 == "Base" && $2 == "MAC:"){print $3}' "mellanox_${PCI_ID}_backup"/full_query.txt)
sudo mstflint -d "${PCI_ID}" -guid ${GUID} -mac ${MAC} -ocr sg
И, если все пройдет успешно, ваша Mellanox'овская карточка будет идентифицировать себя как оригинальный Mellanox и даже mlxup будет работать.
Про SFP модули
Одна из вещей ,которые я понял звучит так: постарайтесь использовать оптику везде где возможно.
Есть SFP+ RJ45 модулю, но их совместимость... своеобразная. Я пробовал 3 разных модуля — fs.com'овский, ubiquity'евский и MikroTik'овский (его v2). Последний в принципе не захотел работать с мелланоксовской карточкой. Он попросту не включался и карта не писала даже дебаг-сообщений (и с дебаг-режимом включенным в драйверах).
Ubiquity'евский работал нормально, но определялся как 10G Ethernet, мультимодный 50 микрометровый, с лазером для коротких дистанций с длиной волны 850 нм, но к которому можно подключить до 100 метров меди. И не смотря на то что с Мелланоксом он работал нормально, я легко могу представить, что с такой информацией не все устройства будут с ним работать. Если вдруг интересно, вывод ehtool'а выглядит так:
# ethtool -m enp16s0f1np1
Identifier : 0x03 (SFP)
Extended identifier : 0x04 (GBIC/SFP defined by 2-wire interface ID)
Connector : 0x22 (RJ45)
Transceiver codes : 0x10 0x00 0x00 0x00 0x20 0x40 0x04 0x80 0x00
Transceiver type : 10G Ethernet: 10G Base-SR
Transceiver type : FC: intermediate distance (I)
Transceiver type : FC: Shortwave laser w/o OFC (SN)
Transceiver type : FC: Multimode, 50um (M5)
Transceiver type : FC: 1200 MBytes/sec
Encoding : 0x06 (64B/66B)
BR, Nominal : 10300MBd
Rate identifier : 0x00 (unspecified)
Length (SMF,km) : 0km
Length (SMF) : 0m
Length (50um) : 0m
Length (62.5um) : 0m
Length (Copper) : 100m
Length (OM3) : 0m
Laser wavelength : 850nm
Vendor name : Ubiquiti Inc.
Vendor OUI : 24:5a:4c
Vendor PN : UACC-CM-RJ45-MG
Vendor rev : U07
Option values : 0x00 0x00
BR margin, max : 0%
BR margin, min : 0%
Vendor SN : AK22117511563
Date code : 221119
И вторая особенность — энергопотребление. По каким-то причинам, ethtool не считывает температуру с моих SFP+ RJ45. Впрочем, по паспорту, они рассеивают до 2-3 Вт, что многовато для такого небольшого модуля и без активного охлаждения карты, модуль может перегреваться в определенных условиях.
В остальном, я купил несколько SFP28 одномодовых модулей у fs.com, и они работали нормально, также как нормально работали SFP28 DACи. Впрочем, если вы хотите поддержать европейского производителя, я бы посоветовал рассмотреть покупку модулей у Flexoptix. Помните, что для двунаправленных надо посмотреть длины волн на прием и передачу. То что нужно на входе — посмотрите у вашего провайдера, а если вы подключаете два разных устройства друг к другу, то не забудьте поменять местами TX и RX на одном из них. Например, если у вас на одном конце TX 1331 nm и RX 1271 nm, то на другой стороне нужно купить модуль с RX 1331 nm, TX 1271 nm. Сайты специализированных магазинов обычно подсказывают и спрашивают точно ли вы не хотите взять ещё и другой модуль.
Одномодовые, мультимодовые, DAC кабели
Максимальная длина DAC кабеля порядка 10 метров, а так как мне нужно тянуть оптику по всей квартире, то их я могу использовать разве что между роутером и NASом (они будут близко друг к другу).
Я везде использую одномодовые кабели, чтобы унифицировать оборудование, потому что на вход идет одномодовый кабель. В таком случае я могу переиспользовать другие кабели и модули, если будет необходимо. Одномодовые кабели немного дешевле (~13$ за 100 метров против 26$ за 100 метров), а модули чуть-чуть дороже (90$ за одномодовый против 60$ за мультимод).
Типы кабелей
Для многомодовых кабелей есть несколько разных спецификаций (OM3, OM4, и т.п.). Скорость и расстояние зависит от класса кабеля. Например, OM3 позволяет использовать 10 Гбит на расстоянии до 300 метров, но может работать и для 25 и для 40 Гбит, но на меньших расстояниях (до 70-100 метров). Во многих местах пишут, что для SFP28 лучше брать OM4. Я лично не проверял как это работает, так как выбрал одномодовые кабели.
Для одномодовых кабелей, я также взял BiDi SFPшки (я вообще не уверен, удастся ли найти не BiDi SFP28) и simplex кабели. Важен тип коннектора, так как когда вы подключаете два устройства, вам нужно на обоих концах иметь LC UPC.
Помните, что резать оптику и переобжать позже — сложнее. Вам понадобятся кевларовые ножницы, специальная зачистка и обжималка, которая сможет выровнять кабель и коннектор, а также Field Assembly коннекторы. Вы можете и сварить кабель, но для этого требуются дорогие устройства ценой в несколько тысяч $ (позже мне указали, что на aliexpress есть плазменная сварка AI-9 за ~700–1000$ — ссылка дана как пример, я не искал самый дешевый вариант).
Я посоветую почитать пост Михаэля Стапелберга, написанным в 2020 году о его выборе оборудования, там есть простая инструкция о том, как поставить field connector.
Другое железо и итоговая конфигурация роутера
Такжев я решил заменить мою старую водянку на простой воздушный кулер. Я взял Be Quiet! Pure Rock Slim 2, потому что он, по заверениям производителя, должен рассеивать до 135 Вт, чего более чем достаточно в моем случае.
В качестве корпуса изначально думал про Corsair 4000D, просто скопировав решение Михаэля, но после некоторых экспериментов и прикидок я решил взять Fractal North (Mesh) по нескольким причинам:
У Fractal North больше вентиляторов в комплекте.
Корпус у Fractal's немного больше и его mesh вариант имеет специальную скобу для установки вентилятора напротив PCIe разъемов.
Эргономически, Fractal мне показался немного лучше — крепление для SSD более удобное и доступное, больше места для кабель-менеджмента и т.п.
Стоит помнить один момент про Fractal North — не смотря на то, что он достаточно большой и в него влезает большой процессорный кулер, если он слишком большой, то будет мешать установки скобы для вентиляторов, например что-нибудь типа Noctua D-15 точно будет мешать и обдув PCIe карт ухудшится.
В качестве блока питания, я выбрал Be Quiet! Pure Power 12m — так как на момент сборки это был самый дешевый блок питания не от неизвестного бренда, у которого были съемные провода, а значит лучший кабель менеджмент.
Итоговая конфигурация (версия 1):
CPU: Ryzen 3900X (потому что был)
MB: MSI X570 Ace (потому что была)
Cooler: Be Quiet! Pure Rock Slim 2 (причины выше), 36.08$
RAM: 2x16GB DDR4 3200 CL14 (потому что была)
Mellanox ConnectX-4 LX с eBay (x1), 62.7$
Netronome Agilio CX с eBay (x1, потому что хочется попробовать что-нибудь программируемое), 156.39$
Видеокарта: Radeon R5 230 — потому что небольшая и у X570 нет поддержки встроенной (да и у Ryzen 3900X нет встроенной), 52.32$
PiKVM v4 для удаленного менеджмента (потому что был)
Блок питания: Be Quiet! Pure Power 12M 550W, 98.02$
Диски: 2xSamsung 870 Evo 512GB в SW Raid 1 (без какой-то особой причины), 98.58$ (за оба)
Доп вентиляторы: 1x Noctua NF-A14, 44.14$
Корпус: Fractal North (Mesh вариант) — 133.33$
То есть пока на сборку ушло 679.30$.
Версия 1 намекает, что вариант не финальный :) Но об этом я расскажу позже (в следующих частях).
Что бы я поменял, собирая с нуля
Я бы взял плату на B550, так как даже выбирая Broadcom'овские сетевухи мне не нужен был бы больше чем 1 PCIe 4.0 слот, а платы на B550 в целом более экономичны. Например, я бы посмотрел в сторону AsRock B550 Taichi.
Я бы заменил процессор либо на Ryzen 5700X, либо на Ryzen Pro 5750G. Хотя тут можно поспорить что лучше, так как Ryzen 5xxxG (с интегрированной графикой) ограничен поддержкой PCIe 3.0. То есть если мне нужно больше портов и я захочу поставить P425, мне потребутеся либо PCIe 4.0 x8 либо PCIe 3.0 x16 и, так как Ryzen'у 5750G не хватит PCIe на x16 + x8, и я буду ограничен x16 + x4 (нет поддержки PCIe 4.0), и в таком случае 5700X будет лучше, так как на нем я смогу получить x8 + x8 PCIe 4.0.
Я бы еще взял 3200 MHz ECC DDR4 память, вместо обычной десктопной, и я бы брал 16 ГБ (так как это все равно больше чем нужно).
Taichi, CPU и RAM стоили бы дополнительные 525.07$: RAM стоила бы 48.72$ за 2x8, CPU еще 201.61 сверху за 5700X, и Asrock B550 Taichi стоит еще 274.74$, что увеличило бы траты до 1204.37$. Часть железа можно взять БУ, чтобы уменьшить стоимость роутера.
Также можно построить систему на Intel'е, сейчас бы я взял бы Core i3 12 поколения за базу (i3–12300T) и в целом руководствовался принципом, что хорошая производительность в 2-4 потока там не помешает.
Также можно рассмотреть сборку на базе EPYC или Xeon, чтобы получить больше PCIe слотов.
Результат
После сборки, пока я все еще жду подключения 25 Гбит/с, я погонял базовые тесты, подключив машину к нему напрямую (Netronome <-> Mellanox ConnectX 4 LX, Netronome на сервере).
В данном случае, у роутера был IP 172.16.0.1, а 172.16.0.2 — у клиента. В качестве простого бенчмарка я взял iperf3 в конфигурации по-умолчанию — то есть один TCP поток (это немного нереалистично, но должно отражать худший случай на практике):
# iperf3 -c 172.16.0.2 -t 120
Connecting to host 172.16.0.2, port 5201
[ 5] local 172.16.0.1 port 41114 connected to 172.16.0.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.67 MBytes
[ 5] 1.00-2.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.80 MBytes
[ 5] 2.00-3.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.80 MBytes
[ 5] 3.00-4.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.80 MBytes
[ 5] 4.00-5.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.80 MBytes
[ 5] 5.00-6.00 sec 2.74 GBytes 23.5 Gbits/sec 0 2.80 MBytes
Пока выглядит неплохо и многообещающе (стоит помнить, что bitrate считается по полезной нагрузке, в это же время на интерфейсе счетчики показывают порядка 25 Гбит/с). Так что я запустил iperf с роутера в сторону клиента:
# iperf3 -c 172.16.0.1
Connecting to host 172.16.0.1, port 5201
[ 5] local 172.16.0.2 port 38690 connected to 172.16.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 1.91 GBytes 16.4 Gbits/sec 0 3.15 MBytes
[ 5] 1.00-2.00 sec 1.95 GBytes 16.7 Gbits/sec 0 3.15 MBytes
[ 5] 2.00-3.00 sec 1.96 GBytes 16.8 Gbits/sec 0 3.15 MBytes
[ 5] 3.00-4.00 sec 1.95 GBytes 16.8 Gbits/sec 0 3.15 MBytes
[ 5] 4.00-5.00 sec 1.96 GBytes 16.8 Gbits/sec 0 3.15 MBytes
[ 5] 5.00-6.00 sec 1.97 GBytes 16.9 Gbits/sec 0 3.15 MBytes
[ 5] 6.00-7.00 sec 1.97 GBytes 16.9 Gbits/sec 0 3.15 MBytes
[ 5] 7.00-8.00 sec 1.96 GBytes 16.8 Gbits/sec 0 3.15 MBytes
[ 5] 8.00-9.00 sec 1.96 GBytes 16.9 Gbits/sec 0 3.15 MBytes
[ 5] 9.00-10.00 sec 1.97 GBytes 16.9 Gbits/sec 0 3.15 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 19.6 GBytes 16.8 Gbits/sec 0 sender
[ 5] 0.00-10.00 sec 19.6 GBytes 16.8 Gbits/sec receiver
В top видно, что узким местом является производительность на ядро — оно все время проводит в ksoftirqd. Немного покрутив различные ручки я не добился принципиального изменения ситуации. Естественно, замена Netronome на Mellanox полностью исправляла ситуацию. В этом случае все работало нормально (CPU даже не повышал частоты до базовой частоты, не говоря уж про максимальную, потребление процессора колебалось в районе 50% в то время как частота ядра была около 3 ГГц, в то же время Netronome вызывал буст до максимальной, что для моего 3900X — порядка 4.4 ГГц).
Так что я понял, что заставить систему работать нормально с установленным Netronome'ом будет не так просто.
Что дальше?
В момент написания статьи я все еще жду собственно самого подключения. Оно займет еще неделю или две (примечание автора: оценка на момент публикации оригинала), так что мой план пообщаться с техподдержкой Netronome в том числе и о других вещах. Так что в следующей части я расскажу чем закончились эксперименты с Netronome'ом и удалось ли мне получить нормальную производительность на нем.
В то же время, я уже поменял несколько вещей в моей системе (в попытках получить 25 Гбит/с на Netronome), так что и об этом я расскажу в следующий раз.
Небольшое дополнение
Так как перевод я доделывал спустя некоторое время после публикации, ожидание уже подошло к концу и я смело могу добавить скриншот с результатами.
Выяснилась и небольшая проблема - по непонятной мне причине, модуль от fs не увидел света со стороны провайдера, хотя он прекрасно работает в связке с другим модулем от fs. Впрочем, это вылечилось заменой его на flexoptix. Симптом был простой — ethtool показывал нулевую мощность входящего сигнала, притом что по длинам волн и технологиям ни я, ни техподдержка провайдера, ни другие люди кому я показывал модули, не смогли найти никакой существенной разницы. Буду премного благодарен, если кто-нибудь в комментариях сможет указать где я ошибся.