Pull to refresh

На передовой дизайна виртуальных машин

Reading time 4 min
Views 4.3K
Original author: Tony Arciani
Пока готовится первая статья в обучающей серии об языке Эрланг, решил сделать перевод одного интересного блог-поста. Пост об развитии виртуальной машины Эрланг и целях, которые пытаются достичь его авторы.



Виртуальная машина Java считается сегодня эталоном, напичкана всевозможными оптимизациями и трюками так, что голову сломать можно. Из-за этого многие языки программирования используют ее в качестве исполняемой среды, вместо написания собственной виртуальной машины(хотя некто все же считает это интересным занятием). Я же считаю, что путь избранный JVM со временем станет непопулярным, так как программисты уже в совсем близком будущем столкнутся с проблемой утилизации мощности систем с десятками или сотнями процессоров.

Архитекторы виртуальных машин столкнутся с той же проблемой, что и создатели процессоров сегодня — не делай одну вещь быстро, делай несколько вещей одновременно. Поэтому я не верю, что эталоном виртуальной машины есть путь выбранный JVM. Джава не создана для вот такого будущего:

Изображение подглядываем из блога Тоби Арчиани, который украл его у Ульфа Вигера, который взял у Джо Армстронга, который одолжил у Эрика Шагерштерна.
На графике — часть процессора, до которой можно добраться за один такт.

На первый взгляд тяжело оценить преимущества использования виртуальной машины Эрланг. Сборщик мусора работает в мягком реальном времени, в то время как сборщик мусора JVM работает в жестком реальном времени. Компиляция «на лету» достаточно медленная для методов с вычислительной математики и не может «инлайнить»(подскажите правильное слово?) между модулями так как это делает HotSpot. Для неопытных администраторов Эрланг вообще — ужас. Без видимых на то причин начинает поедать процессорное время и память и единственный способ узнать что происходит это влезть в шелл и набирать комманды на какомто эзотерическом языке!

Но все эти проблемы очень мелкие если взглянуть на планы и цели виртуальной машины Эрланг. В начале книги «Програмирование в Эрланг», один из создателей языка, Джо Армстронг, рассказывает об мечте конкурентной модели программирования: ваша программа работает в N раз быстрее на N процессорах. Эрланг в некоторой мере достигнул этой цели используя распределенную модель программирования. Но распределенное программирование сложно: настанет момент когда вы должны будете учитывать стоимость пересылки сообщений в сети, бороться с латентностью, отсутствием сети, падением серверов. И хотя Erlang/OTP предоставляет мощную платформу для разработки распределенных сервисов, многие факторы распределенности оказываются несущественными, когда речь идет об одном сервере с большим количеством ядер в процессоре.

ВМ Эрланга поддерживает SMP планировщик, запущенный в обычном потоке для каждого ядра процессора. Это дает возможность ВМ распределить процессы на несколько процессоров одновременно избегая негативные стороны распределенного программирования. Простое правило Эрланга: создавайте столько процессов сколько хотите — планировщик загрузит ими процессор равномерно.

И хотя всё это красиво и интересно у SMP планировщика есть много узких мест. Все работает прекрасно с двумя или четырьмя ядрами но как только вы начнете увеличивать это число то производительность не только не улучшится но и может упасть. Та же ситуация и в JVM но исходя из того, что такое поведение есть результатом фундаментальных принципов и дизайна этой виртуальной машины, модель конкурентности Эрланга дает создателям значительно больше вариантов оптимизации.

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

Итак, вот тв чем дело: (извини за то что вырезал рисунки из презентации Ульф! Они рулят!)

На этом рисунке было большое лого Эрриксона. Если кто нибудь пожалуется — я сделаю свою версию.


Так выглядит планировщик виртуальной машины Эрланг. Есть много планировщиков, каждый из которых работает в отдельном потоке, и выполняет код из общего потока комманд. Видите слабое место? Посмотрите на эту кучу стрелочек указывающих на одно место! Как же решить такую проблему? Разделять и властвовать:



Выделяя каждому планировщику собственную очередь выполнения, мы избавимся от одного слабого места, но должны будем корректно распределять процессы между планировщиками. Это уже начинает выглядеть как ядро операционной системы, правда? Ну что ж посмотрим, как оно отразится на масштабируемости системы:



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

Опять куча стрелок указывающих в одно место! :(

Выделение памяти в Эрланге — еще одна точка блокировки и соответственно слабое звено в масштабируемости системы. Я предполагаю, что Ульф вставил это в свою презентацию потому, что это — очередная задача, которую будут решать создатели Эрланга при разработке нового SMP планировщика.

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

Системы вроде JVM конечно не исчезнут с приходом многоядерного будущего. Подход вроде программной транзакционной памяти может быть успешно использован в JVM особенно с языком вроде Clojure для достижения результатов, в определенных проблемах распаралеливания, лучших, чем модель «ничего общего между процессами» в Эрланге.

Но в общем, я нахожу подход к конкурентности Эрланга более понятным и делающим жизнь программистов легче, пряча всю сложность распределенности на низший уровень виртуальной машины. Этот подход может быть более логичным чем ПТП, особенно если он обретет «человеческое лицо», чего я пытаюсь достичь своим проектом языка программирования на базе виртуальной машины Эрланга — Reia. Но главное — наличие огромного потенциала улучшений производительности виртуальной машины для многоядерных систем, и я надеюсь, что однажды мы таки увидим мечту Джо Армстронга в действии — исполнять программы в N раз быстрее на N процессорах.

P.S. Русский не есть моим нативным языком, поэтому любые исправления или предложения по улучшению читабельности приветствуются. Спасибо за то что дочитали до конца ;)
Tags:
Hubs:
+36
Comments 51
Comments Comments 51

Articles