Facebook использует GraalVM для ускорения рабочих нагрузок Spark и уменьшения использования памяти и ЦП. Продолжайте читать, чтобы узнать об их истории миграции, результатах повышения производительности и планах на будущее.
Эта запись в блоге написана в сотрудничестве с Чен Ли и Сянъян Го из команды разработчиков Facebook.
Технологии Facebook
Facebook - одна из самых посещаемых платформ в мире с 2,8 миллиардами активных пользователей в месяц. Чтобы обеспечить надежность и высокую производительность при такой нагрузке, команда инженеров использует широкий спектр технологий, включая Java, JavaScript, Flow Hack, PHP, Python, C ++ и другие.
Java используется в Facebook в нескольких ключевых областях, таких как большие данные (Spark, Presto и т. Д.), Серверные службы и мобильная связь. Перед переходом на GraalVM команда использовала Oracle JDK и OpenJDK для Java 8 и Java 11.
В таком масштабе любые улучшения производительности приносят значительную пользу - они улучшают взаимодействие с пользователем и сокращают затраты на инфраструктуру. Вот почему команда инженеров всегда ищет способы улучшить производительность своих приложений и решила оценить GraalVM, чтобы определить, была ли это более быстрой средой выполнения Java.
Почему GraalVM
- Поскольку производительность была основным фактором, команда Facebook решила оценить GraalVM как среду выполнения Java и посмотреть, улучшит ли это производительность их приложений Java. GraalVM предлагает расширенные оптимизации, такие как частичный анализ выхода и эвристика встраивания. Благодаря этому многие приложения Java / JVM сразу же увидят прирост производительности, просто переключившись на GraalVM. Как отметила команда Facebook, GraalVM показывает значительные улучшения по сравнению с C2 по сравнению с C2 в таких тестах, как SpecJVM2008 и DaCapo.
- Кроме того, компилятор GraalVM написан с нуля с использованием Java в модульном и расширяемом виде. Это позволяет упростить обслуживание, а также внести дополнительные улучшения. Это было важно для Facebook, поскольку команда рассматривает GraalVM как долгосрочное вложение.
- "Сообщество". У проекта GraalVM есть активное сообщество с открытым исходным кодом, в котором многие организации и отдельные лица вносят свой вклад в проект и формируют его дорожную карту. Также легко найти помощь и поддержку в сообществе.
Запуск Java и Spark на GraalVM
Команда Facebook использовала GraalVM Community в качестве замены OpenJDK. В этом сценарии миграция на GraalVM очень проста - это просто вопрос переключения времени выполнения без каких-либо изменений в коде приложения. Такой переход ускоряет работу приложений благодаря расширенной оптимизации производительности GraalVM без какой-либо ручной настройки.
Apache Spark - это единый аналитический движок для обработки больших данных со встроенными модулями для потоковой передачи, SQL, машинного обучения и обработки графиков. Он довольно быстро обрабатывает данные из коробки, но многие команды ищут способы еще больше оптимизировать его производительность. Один из самых простых способов сделать это - запустить рабочие нагрузки Spark на GraalVM. Благодаря набору конкретных оптимизаций компилятора, о которых мы поговорим чуть позже, GraalVM может значительно ускорить рабочие нагрузки Spark. Тесты Apache Spark из Renaissance Benchmark Suite показывают среднее ускорение в 1,1 раза для Community и в 1,42 раза для Enterprise, при этом некоторые тесты работают до 4,84 раза быстрее.
Для Facebook Spark - крупнейший механизм запросов SQL в их хранилище данных, работающий на агрегированных вычислительных кластерах хранения. Из-за огромного объема данных эффективность и снижение затрат являются важными приоритетами.
Они начали свою оценку в начале 2020 года. Поскольку первоначальные тесты показали хорошие результаты, команда развернула GraalVM в производственной среде и продолжила мониторинг производительности и надежности.
Что касается производительности, они отметили примерно 10% -ное сокращение использования ЦП, и это сокращение ЦП было постоянным с момента развертывания.
Как GraalVM ускоряет рабочие нагрузки Spark
Вот некоторые из оптимизаций, которые больше всего способствовали повышению производительности Spark:
- Полиморфное встраивание. Традиционное встраивание работает только в том случае, если компилятор может выбрать точный метод, на который нацелен вызов метода. GraalVM позволяет встраивать за пределами этой точки, собирая дополнительную информацию о профилировании, что позволяет также встраивать абстрактные методы.
- Частичный анализ побега. Идея анализа частичного выхода состоит в том, чтобы удалить ненужные выделения объектов, выполнив скалярную замену в ветвях, где объект не ускользнул, и убедиться, что объект существует в куче в ветвях, из которых он должен уйти. Это уменьшает как объем памяти, занимаемый приложением, так и нагрузку на ЦП, которую несет сборщик мусора. Такая оптимизация еще более важна в приложениях с большим объемом данных, таких как Spark. В частности, по наблюдениям Facebook , GraalVM снизил потребление ЦП в 5 раз такими методами, как
java/lang/Double.valueOf.
- Расширенная спекулятивная оптимизация в GraalVM обеспечивает более быстрый машинный код за счет использования преимуществ динамической обратной связи во время выполнения. Предполагая, что определенные части программы не будут запускаться во время выполнения программы, компилятор GraalVM может специализировать код и сделать его более эффективным. Для Spark эта оптимизация особенно хорошо работает за счет устранения ветвей (таких как длинные
if-then-else
цепочки), упрощения потока управления, уменьшения количества динамических проверок в телах циклов и установления ограничений наложения имен, что позволяет проводить дальнейшую оптимизацию.
В результате своей оценки команда Facebook перенесла большую часть своих ресурсоемких сервисов больших данных на GraalVM. Они также отметили ›улучшение паузы ЦП и сборщика мусора на 5% для Presto после перехода на GraalVM. Затем команда планирует продвинуть GraalVM на другие сервисы с привязкой к памяти, чтобы извлечь выгоду из оптимизации анализа побега. Команда также планирует внести свой вклад в проект и сообщество.
Они также изучают возможности использования других функций GraalVM, таких как Native Image и Truffle Framework.
Заключение
GraalVM может значительно ускорить многие рабочие нагрузки Java и Scala благодаря продвинутой оптимизации компилятора. В частности, рабочие нагрузки Spark могут ожидать ускорения примерно на 10-42% просто за счет перехода на GraalVM в качестве дистрибутива JDK.
Что интересно, подобным путешествием и похожими наблюдениями поделились инженеры из другой популярной социальной сети, Twitter. После переноса рабочих нагрузок Scala на GraalVM они наблюдали значительное улучшение производительности, например сокращение задержки P99 на 19,9% благодаря компилятору GraalVM. Для таких платформ, как Twitter или Facebook, такие улучшения производительности еще больше умножаются на масштаб платформы.
Чтобы начать работу с GraalVM для ваших приложений, перейдите на graalvm.org/docs/getting-started/.