Ферма RaspberryPi, часть 1
Первый пост из серии про ферму на RaspberryPi. Мотивация и выбор компонентов
Введение
Идея создать вычислительную ферму дома у меня появилась, после того как я присоединился к инфраструктурной команде Яндекса и открыл для себя удивительный новый мир датацентров, сетей, питания, виртуализации и контейнерных окружений. Не то, чтобы я не знал что это такое до этого, ведь у меня более 10 лет опыта в IT, просто раньше не приходилось с этим сталкиваться вместе и в огромном масштабе.
В Яндексе построено несколько датацентров, которые насчитывают десятки тысяч хостов - и всем этим железом надо как-то управлять! Помимо банальных вещей в буднях DevOps/SRE инженеров, вроде зависла виртуалка/контейнер и надо его ребутнуть, есть еще и важные задачи обновления хостовых машин, обеспечение питанием, охлаждением, сетевой связанностью и многие-многие другое.
Взглянув на эти масштабы, я осознал, что в моих знаниях есть пробелы. К тому же, у меня появился жгучий интерес все это попробовать и пощупать. Как это сделать не отвлекая коллег от работы я не представляю, поэтому принял для себя решение собрать хотя бы одну стойку у себя дома. Очевидно, что настоящую серверную стойку собрать дома не выйдет (ну или по крайней мере собрать ее так, чтобы домочадцы не выгнали на улицу), поэтому выбор пал на SoC (System-on-Chip) решения. Они компактные и не требуют каких-то сложных операций по обсулживанию. Осталось выбрать производителя и можно начинать проектировать.
Выбор компонентов
Для начала давайте поймем наши требования (пусть хоть пока и туманные, учитывая задачу “обучения”) к нашей ферме. Нам нужны какие-то мощности по вычислениям и работе контейнеров - значит нужно иметь как минимум 4 ядра на борту (1-2 на хостовые нужды, 2+ на сами контейнеры). Нам нужна поддержка виртуализации и как минимум 8Гб оперативной памяти (1-2 на хост, остальное в контейнеры). Кроме того, диск будет узким горлышком в такой системе (операции I/O), а значит нам нужна поддержка SSD NVMe по шине PCIe. Также, сеть должна быть хотя бы гигабитная, поскольку мы планируем добиться интенсивной передачи данными между хостами. Из дополнительных требований, нам должны быть доступны порты GPIO для подключения датчиков, периферии и прочей обвязки.
Итак, что нам может приедложить рынок? В первую очередь нужно понять какую архитектуру процессоров стоит использовать. На выбор у нас:
- x86_64 камни в мобильном исполнении от Intel, AMD и прочих китайцев
- ARM-Cortex, ARMv7 и прочие варианты от именитых брендов, вроде STM, Atmel и Texas Instruments
- ARM64 чипы от Raspberry, Orange и прочих китайцев
Проблема с первой группой на классической архитектуре заключается в размерах обвязки и соотношения стоимости решения к его производительности. Можно взять к примеру решение на современных Intel Pentium / Celeron, но размер материнской платы напрямую коррелирует с размером кошелька - чем они миниатюрнее, тем дороже. Также есть проблема в невысокой мощности самих камней, мы же хотим все таки гонять какие-то вычисления на них. Их TDP достаточно мал и система в целом не предназначена для такого использования. Плюсом к сказанному найти чип с выведенными портами GPIO - тот еще квест.
Вторая группа мне виделась самой перспективной, но с ними ситуация оказалась даже хуже, чем в первой группе. При высокой стоимости основной сегмент рынка для них - встраиваемая электроника. Что-то хоть сколько-то мощное на них запустить вряд ли получится, задачи все таки другие. Еще из минусов почти на всех этих системах идет либо риал-таймовые ОС, либо очень сильно усеченный linux.
Третья группа оказалась самой подходящей под критерии, хотя мне всегда казалось, что решения на SoC от Raspberry - это сродни проекту на Arduino, ничего серьезнее миганиями ламочками на наих не сделаешь. Однако я ошибся - в реальности есть множество кейсов индустриального использования таких камней и рынок готов предложить приличные решения за вменяемые деньги.
В итоге, я остановился на бренде Raspberry как самого раскрученного и обладающего большим коммьюнити. Давайте теперь посмотрим что можно собрать при помощи этих железок.
RaspberryPi - Compute Module 4 и материнские платы
Я был сильно удивлен, узнав, что чипы от RaspberryPi могут поставляться в двух вариантах - всем хорошо известная плата для разработки дома и индустриальная версия Compute Module (CM. Если первая - это аналог demo board от других известных брендов, то вторая - полноценный встраиваемый модуль с кучей возможностей и расширенной периферией.
На момент, когда я задался целью построить свою ферму, актуальной была версия CM4 (аналог RaspberryPi 4B) по возможностям. Конечно сейчас уже появилась 5 версия платы и мы ждем анонса CM5 (производитель обещал в течение 2024 года что-то сказать).
Поставляется CM4 в виде небольшого модуля с выведенными портами под специальный сокет. Из характеристик:
- Broadcom BCM2711 quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
- H.265 (HEVC) (up to 4Kp60 decode), H.264 (up to 1080p60 decode, 1080p30 encode)
- OpenGL ES 3.1, Vulkan 1.0
И опции поставки следующие:
- 1GB, 2GB, 4GB или 8GB LPDDR4-3200 SDRAM
- 0GB (“Lite”), 8GB, 16GB или 32GB eMMC Flash memory
- с беспроводным модулем или без него
Нам нет нужды иметь Wi-Fi модуль на борту, поэтому берем самую максимальную комплектацию (4 ядра, 8Гб) без беспроводного модуля и встроенной eMMC. Забегая вперед, могу сказать, что отказ от eMMC на борту был скорее ошибкой, потому что без нее обновлять прошивку нашего камня на порядок сложнее.
Чтобы наш модуль заработал, нам нужно подобрать правильную материнскую плату. На рынке есть достаточное количество материнский плат, куда его можно вставить, например от китайского производителя WaveShare. Держа в уме наши требования, давайте посмотрим технические характеристики одной из таких плат:
- Gigabit Ethernet RJ45 connector
- M.2 M KEY, supports communication modules or NVME Solid State Drives
- USB 2.0 Type A × 2, USB 2.0 via FFC connector × 2
- MIPI DSI display port (15pin 1.0mm FPC connector)
- MIPI CSI-2 camera port × 2 (15pin 1.0mm FPC connector)
- HDMI port × 2 (including one port via FFC connector), supports 4K 30fps output
- Real-time clock with battery socket and ability to wake Compute Module 4
- Fan Header 5V
- GPIO 40Pin Header
Хочется отдельно отметить возможность подключения NVMe дисков по шине PCIe. Почти во всех гайдах “как мне подключить не SD-карточку к моему RaspberryPi” предлагается использовать мост USB-SATA3, что конечно же катастрофически медленно и совсем мне не подходит. В целом, понятно, почему массово не используется прямая шина PCIe для подключения хранилищ: во-первых, шина имеет всего один канал (по сути это PCIe x1), а во-вторых, код в прошивке отвечающий за работу шины проприетарный (исходный код закрыт и принадлежит Broadcom), что означает проблему с написанием драйверов различных хранилищ. Отдельно стоит отметить недостаток питания самой RaspberryPi для запуска хоть сколь-нибудь шустрого диска. Почти все NVMe диски требуют 1,5А+ тока при питании 5В+ - модуль физически не может отдать столько мощности. Существуют и менее мощные SSD на 3,3В и куда менее прожорливые, но они редки и при покупке непонятно, смогут ли они заработать из-за закрытой прошивки. Есть даже специальный сайт, куда складывают результаты экспериментов и тестов - https://pipci.jeffgeerling.com Рекомендую ознакомиться, перед покупкой периферии для CM.
Выбор SSD диска переросло большим приключением. На самой плате форм-фактор диска мог быть в двух форматах 2230 и 2242. Не зная о сайте, приведенном выше, я вслепую купил несколько подходящих по форм фактору ноунейм карточек и погрузился в отладку. Карточки работали очень нестабильно, часть работала часть нет, периодически отваливалась. Я грешил на заводской брак или свою недальновидность в настройке - ведь мы хотим загружаться с SSD диска и у нас нет возможности начать грузится с eMMC. Оказалось, что проблема в конкретном производителе карточки и надо просто взять проверенный вариант. Если кому-то интересны мои похождения, я даже завел тикет на разработчиков прошивки, можно почитать тут