Оптимизация и ускорение Java-приложений с Axiom Native Image Kit
7 мая 2021 г.
Axiom Native Image Kit (Axiom NIK) — пакет разработчика с утилитой Native Image, преобразующей байт-код на языках JVM в предварительно скомпилированный исполняемый файл, который запускается автономно и почти моментально. Продукт основан на открытом коде проекта GraalVM Community Edition и собственных разработках Axiom JDK. Благодаря совместимости с различными платформами, в том числе легковесной ОС Alpine Linux с библиотекой musl, эта технология сокращает размер приложения и общее потребление ресурсов.
Ниже мы продемонстрируем, как Axiom NIK может облегчить работу Java-разработчика и какие проблемы решает.
Универсальный инструмент
Native Image — полезная технология для ускорения приложений. В одной из недавних статей для Хабра мы провели эксперимент: проверили, какая конфигурация микросервиса на Java потребует минимального объёма RAM и запустится быстрее всего. В сравнении с методами оптимизации виртуальной машины проект в виде native image (или «нативного образа») под Alpine Linux стартовал в 10 раз быстрее, за 0,1 секунды, затратив при этом в два раза меньше оперативной памяти. Эксперимент проводился с «достроенным» слоем glibc — тогда GraalVM ещё не был совместим с библиотекой musl, в которой заключается основной смысл и преимущество Alpine Linux.
Так перед инженерами Axiom JDK возникла задача привнести в GraalVM Open Source полноценную поддержку musl. Мы предложили четыре патча: на момент выхода этой статьи три уже интегрированы в код проекта, и один пока находится на рассмотрении.
- Linux-musl support #230 (интегрирован)
- Added linux-musl support #175 (fastr) (интегрирован)
- [WIP] linux-musl support #3141 (на рассмотрении)
- Added linux-musl support #2223 (truffleruby) (интегрирован)
Все изменения будут внесены непосредственно в систему сборки и код Graal. Они связаны с поддержкой дистрибутивов Linux, использующих musl в качестве стандартной библиотеки C, одним из которых является ОС Alpine Linux.
Наша команда занялась этими патчами, чтобы подготовиться к выпуску собственного продукта, объединяющего возможности библиотеки musl, GraalVM и Axiom JDK , бесплатного дистрибутива OpenJDK с открытым исходным кодом.
Так же как и в случае JEP 386, который мы недавно интегрировали в JDK 16, реализация нативной поддержки musl даёт 3 весомых преимущества:
Кроме того, она существенно снижает время разработки, объём передаваемых данных и расходы в целом. В сфере ИТ распространен принцип «чем меньше, тем лучше»: снизив потребление ресурсов до минимума, ваш бизнес сможет извлечь максимум из проекта. Сочетание технологий Alpine и Native Image поможет сэкономить на размере образов, оперативной памяти и скорости запуска — пример с числовыми данными ждёт вас в следующем разделе.
Axiom Native Image Kit
Мы выпускаем компилятор Axiom Native Image Kit в виде JAR-архивов. Каждый пакет состоит из виртуальной машины Axiom VM, инструмента для создания нативного образа (разработанный на основе кода GraalVM CE) и языковых плагинов, совместимых с конкретными ОС.
Текущая версия сборок поддерживает следующие системные конфигурации:
- операционные системы: Windows Server & Desktop x86_64, Linux x86_64 (glibc), Linux Alpine x86_64 (musl), Linux AArch64 (glibc), Linux Alpine AArch64 (musl), macOS 64_64
- языки программирования: Java, JavaScript, LLVM, Python, Ruby, R и WebAssembly
- дистрибутивы созданы на базе JDK 11.0.11 и Graal VM CE 21.1.0
Информация о том, какие языки доступны Axiom NIK на представленных платформах, содержится на странице Поддерживаемые конфигурации.
Эффективность нового инструмента лучше всего заметна на примерах. Проведём эксперимент. Созданный на фреймворке Spring микросервис сперва упакуем в JAR и запустим в контейнере на Debian 9. Затем скомпилируем то же приложение в нативный код с помощью Axiom NIK и соберём два контейнера: со слоем glibc под Debian 9 и с поддержкой musl под Alpine 3.11. Можете сравнить результаты в таблице ниже.
Ещё одно преимущество Axiom NIK — бесшовная реализация многоязычных проектов, например микросервисов на различных языках программирования, особенно в комбинации с Alpine Linux. Покажем это через взаимодействие простого клиента на Node.js с сервером на Spring, которое имитирует работу микросервиса.
public class EchoApplication {
public static void main(String[] args) {
SpringApplication.run(EchoApplication.class);
}
@PostMapping("/")
public String echo(@RequestBody String body) {
return body;
}
}
Руководство по установке
Далее следуют инструкции по установке Axiom NIK на различных платформах: Linux (Alpine musl представлен отдельно), macOS и Windows.
Apple macOS
Установка DMG образа в macOS
Откройте Центр загрузок: Axiom NIK в браузере. Нажмите «Скачать .DMG». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
shasum -a 1 bellsoft-axiom-vm-openjdk11-21.1.0-macos-amd64.dmg
Чтобы запустить установщик, дважды кликните на загруженный файл.
Дважды кликните по иконке Install Axiom NIK Wizard.
Нажмите «Continue».
Дополнительно можно сменить путь установки. Для этого нажмите «Change Install Location». Нажмите кнопку «Install», чтобы начать процесс установки.
Подтвердите установку ПО.
Нажмите «Close», чтобы закрыть окно установщика.
Axiom NIK будет установлен по пути /Library/Java/AxiomNativeImageKit/axiom-vm-21.1.0-openjdk11/
. Вы можете использовать переменную среды $NIK_HOME
, чтобы обратиться по пути установленного пакета — /Library/Java/AxiomNativeImageKit/axiom-vm-21.1.0-openjdk11/Contents/Home/
.
Установка ZIP пакета в macOS
Для установки Axiom NIK скачайте архив .zip.
curl -O https://download.axiomjdk.ru/vm/21.1.0/bellsoft-axiom-vm-openjdk11-21.1.0-macos-amd64.zip
По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
shasum -a 1 bellsoft-axiom-vm-openjdk11-21.1.0-macos-amd64.zip
Распакуйте архив.
unzip bellsoft-axiom-vm-openjdk11-21.1.0-macos-amd64.zip
sudo mv bellsoft-axiom-vm-openjdk11-21.1.0 /Library/Java/AxiomNativeImageKit/
Axiom NIK будет распакован в каталог /Library/Java/AxiomNativeImageKit/
. Добавьте подкаталог Contents/Home/bin
в $PATH
или пропишите /Library/Java/AxiomNativeImageKit/bellsoft-axiom-vm-openjdk11-21.1.0/Contents/Home/
как переменную среды $NIK_HOME
, чтобы запускать Axiom NIK следующим образом:
$NIK_HOME/bin/java -jar $your_app
Чтобы запустить утилиту gu
, используйте следующую команду:
$NIK_HOME/bin/gu available
Наконец, установите Native Image с помощью команды:
$NIK_HOME/bin/gu install native-image
Для деинсталляции Axiom NIK удалите этот каталог и соответствующие переменные среды.
Установка языковых плагинов в macOS
Запустите терминал и введите:
$NIK_HOME/bin/gu available
Откроется перечень поддерживаемых языков:
Downloading: Component catalog from download.axiomjdk.ru
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain 21.1.0 LLVM.org toolchain Supported download.axiomjdk.ru
native-image 21.1.0 Native Image Early adopter download.axiomjdk.ru
nodejs 21.1.0 Graal.nodejs Supported download.axiomjdk.ru
python 21.1.0 Graal.Python Experimental download.axiomjdk.ru
R 21.1.0 FastR Experimental download.axiomjdk.ru
ruby 21.1.0 TruffleRuby Experimental download.axiomjdk.ru
wasm 21.1.0 GraalWasm Experimental download.axiomjdk.ru
Выполните команду $NIK_HOME/bin/gu install [language]
для установки конкретного языка. Например: $NIK_HOME/bin/gu install python
.
Это действие можно также выполнить вручную:
curl -O https://download.axiomjdk.ru/vm/21.1.0/python-installable-openjdk11-21.1.0-macos-amd64.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-macos-amd64.jar
Linux
Установка DEB и RPM пакетов
Откройте Центр загрузок: Axiom NIK в браузере. Нажмите «Скачать .RPM» или «Скачать .DEB». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
shasum -a 1 bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.deb
Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.
Установите пакет с помощью соответствующего менеджера пакетов. Например, Apt:
apt install ./bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.deb
Или для RPM-based систем:
yum install ./bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.rpm
Пакет будет установлен в /opt/bellsoft/axiom-vm-21.1.0-openjdk11/
.
Можно сохранить путь как переменную среды ${NIK_HOME}
.
Установка автономного пакета JDK в GNU/Linux
Для установки Axiom NIK скачайте пакет .tar.gz.
wget https://download.axiomjdk.ru/vm/21.1.0/bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.tar.gz
По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
shasum -a 1 bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.tar.gz
Распакуйте его с помощью следующей команды:
export INSTALL_DIR=<your directory>
tar -C $INSTALL_DIR -xzf bellsoft-axiom-vm-openjdk11-21.1.0-linux-amd64.tar.gz
Эта команда распакует Axiom NIK в выбранный каталог. Добавьте $INSTALL_DIR/bellsoft-axiom-vm-openjdk11-21.0.0/bin
в $PATH
или пропишите $INSTALL_DIR/bellsoft-axiom-vm-openjdk11-21.0.0
как переменную среды $NIK_HOME и запустите Axiom NIK следующим образом:
$NIK_HOME/bin/java -jar $your_app
Чтобы запустить утилиту gu
, используйте следующую команду:
$NIK_HOME/bin/gu available
Наконец, установите Native Image с помощью команды:
$NIK_HOME/bin/gu install native-image
Для деинсталляции Axiom NIK удалите этот каталог и соответствующие переменные среды.
Установка языковых плагинов в Linux
Запустите терминал и введите:
$NIK_HOME/bin/gu available
Откроется перечень поддерживаемых языков:
Downloading: Component catalog from download.axiomjdk.ru
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain 21.1.0 LLVM.org toolchain Supported download.axiomjdk.ru
native-image 21.1.0 Native Image Early adopter download.axiomjdk.ru
nodejs 21.1.0 Graal.nodejs Supported download.axiomjdk.ru
python 21.1.0 Graal.Python Experimental download.axiomjdk.ru
R 21.1.0 FastR Experimental download.axiomjdk.ru
ruby 21.1.0 TruffleRuby Experimental download.axiomjdk.ru
wasm 21.1.0 GraalWasm Experimental download.axiomjdk.ru
Выполните команду $NIK_HOME/bin/gu install [language]
для установки конкретного языка. Например: $NIK_HOME/bin/gu install python
.
Это действие можно также выполнить вручную:
wget https://download.axiomjdk.ru/vm/21.1.0/python-installable-openjdk11-21.1.0-linux-amd64.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-linux-amd64.jar
Alpine Linux
Установка автономного пакета JDK в GNU/Linux
Для установки Axiom NIK скачайте пакет .tar.gz.
wget https://download.axiomjdk.ru/vm/21.1.0/bellsoft-axiom-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz
По окончании процесса проведите проверку, сравнив размер файла на вашем диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
shasum -a 1 bellsoft-axiom-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz
Распакуйте его с помощью следующей команды:
export INSTALL_DIR=<your directory>
tar -C $INSTALL_DIR -xzf bellsoft-axiom-vm-openjdk11-21.1.0-linux-x64-musl.tar.gz
Эта команда распакует Axiom NIK в выбранный каталог. Добавьте $INSTALL_DIR/bellsoft-axiom-vm-openjdk11-21.0.0/bin
в $PATH
или пропишите $INSTALL_DIR/bellsoft-axiom-vm-openjdk11-21.0.0
как переменную среды $NIK_HOME
и запустите Axiom NIK следующим образом:
$NIK_HOME/bin/java -jar $your_app
Чтобы запустить утилиту gu
, используйте следующую команду:
$NIK_HOME/bin/gu available
Наконец, установите Native Image с помощью команды:
$NIK_HOME/bin/gu install native-image
Для деинсталляции Axiom NIK удалите этот каталог и соответствующие переменные среды.
Установка языковых плагинов в Alpine Linux
Запустите терминал и введите:
$NIK_HOME/bin/gu available
Откроется перечень поддерживаемых языков:
Downloading: Component catalog from download.axiomjdk.ru
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
llvm-toolchain 21.1.0 LLVM.org toolchain Supported download.axiomjdk.ru
native-image 21.1.0 Native Image Early adopter download.axiomjdk.ru
nodejs 21.1.0 Graal.nodejs Supported download.axiomjdk.ru
python 21.1.0 Graal.Python Experimental download.axiomjdk.ru
R 21.1.0 FastR Experimental download.axiomjdk.ru
ruby 21.1.0 TruffleRuby Experimental download.axiomjdk.ru
wasm 21.1.0 GraalWasm Experimental download.axiomjdk.ru
Выполните команду $NIK_HOME/bin/gu install [language]
для установки конкретного языка. Например: $NIK_HOME/bin/gu install python
.
Это действие можно также выполнить вручную:
wget https://download.axiomjdk.ru/vm/21.1.0/python-installable-openjdk11-21.1.0-linux-x64-musl.jar
$NIK_HOME/bin/gu -L install python-installable-openjdk11-21.1.0-linux-x64-musl.jar
Microsoft Windows
Установка с помощью Microsoft Windows Installer
Откройте Центр загрузок: Axiom NIK в браузере. Нажмите «Скачать .MSI». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в PowerShell:
(Get-FileHash .\bellsoft-axiom-vm-openjdk11-21.1.0-windows-amd64.msi -Algorithm SHA1).Hash
Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.
Чтобы запустить установщик, дважды кликните на загруженный файл.
Нажмите «Next» на главном экране.
Выберите нужные вам опции и нажмите «Next». Нажатие на опцию откроет её описание. Если сомневаетесь, пропустите этот этап и нажмите «Next».
Пакет готов к установке, нажмите «Install».
* В других версиях операционной среды окно установщика может отличаться.
Чтобы установить Axiom NIK в «тихом» режиме, выполните следующую команду в PowerShell:
msiexec /quiet /i bellsoft-axiom-vm-openjdk11-21.1.0-windows-amd64.msi
Axiom NIK по умолчанию будет установлен в C:\Program Files\Axiom JDK\AxiomNIK-21-OpenJDK-11
. Можно сохранить путь как переменную среды NIK_HOME
.
Установка автономного пакета в Microsoft Windows
Откройте Центр загрузок: Axiom NIK в браузере. Нажмите «Скачать .ZIP». По окончании процесса проведите проверку, сравнив размер файла на своём диске и на странице загрузки. Более прогрессивный подход — сверка контрольной суммы в командной строке:
(Get-FileHash .\bellsoft-axiom-vm-openjdk11-21.1.0-windows-amd64.zip -Algorithm SHA1).Hash
Контрольная сумма должна совпадать с той, что представлена в Центре загрузок.
Альтернативой работе через GUI является инструмент PowerShell:
(New-Object System.Net.WebClient).DownloadFile("https://download.axiomjdk.ru/vm/21.1.0/bellsoft-axiom-vm-openjdk11-21.1.0-windows-amd64.zip", "axiom.zip")
Expand-Archive axiom.zip -DestinationPath .
Эта команда распакует Axiom NIK в текущий каталог. Добавьте подкаталог bin
в PATH
или сохраните путь как переменную среды NIK_HOME
, чтобы запускать Axiom NIK следующим образом:
"%NIK_HOME%\bin\java.exe" -jar your_app.jar
Установка языковых плагинов в Windows
Запустите PowerShell и введите:
"%NIK_HOME%\bin\gu.cmd" available
Откроется перечень поддерживаемых языков:
Downloading: Component catalog from download.axiomjdk.ru
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
native-image 21.1.0 Native Image Early adopter download.axiomjdk.ru
nodejs 21.1.0 Graal.nodejs Supported download.axiomjdk.ru
wasm 21.1.0 GraalWasm Experimental download.axiomjdk.ru
Выполните команду "%NIK_HOME%\bin\gu.cmd" install [language]
для установки конкретного языка. Например: "%NIK_HOME%\bin\gu.cmd" install nodejs
.
Наконец, установите Native Image с помощью команды:
"%NIK_HOME%\bin\gu.cmd" install native-image
Уже готовы внедрить Native Image в свой проект, но не знаете, с чего начать? С надёжным партнёром процесс перехода на новую технологию пройдёт незаметно. Мы подготовили несколько кейсов и будем рады показать, как наши клиенты применяют Axiom NIK в среде Enterprise — абсолютно бесплатно. Во-первых, вы сэкономите время на подготовку программистов к миграции; во-вторых, сможете почерпнуть идей для своего бизнеса. Заполните форму, которая откроется по кнопке ниже, и в ближайшее время с вами свяжется инженер Axiom JDK.
Заключение
В следующий раз обсудим способы использования приложений в контейнерах, созданных с Axiom NIK. Очевидно, что этот инструмент предлагает серьёзные преимущества для разработки на языках JVM: экономию оперативной памяти, простой обмен данными между сервисами в рамках одного приложения и высокую скорость работы. Мы рады возможности внести свой вклад в проект Graal и объединить эту технологию со своими наработками в области поддержки musl. С нетерпением ждём новых решений от участников сообщества OpenJDK!