ROSA Server 2.0 на YADRO: тестируем ARM-стек под веб-нагрузку
ROSA Server 2.0 вышел с ядром 6.6 и расширенной поддержкой ARM. Гоняем дистрибутив на серверах YADRO с Arm-процессорами - что получилось на типичных нагрузках веб-сервисов.
ROSA Server 2.0 вышел на базе ядра 6.6 с расширенной поддержкой ARM-платформ
ROSA Server 2.0 вышел в конце января. Главное в релизе - переход на ядро 6.6 LTS и существенно расширенная поддержка ARM-платформ. У нас есть несколько серверов YADRO с Arm-процессорами, которые до сих пор работали на x86-совместимых решениях через виртуализацию - не самая изящная история. Решили воспользоваться поводом и проверить, что представляет собой новая версия именно в контексте нативного ARM-деплоя под реальные нагрузки.
Контекст: почему YADRO + ARM
У одного из клиентов на сопровождении стоят серверы YADRO Vegman линейки с Arm-процессорами - рассматривались как перспективное железо для масштабирования веб-сервисов. Железо прошло КИИ-аттестацию, в реестре отечественного ПО есть, процессоры имеют хорошее соотношение ядер к тепловыделению - по бумаге история выглядит привлекательно.
Проблема была в программном стеке. Большинство отечественных дистрибутивов де-факто тестируются под x86, ARM-поддержка добавляется как опция и часто на уровне «загружается и не падает». ROSA Server до версии 2.0 тоже не был исключением - поддержка ARM была, но неполная, и ряд пакетов из поставки просто не собирался под эту архитектуру.
С 2.0 вендор заявил полноценный ARM-стек. Решили проверить, что значит «полноценный» в переводе на реальные нагрузки.
Что в 2.0 реально изменилось
Ядро 6.6 LTS - это не просто цифра. В контексте ARM это означает нормальную поддержку новых Arm-платформ, которых в 5.15 (ядро предыдущей ROSA Server) попросту не было: улучшенный PMU для профилировщиков, нормальная работа с большими страницами памяти на современных Armv9-процессорах, исправленные проблемы с IOMMU на ряде чипсетов. Мы об этом косвенно писали в контексте Astra Linux SE 2.14 - там то же ядро решило проблему с NVMe-контроллерами на YADRO-железе.
Второе - репозиторий пакетов под ARM стал полным. В предыдущих версиях под ARM не собирались, в частности, nginx с нестандартными модулями, некоторые версии openssl с аппаратным ускорением, и несколько компиляторных инструментов. В 2.0 мы прошли по нашему стандартному набору пакетов для веб-стека - всё собралось из родного репозитория без необходимости тянуть что-то с upstream.
Как тестировали
Подняли тестовый стенд: два сервера YADRO Vegman с Arm-процессорами в роли application-нод и один x86-сервер в роли балансировщика нагрузки и базы данных (PostgreSQL 17). На ARM-нодах - nginx + PHP-FPM под типичное веб-приложение, которое мы используем как эталонную нагрузку в тестах: смесь статики, динамических страниц с DB-запросами и API-эндпоинтов.
Для генерации нагрузки использовали wrk2 - инструмент, который позволяет задать точный RPS и измерять latency, а не просто «сколько запросов пролетело». Прогоняли три сценария:
Сценарий 1 - статика. Отдача статических файлов через nginx: изображения, JS, CSS. Здесь разница между архитектурами минимальна - nginx на ARM работает ожидаемо хорошо, ядро 6.6 нормально использует аппаратный prefetch. Латентность на одном уровне с нашими x86-референсными серверами аналогичного класса.
Сценарий 2 - динамика с БД. PHP-FPM обрабатывает запросы, каждый делает несколько SELECT к PostgreSQL. Вот здесь интереснее. ARM-процессор на YADRO хорошо держит параллельную нагрузку за счёт большого числа ядер, но на одиночных запросах с высокой вычислительной сложностью x86-референс пока выигрывает - это ожидаемо, история про IPC, а не про количество ядер. При нагрузке, где в очереди постоянно висит несколько десятков параллельных запросов, картина выравнивается: YADRO держит хвостовую латентность ровнее.
Сценарий 3 - CPU-bound задачи. Генерация PDF, ресайз изображений через ImageMagick. Тут пришлось отдельно проверить компиляцию пакетов под ARM: ImageMagick в ROSA Server 2.0 собран с поддержкой NEON-инструкций, это ARM-аналог SSE/AVX для векторных операций. На ресайзе изображений NEON даёт заметный прирост по сравнению со скалярным кодом - разница видна невооружённым взглядом в профайлере. По сравнению с x86-сервером с AVX2 результаты сопоставимы, YADRO не проигрывает.
Что пришлось доделать руками
Совсем без шероховатостей не обошлось. Два момента, которые отняли время.
Мониторинг. Node Exporter для Prometheus на ARM под ROSA Server 2.0 встал без проблем - пакет есть в репозитории. А вот один проприетарный агент мониторинга, который клиент использует для своего SOC, поставлялся только в x86-бинарнике. Пришлось решать через контейнер с эмуляцией - это работает, но добавляет накладные расходы. Это не проблема ROSA, это проблема вендора агента, но реальность такова.
Сборка нестандартного модуля nginx. Один кастомный модуль nginx, написанный под конкретные нужды клиента, собирался без проблем на x86, а под ARM словил ошибку компиляции - использовал inline assembly с x86-специфичным кодом. Пришлось переписать проблемный фрагмент на переносимый C. Это разовая работа, и правильное решение, но закладывать время нужно.
Итог
ROSA Server 2.0 на YADRO - это первый отечественный дистрибутив, с которым ARM-стек под веб-нагрузку реально работает без существенных костылей. Пакетная база полная, ядро 6.6 работает с железом нормально, NEON-ускорение в ключевых пакетах присутствует.
Переходить на ARM в production прямо сейчас или нет - зависит от конкретного стека. Если весь используемый ПО из пакетного репозитория ROSA и нет проприетарных агентов с x86-зависимостями - история выглядит рабочей. Если есть нестандартные компоненты - стоит честно проверить каждый на совместимость до того, как принимать решение. Мы пока держим тестовый стенд ещё несколько недель, прежде чем рекомендовать клиенту production-переезд.