Реза Рамезанпур, девелопер-адвокат компании Tigera, занимающейся продвижением Project Calico, рассказывает на портале The New Stack о нескольких популярных проектах ARM, об основных различиях между архитектурами x86 и ARM, а также о том, как можно подготовить разработчиков к будущему, предоставив им контейнерную ARM-среду.

Центральные процессоры (CPU) можно сравнить с человеческим мозгом, поскольку их уникальная архитектура позволяет им решать математические уравнения различными способами. На данный момент x86 является доминирующей архитектурой, используемой в облачных вычислениях; однако стоит отметить, что эта архитектура эффективна не для всех сценариев и ее проприетарный характер является причиной сдвига отрасли в сторону ARM.

ARM (Advanced RISC Machines) — это тип архитектуры процессора, на котором работает большинство планшетов и смартфонов, а также самый быстрый в мире суперкомпьютер Fugaku. Низкое энергопотребление и высокая вычислительная производительность ARM делают ее достойным конкурентом x86 в облачных вычислениях.

ARM vs. x86

Компании все чаще обращаются к архитектуре ARM для снижения стоимости и энергопотребления. В то время как x86 остается проприетарной архитектурой, ARM предоставляет лицензии другим компаниям. Это позволяет этим компаниям разрабатывать процессоры на заказ с использованием запатентованной технологии ARM.

Разработанный Amazon процессор Graviton является отличным примером использования ARM в облачных вычислениях. Благодаря применению этих процессоров экземпляры AWS A1 обеспечивают производительность, сравнимую с x86-экземплярами EC2, при этом снижая затраты на 40%.

Основное различие между ARM и x86 можно проследить в способе выполнения инструкций. Например, обычный настольный процессор x86 использует реализацию архитектуры CISC (complex instruction set computer), позволяющей одной инструкции выполнять многошаговые операции в каждом тактовом цикле.

ARM, с другой стороны, использует реализацию архитектуры RISC (reduced instruction set computer), что позволяет ему использовать ограниченный, высоко оптимизированный набор инструкций для выполнения одной инструкции в каждом тактовом цикле.

Контейнеры ARM

Прежде чем я продолжу, давайте обратимся к «слону в комнате». Вы можете подумать: «Многие среды выполнения контейнеров, такие как Docker, могут использовать команду buildx (или аналогичную) для создания контейнеров для различных архитектур процессоров, так почему мы вообще ведем этот разговор?».

Хотя docker build —platform может создать образ, специфичный для платформы, вы не можете запускать команды, выполняющие двоичные файлы из ваших рецептов (Dockerfiles).

В следующем примере вы можете увидеть неудачную сборку из-за разницы между типом архитектуры хоста и бинарного файла.

Контейнеры используют процессор и ядро совместно с хостом, что означает, что базовое оборудование диктует, какой набор инструкций можно использовать в контейнерной среде. Это можно увидеть на предыдущем сообщении сборки Docker, выделенном красным цветом.

Исполняемые программы, которые мы используем, компилируются как двоичные файлы. Компиляция — это магический шаг в процессе разработки ПО, когда компилятор (ПО) берет часть исходного кода (возможно, читаемого человеком!) и преобразует его в двоичный машинный код (т. е. единицы и нули), специфичный для процессора. Проще говоря: программы создаются другими программами. Кроме того: существуют языки-интерпретаторы, которые могут напрямую выполнять инструкции из исходного кода, но не будем погружаться в эту пучину.

Linux в помощь

Насыщенное функциями ядро Linux — это модульная часть ПО, которая может быть настроена в соответствии с вашими требованиями. Одна из таких функций, binfmt_misc, позволяет запускать практически любые двоичные файлы в вашей системе с помощью интерпретатора, независимо от архитектуры компиляции двоичных файлов. Linux можно настроить на использование binfmt_misc и сопоставить начальные байты двоичного файла, чтобы определить, какой интерпретатор подходит для его выполнения.

В нашем случае нам нужно запустить все с помощью интерпретатора, который может понимать процессорные инструкции ARM64. (Ядро Linux и binfmt — огромные темы и выходят за рамки этой статьи, но если вам интересно, то эта статья на kernel.org — отличное место для начала ознакомления).

Проект multiarch использует ту же концепцию для регистрации гипервизора QEMU в качестве интерпретатора, позволяя пользователям эмулировать различные архитектуры процессоров для контейнеров.

Цена эмуляции

Эмуляция — это отличный способ начать тестирование и разработку решений без необходимости использования реального оборудования. Однако стоит отметить, что она добавляет слой накладных расходов поверх родной платформы, что делает ее непригодной для производственных сред.

Ограниченные возможности и более низкая производительность из-за отсутствия родной платформы — это все цена эмуляции.

Сценарии использования

В последние годы языки программирования развивались, чтобы обеспечить поддержку мультиархитектурности, и в большинстве случаев не требуется практически никаких усилий, чтобы обеспечить поддержку таких архитектур, как ARM.

Проекты веб-уровня являются отличной отправной точкой для интеграции ARM. В качестве примера можно привести Apache и NGINX — очень популярные веб-серверы, которые уже поддерживают архитектуру ARM. Стоит отметить, что поддержка ARM — это не единственное преимущество, поскольку использование NGINX в качестве кэширующего сервера или обратного прокси в среде ARM позволит достичь более высокой производительности по сравнению с x86.

Базы данных in-memory — еще одна область, где архитектура ARM может обеспечить улучшения. Используя архитектуру RISC, такие приложения, как Redis, могут достичь впечатляющей производительности по сравнению со средой x86.

Полный спектр сценариев использования — это обширная тема, которая выходит за рамки данной статьи, но если вам интересно, ознакомьтесь с техническим докладом AWS, в котором рассказывается о некоторых экспериментах и эталонных тестах для архитектуры ARM64.

Заключение

Архитектура ARM представляется отличной альтернативой системам x86, и ее эффективность способствует инвестициям компаний в ее будущее для облачных вычислений. Соответствующая трансформация приложений и кластеров может позволить снизить затраты без ущерба для производительности.