Максим Лапшин — владелец Эрливидео, его компания уже 10 лет разрабатывает серверный софт для доставки и обработки видео. Его использует телевидение, он нужен для работы с камерами. Софт работает с разными вариантами железа, доставка — цифровая.   При этом заказчики частенько спрашивали и про железо. Сначала разработчики отправляли клиентов подбирать его самостоятельно, но не все были этому рады — большинство хотят получать все в одном окне. Одновременно копилась статистика, когда клиенту обычно продают то, что надо сбыть продавцу. В итоге, если что-то не работало, виноват был Эрливидео.  Так родилась идея создать свою материнскую плату. Идея переросла в большой квест, про который Максим рассказал на HighLoad++ Весна 2021. Все детали прохождения — в сегодняшней статье. Сначала мы решили обкатать всё на чужом, готовом железе, подходящем под наши задачи. Мы нашли производителя сервера, в который могли бы воткнуть нужные нам ускорители, и написали огромное количество софта, чтобы это заработало. Отдельной головной болью было найти упаковщика Linux для нашей железки. Потому что это абсолютно вылетающая из всех реестров профессия. Так или иначе, мы это запустили, поставили клиентам, они попробовали и им понравилось. Так мы продали наше первое железо. Но одновременно мы захотели, во-первых, улучшить характеристики, а во-вторых, сделать дешевле. Так мы пришли к идее разработки собственной материнской платы. Вариантов у нас было два. Стандартный форм-фактор или четырех юнитовый сервер, в который набиты видеокарты. Но так как последний сейчас невозможно купить из-за майнеров, мы выбрали  форм-фактор ATX — он втыкается куда угодно.  Он же подошел по двум другим важным моментам — электричество и отвод тепла. Железок на 4 юнита и 2 киловатта в стойку можно поставить максимум три. Больше 6 киловатт на стойку — это предел, за которым заканчивается теплоотвод. Хотя один из наших клиентов в свой дата-центр завел городскую холодную воду, выпуская обратно немножко не такую холодную воду. Но не у всех есть возможность подогреть воду для целого города. В разработке плат у нас опыта не было. Один коллега когда-то заказывал маленькую плату, другой возился с этим. Мы представляли в целом, что там есть текстолит, медь... и на этом наши знания заканчивались. Но зато мы понимали, что именно хотим получить — и решили найти студию разработки железа. Нам казалось, что сделать им заказ будет также просто и предсказуемо, как ремонт в квартире.  Первое знакомство с железячниками было отрезвляющим, потому что у нас в стране они чаще всего работают через госзаказы, а то и гособоронзаказы, что совсем грустно — они очень специфичные.  Очень многие хотели Техническое Задание (говорить с придыханием). Конечно, мы его родить не могли. Мы пришли всего лишь за дизайном карты, за общими ориентирами, и не представляли, какие детали там должны быть. А так как исполнитель лучше нас разбирается в этом, любые договорные отношения были бы нечестными априори. Нам могли любые вещи вписать в договор, и мы бы не поняли, что это означает. И, конечно, невозможно начать с MVP, потому что нельзя сделать маленький кусочек платы, запекая ее по чуть-чуть. Её сразу надо делать, и с первого раза она должна запуститься (нет).  Но представим, что мы все-таки напишем ТЗ. Тут может быть другая проблема — чем больше мы на этапе дизайна будем вносить технических деталей в техническое задание, тем больше шансов всё похоронить. Потому что мы можем вписать по ошибке что-то, что поднимет ценник в 2 раза или сделает задачу вообще нереализуемой. Чтобы нам не сказали потом: «Это же вы написали! Вы же сами захотели посреди комнаты фонтан!», мы искали экспертизу исполнителя еще на этапе проектирования.  В других странах, вероятно, по-другому, но мы хотели начать с России. Поэтому я не буду говорить про топовые фирмы типа Antmicro, это офигенные, восхитительнейшие ребята. Они даже делают софт для отладки дизайна, то есть заранее его моделируют. За этим будущее, но пока не все в это будущее пришли. Наши середнячки хотят писать софт сами, потому что привыкли делать сразу ПАК (программно-аппаратный комплекс). Но нам не были нужны их услуги.  И, честно говоря, весь софт для проектирования железа, что я увидел на рынке дизайна железа — ужасен. Если вы пользовались Rational Rose и пытались коммитить в CVS, или работали с Zope, то знаете, что это больно, это кошмар. Также там не пользуются системой контроля версий — у них нет практики, например, построить дельту, чтобы посмотреть изменения. Поэтому вычислить, что поменялось между двумя файлами с дизайнами — целая история. Естественно, о встройке этого софта в GitLab или куда-то еще — речь даже не идет.  Кроме того, большинство железячников не очень итеративны. Для многих из них не понятно, как можно попробовать что-то, потом еще что-то — и идти маленькими шагами. Нет, они говорят: «Давайте сделаем всё сразу, и у нас сразу хорошо получится!». Когда я слышу такое от девелоперов, у меня сводит скулы. И с софтом, и с железом так обычно не получается, но они там все еще считают, что это возможно.  В итоге мы начали экспериментировать сами. Мы же разработчики — мы знаем, что надо экспериментировать. Чем раньше fail, тем быстрее получим результат. Даже если по мнению железячника PCI Express линии обязаны быть друг от друга на строго фиксированном расстоянии, мы их можем, например, подвесить в воздухе. И всё, оказывается, будет работать — просто не так быстро, как нужно. Но мы хотя бы пощупаем, как это работает. Наши эксперименты показали, что дни прототипирования берегут месяцы производства. Собрав прототип на столе, мы выиграли не меньше 8 месяцев на том, что протестили железо. Потому что сразу выяснились некоторые проблемы, и мы смогли что-то переделать.  На столе мы проверили почти всё, что смогли: управление питанием, ethernet, другие устройства. Мы выяснили, как правильно запустить процессор, потому что из документации это было не совсем понятно. Конечно, запустить Intel’овский процессор класса Core​ i9 на столе — это безнадега. Потому что это очень сложное устройство с жутко синхронизированными таймингами старта, подачей напряжения и пр. А вот system on module — вполне можно. Плюс мы разобрались с разной периферией, например, с gpio и i2c — низкоскоростными шинами, по которым вся эта машинерия вместе связывается, — и заставили их работать. Всё, что мы поленились проверить,  поехало во вторую итерацию. Это +1 год. Например, мы не проверили сеть на перекачку пакетов. Понадеялись, что она будет держать гигабит в нужных условиях. Но потом выяснили, что не у всех ARM есть APIC, и прерывания живут на одном ядре. А значит, он схлопнется где-то на 200-300 Мб перекачки данных и не сможет выйти на максимальный перформанс.  Результаты экспериментов помогли нам в общении с железячниками. Мы сами поменяли ряд требований после того, как их проверили. На прототипирование у нас ушло 2-4 недели, что не такой уж большой срок на фоне общего времени проекта, одно растаможивание занимает 3-4 недели. Так что пока вы согласовываете договор с железячниками, можно успеть выяснить те детали, которых не хватало. Также мы выписали гипотезы о том, что может похоронить проект. И на этом же этапе сформировали очень важный список требований, что мы будем проверять, когда получим плату.  Софт надо писать и тестировать сразу же. Если подождать готовой железки, вас ждет +1 год на вторую итерацию. А если софт будет готов к получению платы, вы сразу сможете его залить и проверить, что не работает, чтобы сформировать вторую итерацию. Она будет, можете не сомневаться. При этом мы сразу проектировали железку под автоматизированную тестируемость, чтобы можно было подключить еще один компьютер. Написали набор тестового кода, который заливает всю firmware и полностью ее прошивает. Это можно делать в цикле CI, выжигая флешку до упора, чтобы можно было поменять и заново это все сделать. Я не знаю, как обеспечить качество без CI. У железячников с этим очень плохо. Они привыкли к концепции ручного тестирования — прокликал и нормально, отправляй, дальше разберутся. IPMI и его аналоги мы тоже запланировали сразу. Управление питанием, прошивкой — это непросто и очень важно. Железячники не считают это нужным по умолчанию, и далеко не все компьютеры легко сделать удаленно управляемыми. Например, для десктопа это целая история. Даже среди серверов есть экземпляры без банального IPMI.  Наверное, для сотового телефона это и не очень нужно. Но если какую-нибудь умную колонку сделать с плохим управлением, как ее восстанавливать, когда она окирпичится? Мы же теперь можем прямо сказать клиенту: «Слушай, апгрейд прошел плохо, воткни флешку, мы вместе сейчас её пресетим», потому что возить плату из Чили и обратно — долго и дорого. Разрабатываемость тоже нужна удаленная, вплоть до UART снаружи. Шансов на то, что вы наймете человека, способного писать прошивку на этот девайс в том же городе, где он находится — мало. Поэтому мы заранее продумали, чтобы человек мог делать это удаленно. Особенно, когда всех заперли по домам и запретили ездить на работу. Параллельно с экспериментами мы продолжали искать исполнителей для дизайна, проектирования, печати и распайки компонентов. Это можно делать в одной компании, а можно в разных. Например, по совету мы пришли к известной китайской фирме. Те исчезли в закате. Через два месяца наш клиент пришел к нам с китайской платой по нашему дизайну и просьбой написать софт под неё. Выводы делайте сами.  В итоге нам повезло найти людей, которым хватило схемы на салфетке — человек молча вынул из кармана пример похожей штуки и сказал: «Я такое делал, тебя понял. По деньгам договоришься, а я займусь своим любимым железом». В этом хорошем взаимном процессе мы наконец родили описание всех схем, в том числе ЭПС — электрическую принципиальную схему. Квалификации программиста здесь еще достаточно для понимания всех деталей. А их очень важно прояснить. Например, с SDK. Нам предлагали поставить роутер на чипе за 5$, но к нему — SDK за 100K$. Или нам не хотели продавать разъемы из-за того, что «у вас в стране КГБ и шпионы». И мы покупали на Эру. Это был последний этап, где я еще мог что-то понять, дальше все стало намного сложнее. На уровне электроники начинаются резисторы и конденсаторы. Я в этом не разбираюсь, и мог лишь доверять исполнителям. Но и это были еще цветочки. После этого этапа начался кондовый опыт исполнителя. Нам был нужен человек с опытом создания платы и получения брака и нам был терморасчет двух опорной шарнирной балки для нашей железки. Потому что материнская плата может изгибаться при нагреве и расслаиваться. Несмотря на мизерное потребление в 100 ватт нашей платой, по ней проходит хоть и низковольтовый, но огромный ток. 220-100 ватт превращаются в полвольта, т.е в 400 раз больше! В результате плата греется и начинает гулять. А если максимальный нагрев — между винтами, то в этом месте плата начнет выгибаться. Причем это обычное дело. У нас есть аналитики, которые тренируют нейросетки на полубытовых компьютерах. Их железо уходит в максимальный нагрев на неделю-две, и потом может не выйти. Потому что материнская плата реально расслаивается — мы такое видели. Но здесь мы не могли этого допустить. Поэтому человек, который проектирует плату, должен был точно знать, где будут точки крепления, чтобы туда перенести зону максимального нагрева. Заодно сделав это так, чтобы весь корпус не сильно гулял. Короче, я понял, почему сервера железные, а не пластмассовые — иначе материнка их порвет на части. Это будущая надежность. Для бытового компьютера это не так важно, потому что он поработал и выключился. Мы же рассчитывали на 100% нагрузку 7/24 на весь срок жизни платы. Но и это еще не все. После этого свои поправки начинают вносить технологи печати и распайки — это нельзя напечатать, то нельзя распаять. При печати есть нагрев, прогрев, остывание, есть процессы и просверловки. Нельзя, например, просверлить только 4 слоя (можно, но фантастически дорого). Поэтому сверлят насквозь, и если просверлят что-то не то, будет грустно. Поэтому проектировщик должен скомпоновать все 12 слоев и тысячи дорожек так, чтобы, просверливая в нужных местах, все оказалось в нужном месте, и при этом при остывании плату не покоробило. Например, технологи возвращали нам платы со словами: «Это нельзя сделать», и железячники перекомпоновывали детали на плате — переносили, перетаскивали. Отсюда может пойти смена функциональности. Например, мы хотели разместить 4 SSD, но нам сказали, что придется оставить только 2. Мы старались быть готовыми к тому, чтобы очень быстро менять даже концепцию железа, потому что приходится учитывать реалии.  И пока технологи создавали плату, мы стали покупать компоненты. Здесь есть ряд нюансов. Если взять много, что-то останется лишним, а это дорого. К тому же, пока вы перекомпоновываете плату, что-то может стать ненужным. Взять мало — не хватит, и придется потерять 2-3 месяца на ожидание новых компонентов. Конечно, мы выбрали первый вариант, и у нас осталась россыпь ненужных резисторов. Но основная проблема в том, что если мы хотим печатать в России, то наш перечень номеров деталей, которыми усыпана вся материнка, не совпадает с международной номенклатурой. Эра не поможет. Потому что компоненты, как правило, подбираются не как «Нам нужен резистор марки такой-то», а «Нам нужен резистор, у которого такие-то характеристики, и пускай программа сама подберет что-то под них». Это больно. Поэтому мы выбрали печать в Тайване, а распайку — в Москве. Получилось хорошо. Наоборот вышло бы плохо: в России таких плат из 12 слоев, к сожалению, делать пока не умеют, это возможно только в Тайване или в Германии.  После того как мы все согласовали, а завод принял наши детали, прошло примерно 4 месяца. Наша плата приехала в офис. 4 месяца — это фантастически быстро, но плата, конечно, не включилась — и мы взяли в руки вольтметр и осциллограф. Верхнего слоя лака на плате не было, и мы могли подпаивать или распаивать проводочки, обрезать линии. Хороший проектировщик, самый рискованный, выносит для этого линии наверх — потому что на третьем слое снизу, как правило, это невозможно.  Одновременно мы судорожно переделывали софт, потому что какие-то детали оказались не такими, как казались. На этом этапе у нас была офигенная история. Сестру этой платы курьер при доставке к дизайнеру-железячнику просто выбросил по пути в мусорный бак. Плату, которая была практически в единственном экземпляре. Этот риск мы вообще никак не могли предположить — это как упавший метеорит. В целом, здесь может что угодно пойти не так — вплоть до того, что можно выяснить, что на такой конфигурации вообще ARM не заводится.  Но мы завершили отладку, и у нас на столе появился первый образец готовой платы. Она запустилась и заработала, но как мы выяснили — не на полную мощность. Поэтому мы вспомнили про тот поток идей, которые на первом этапе отсеяли со словами «Это будет дальше». Сейчас мы делаем на их основе второй девайс, потому что первый на продажу не вышел. Во втором мы перекроили сетевое ядро, заменили форм-фактор и главный процессор. За год NVIDIA тоже выпустила другие процессоры на новом форм-факторе. Это не так страшно, мы вносим изменения. Во время отладки мы выяснили, что упустили, и как плата будет работать. Со второго раза она должна получиться идеальной и, скорее всего, уже пойдет в продажу. Мы понимали, что ошибемся практически везде, где только можно, поэтому просто отнеслись к этому с пониманием. При создании второго прототипа мы учли все ошибки, что совершили в первом. Более того, мы остались партнерами с вендором, на чьем железе создали свой пробный транскодер. Его сейчас тоже продаем, это прекрасный канал сбыта.  Наш первый прототип похож на него, но в 2 раза меньше съедает электричества. Кроме того, он намного дешевле, потому что Intel — это дорогая штука, а у нас ARM, который стоит просто копейки по сравнению с ним. Ну и просто круто от Intel отказаться!  Со вторым прототипом мы рассчитываем получить предсказуемую и проверенную конфигурацию. Ее будет легче обеспечить качественную поддержку из-за отсутствия многочисленных вариантов железа. Продажи теперь будут гораздо быстрее, time to market — ниже, так как не нужно будет ждать неизвестно сколько времени (то ли один день, то ли два месяца), когда приедет нужная видеокарта. И прибыль от всего этого, конечно, никто не отменял. В этом году нас ждёт ещё два HighLoad’a: 20-21 сентября в Санкт-Петербурге и 25-26 ноября в Москве. Приём заявок на московские выступления открыт, все подробности здесь. Питерское расписание уже готово. Билеты уже в продаже. Их стоимость растёт — чем ближе к мероприятию, тем дороже. Вы можете сегодня забронировать себе места по текущей стоимости, и затем у вас будет несколько дней на то, чтобы принять решение. Текущая стоимость до 31 июля: в Питере, в Москве.  Встречаемся на конференции!