Представленный материал является образцом учебного исследования, примером структуры и содержания учебного исследования по заявленной теме. Размещён исключительно в информационных и ознакомительных целях.
Workspay.ru оказывает информационные услуги по сбору, обработке и структурированию материалов в соответствии с требованиями заказчика.
Размещение материала не означает публикацию произведения впервые и не предполагает передачу исключительных авторских прав третьим лицам.
Материал не предназначен для дословной сдачи в образовательные организации и требует самостоятельной переработки с соблюдением законодательства Российской Федерации об авторском праве и принципов академической добросовестности.
Авторские права на исходные материалы принадлежат их законным правообладателям. В случае возникновения вопросов, связанных с размещённым материалом, просим направить обращение через форму обратной связи.
ℹ️Настоящий учебно-методический информационный материал размещён в ознакомительных и исследовательских целях и представляет собой пример учебного исследования. Не является готовым научным трудом и требует самостоятельной переработки.
Введение 4
1. Постановка задачи 6
2. Обзор 7
2.1. Проект CRaC 7
2.2. Виртуальная машина HotSpot и её runtime-состояние . . 10
2.3. Форматы хранения состояния HotSpot 15
3. Описание подхода 19
3.1. Создание образа 19
3.2. Восстановление из образа 20
4. Описание реализации 23
4.1. Обработка классов 23
4.2. Обработка объектов 25
4.3. Обработка потоков исполнения 26
4.4. Адаптация Java-кода OpenJDK 27
5. Апробация 29
5.1. Цель 29
5.2. Условия проведения 29
5.3. Результаты 31
Заключение 32
Список литературы 33
📖 Введение
В наши дни платформа Java очень популярна при разработке распределённых информационных систем. В данной области широкое применение нашли такие Java-технологии, как Spring [37], Quarkus [36] и
Micronaut [29] — для создания микросервисов и веб-приложений, Apache
Tomcat [5], Eclipse Jetty [13] и WildFly [39] — в качестве веб-серверов,
Apache Kafka [4] — как брокер сообщений, и многие другие.
Для распределённых систем особенно важны быстрота запуска приложения и скорость его работы в короткие промежутки времени: вопервых, из-за широкого применения горизонтального масштабирования, когда расширение пропускной способности системы достигается
за счёт запуска новых экземпляров входящих в её состав приложений,
во-вторых, из-за популярности платформ бессерверных вычислений (к
примеру, AWS Lambda [1]), где приложение запускается в ответ на
поступающие запросы, а оплата осуществляется за время его активной работы. Однако указанные характеристики не являются сильной
стороной Java-платформы. Как показано в [11, 19], для начала исполнения кода программы и достижения пиковой производительности JVM
требуется заметное время, уходящее на загрузку кода [27, глава 5], а
также его проверку и JIT-компиляцию [18, 15]. Кроме того, популярные
на платформе сетевые фреймворки могут тратить ощутимое время на
инициализацию [40], тем самым также отдаляя запуск основной части
программы.
Одним из возможных решений данной проблемы является проект
CRaC (Coordinated Restore at Checkpoint, [31]), входящий в OpenJDK [30]
и направленный на разработку механизма сохранения состояния JVM
(checkpoint) и последующего его восстановления (restore) в том числе
на другой машине. После восстановления JVM продолжает исполнение программы с места остановки, используя уже загруженный и JITскомпилированный код, что позволяет запускать программы на JVM
заметно быстрее и сразу достигать пиковой производительности [10].
Однако на данный момент проект CRaC в полной мере реализован
4лишь для семейства операционных систем Linux и сохраняет состояние
используемой в OpenJDK виртуальной машины HotSpot [32] в виде
образа Linux-процесса. Создать такой образ и восстановить состояние из
него возможно лишь на машинах с достаточно близкой конфигурацией:
требуется совпадение архитектуры, версий операционной системы и
системных библиотек, а также настроек системы — всё это усложняет
развёртывание, так как для каждой целевой конфигурации потребуется
создать отдельный образ, а такие частые изменения, как обновление
системных библиотек, с большой вероятностью будут приводить к необходимости его пересоздания. Помимо этого, для применения такого образа
требуется наличие особых прав, широкое предоставление которых несёт
риски с точки зрения безопасности.
Чтобы решить проблему зависимости образа виртуальной машины
HotSpot, создаваемого текущей реализацией проекта CRaC, от низкоуровневых деталей, предлагается разработать механизм сохранения
и восстановления состояния HotSpot в терминах платформонезависимой спецификации Java. При таком подходе создаваемый образ будет
переносим между различными операционными системами и архитектурами процессора: платформозависимые фрагменты состояния HotSpot,
в частности, генерируемый при JIT-компиляции машинный код, в него
не войдут. Данная работа посвящена проработке фундаментальных
аспектов указанного подхода и созданию его первичной реализации —
вопросы производительности и оптимальности находятся вне её рамок.
✅ Заключение
В ходе данной работы были получены следующие результаты.
1. Выполнен обзор предметной области: проекта CRaC и виртуальной
машины HotSpot. Выделены основные части, формирующие состояние HotSpot во время её работы — это информация о классах,
объектах и потоках исполнения приложения, работающего под
управлением HotSpot.
2. Механизм сохранения и восстановления состояния HotSpot спроектирован в виде компонента виртуальной машины с применением
уже доступных в её кодовой базе средств записи на диск состояний
объектов и воссоздания фрагментов стека вызовов.
3. Создана реализация механизма для двух основных поддерживаемых OpenJDK архитектур: x86-64 и AArch64 — предложенный
подход обобщается и на остальные архитектуры.
4. Проведена апробация реализованного механизма для приложения
на основе веб-сервера Eclipse Jetty: состояние приложения было
успешно перенесено с платформы Ubuntu/AArch64 на платформу
Alpine Linux/x86-64.