«Java-мир больше никогда не будет прежним» — интервью с Александром Белокрыловым и Алексеем Войтыловым из BellSoft

Остаются последние дни перед Joker, и очень хотелось принести на Хабр не обычное интервью, а какой-нибудь мощной дичи. В последнее время люди интересуются серверами на Arm, и так получилось, что у нас есть по этой теме реальные специалисты.

Александр (alexbel) Белокрылов и Леша Войтылов, совместно с Григорием Лабзовским, который руководил центром разработки Oracle в Санкт-Петербурге, чуть более года назад основали компанию BellSoft. Сейчас компания успешно работает, развивается и уже успела получить известность в Java-мире.

По объему коммитов в OpenJDK за прошлый год они вышли на пятое место, и теперь впереди только Oracle, Red Hat, SAP и Google:

5183a5ede2485987619a2ddbc7c3518c.png

Надо понимать, что BellSoft — это не только Arm:

  • Вышла Liberica JDK 11, поддерживаются Linux x86_64, Windows, Linux ARMv8, Linux ARMv7 (включая Raspberry Pi). Будут выкладываться сборки для Mac и Solaris Sparc.
  • Публикуются образы под все архитектуры на Docker Hub для Debian, CentOS, Alpine. Образ для Alpine делается из lite версии с --compress 2 поэтому существенно меньше обычного JDK.


В этом интервью мы коснемся только Arm, а всё остальное оставим на следующий раз.


Итак, сегодня у нас в виртуальной студии:

kqqgrdorbzjpqilxnjrrgaygjww.jpegАлександр Белокрылов

ort67csfa4vvd0630ghdxxs4foa.jpegЛеша Войтылов

8ekykzda9qgrzcubfisv7pi2mdm.pngОлег Чирухин — редакция JUG.ru Group

8ekykzda9qgrzcubfisv7pi2mdm.pngРасскажите о компании подробнее?

kqqgrdorbzjpqilxnjrrgaygjww.jpegКомпания BellSoft занимается несколькими направлениями. Все, наверное знают, что компания Oracle в Санкт-Петербурге обладала очень серьезной низкоуровневой экспертизой в разработке Java Runtime, в разработке компиляторов, в разработке систем Cloud-сервисов Oracle. И эта экспертиза из Oracle перекочевала в компанию BellSoft. Сегодня наша компания занимается разработкой Java Runtime, мы активный OpenJDK contributor, занимаемся разработкой компиляторов gcc и llvm, контрибьютим в стек Apache, Graal. Занимаемся построением систем анализа больших данных, рекомендательных систем и построили небольшой проект по IoT, по сбору данных с устройств из реального мира. В какой-то момент мы увидели, что Oracle перестал выпускать дистрибутив Java для Arm-платформ, и мы выпустили свой дистрибутив, который назвали Liberica JDK для Raspberry Pi. С тех пор успешно его поддерживаем.


8ekykzda9qgrzcubfisv7pi2mdm.pngДавай разберем подробней. Что такое, например, стек Apache?

ort67csfa4vvd0630ghdxxs4foa.jpeg Мы начали контрибьютить в Apache Foundation с Hadoop — на определенные части этого проекта многое завязано. OpenJDK и большие Apache проекты, пусть и не напрямую, но сильно взаимосвязаны.

8ekykzda9qgrzcubfisv7pi2mdm.pngЗачем всё это может быть нужно? Например, какие-то классы, которые тормозят их, их можно разогнать?

kqqgrdorbzjpqilxnjrrgaygjww.jpegДа, это одно из направлений, которыми мы занимаемся — улучшение производительности. Например, платформенно-специфичные части, ускорение которых в OpenJDK может помочь ускорить Hadoop. Если интересно, можем поговорить об этом.

ort67csfa4vvd0630ghdxxs4foa.jpegКогда ты решаешь проблемы с перформансом, имеет смысл посмотреть что-то близкое. Может быть, где-то есть такая же проблема. Очень часто видишь, что поправив в одном месте, нужно поправить еще в паре мест, чтобы в общем стало лучше. Иногда (и очень часто) оптимизации производительности раскладывается на contributions в несколько проектов. Если хочется улучшить, например, производительность checksum, вы посмотрите в самый низ стека. Допустим, это Java. Если посмотреть чуть выше, это будет Hadoop, Spark или что-то еще. Обычно поняв, как улучшить одно место, можно понять, как сделать и в другом месте. Разумеется, имеет смысл в таком случае пойти и улучшить там тоже.


8ekykzda9qgrzcubfisv7pi2mdm.pngВсе знают, что вы — Liberica:-) Давайте поговорим вот об этом.

kqqgrdorbzjpqilxnjrrgaygjww.jpegДа, мы — Liberica JDK. Liberica начиналась с того, что мы увидели, что нет порта для ARM32, и его срочно нужно сделать, потому что Raspberry Pi осталась без Java 9 и Java 10. Это было в 2017 году, когда вышла Java 9. Теперь Liberica JDK поддерживает много архитектур и операционных систем.

ort67csfa4vvd0630ghdxxs4foa.jpegСтало понятно, что Oracle не собирается дальше развивать код для Arm, и мы стали активно контрибьютить и выпускать свой дистрибутив, чтобы закрыть эту брешь. Стало понятно, что людям это нужно.

8ekykzda9qgrzcubfisv7pi2mdm.pngПолучается, сейчас есть несколько дистрибутивов Arm?

ort67csfa4vvd0630ghdxxs4foa.jpegДа, есть несколько дистрибутивов Java для Arm, они отличаются. В нашем вы получаете фактически то, что раньше было частью дистрибутива порта Oracle. В нашем дистрибутиве присутствует JavaFX, device input/output и API для эмбеддеда. Это некий пакет, и все это работает с модулями, начиная с JDK 9. Используя модульную систему, вы можете собрать Runtime, как вы хотите. Если хотите, можете сделать маленький Runtime размером 16 мегабайт. Если хотите включить больше фич, например, web-сервер, тогда нужно потратить примерно 32 мегабайта статического места. Можете получить работающий Runtime под ваши нужды.


8ekykzda9qgrzcubfisv7pi2mdm.pngНасколько понял, речь пошла об армовых серверах. Не сказать, чтобы ими у нас пользовались массово. Расскажи про сервера? В реальной жизни они есть вообще?

ort67csfa4vvd0630ghdxxs4foa.jpegЭтой истории уже много лет. Самый первый Arm-сервер был сделан на основе архитектуры ARMv7, 32-битной. Это была жутко шумящая коробка, которая практически не работала, потому что там не работал BIOS, Linux, все что угодно через несколько часов отпадало. Та компания, которая это начинала, Calxeda, со временем закрылась. Но идея развития альтернативной архитектуры для серверов была посеяна в общество. Arm со временем выпустил новую спецификацию архитектуры ARMv8, которая поддерживает как 32, так и 64 бит. На основе 64-битной версии этой спецификации сейчас несколько производителей строят свои реализации процессоров для серверов. Например, Ampere Computing, Cavium, который нынче куплен компанией Marvell, и еще Qualcomm. И есть еще одна компания — AMD несколько лет назад выпускал тоже сервера на основе Arm-архитектуры. По-моему, до сих пор продолжают это делать.


8ekykzda9qgrzcubfisv7pi2mdm.pngЕсли убрать из Marvell одну букву L, получатся супергерои. Хороший способ запомнить названия всех этих контор.

ort67csfa4vvd0630ghdxxs4foa.jpegСупергерои там на самом деле Cavium/Marvell, потому что из всех именно им удалось собрать наиболее производительный чип вплоть до 128 тредов на одном CPU, и сравнимый или лучший по производительности с Xeon Gold и Platinum. Можно ставить несколько CPU в один сервер, у вас получается монструозная штука с быстрой памятью, которую можно применять для серьезных задач.


8ekykzda9qgrzcubfisv7pi2mdm.pngКак растет предел масштабирования для обычного применения? Сколько CPU имеет смысл втыкать в один сервер?

ort67csfa4vvd0630ghdxxs4foa.jpegВсе зависит от того, для какой задачи вы хотите построить сервер. Разные производители ориентируются на разные ниши, но если мы говорим про Cavium/Marvell, они четко ориентируются на нишу компьютинга, где нужно достаточно быстро прожевать большой объем данных в параллель. Они не ориентируются на супер большую производительность одной нитки (вместе с тем, она очень неплоха), а именно, чтобы в целом данный CPU показывал большую производительность при низком потреблении стоимости.


8ekykzda9qgrzcubfisv7pi2mdm.pngА почему Arm, а не Intel? Есть у нас замечательные интеловские сервера, зачем придумывать что-то еще?

ort67csfa4vvd0630ghdxxs4foa.jpegНа этот вопрос и сложно, и просто ответить. Во-первых, свято место пусто не бывает. Мы видим, что и AMD пытается построить какую-то альтернативу Intel для серверных применений. И понятное дело, всегда будет какой-то альтернативный кусок рынка у альтернативных производителей.

kqqgrdorbzjpqilxnjrrgaygjww.jpegНикто не хочет жить с одним монополистом.

ort67csfa4vvd0630ghdxxs4foa.jpegОчень верное замечание. Все потребители процессоров, а это в в основном, Cloud-провайдеры, хотят иметь возможность альтернативы. Чтобы можно было выбирать, сравнивать стоимость с затратами и под конкретные применения выбирать более выгодную архитектуру.

8ekykzda9qgrzcubfisv7pi2mdm.pngА что по затратам? Насколько это дороже, чем решения от Intel?

kqqgrdorbzjpqilxnjrrgaygjww.jpegСложный вопрос. Во-первых, как Алексей сказал, производителей — достаточно. Понятно, что сейчас производители Arm-процессоров не конкурируют друг с другом, а конкурируют с кем-то другим. Занимают немного разные ниши. Если Cavium — это high performance computing, то Qualcomm — mid-range servers, Ampere — это либо workstations, либо low-end servers.

ort67csfa4vvd0630ghdxxs4foa.jpegЕсли правильно помню, цена самого CPU от Ampere Computing — 600–900 долларов, и они конкурируют с Intel, CPU стоимостью около 1500 долларов. Cavium чуть дороже. Опять же, они будут конкурировать с Intel, который существенно дороже. Нужно понимать, что цена сервера складывается не только из цены CPU. Цена сервера — это еще память, диски, поддержка, потребление. Если вы выигрываете по одному параметру, например, стоимости CPU — это прекрасно, но вы будете лишь чуть-чуть дешевле. Если выигрываете по двум параметрам, например, будучи дешевле, предлагать еще и лучшую производительность, на вас будут смотреть уже более пристально. А если по трем, например, еще и делать все это при меньшем потреблении электроэнергии, то это уже заявка на победу.


8ekykzda9qgrzcubfisv7pi2mdm.pngКроме железа и его поддержки еще важна поддержка в софте. Нельзя на Arm запустить всё что у тебя сейчас крутится на Intel.

ort67csfa4vvd0630ghdxxs4foa.jpegРазумеется. Нужно сказать, что Arm-экосистема софта шагнула далеко вперед. Если пять лет назад были проблемы с тем, чтобы поднять железку, то сейчас таких проблем нет. Вы просто приходите, и у вас всё работает out of the box. Работает всё, к чему вы привыкли — Linux, Docker, Kubernetes, Xen, Java, Hadoop, Spark, Kafka, все что угодно.


8ekykzda9qgrzcubfisv7pi2mdm.pngЧто насчет Java? Расскажите, как она работает, чем отличается от «обычной»?

ort67csfa4vvd0630ghdxxs4foa.jpegНичем не отличается, в этом и есть ее основное преимущество. Она достаточно производительная для того, чтобы справляться с теми задачами, которые возложены на Java для серверов. Вы переносите свое приложение (надеюсь, что у него нет нативной части, иначе придется его рекомпилировать), на Arm-сервер, проверяете производительность и в большинстве случаев — радуетесь. Недавно вышла статья, где мы сравниваем производительность Arm-сервера с Intel-сервером. Статья вышла в Java Magazine.


8ekykzda9qgrzcubfisv7pi2mdm.pngOracle позволили вам, по сути, прорекламироваться в собственном журнале? Серьезно.

ort67csfa4vvd0630ghdxxs4foa.jpegВидимо, есть спрос. Получается, что Java Arm-сервера для Java-ворклоадов вполне хорошо себя показывают. Они такие же, или даже лучше по сравнению со своими аналогами у Intel.


8ekykzda9qgrzcubfisv7pi2mdm.pngКому стоит прочитать вашу статью?

ort67csfa4vvd0630ghdxxs4foa.jpegТому, кто хочет посмотреть, протестировать новую архитектуру, подходит ли она для его нагрузок. Попробовать и Java, и те самые Arm-сервера. В Google вбиваете Arm Server Cloud, и вам выпадает несколько облачных провайдеров, можно провести карточкой и попробовать то, что вам нужно.


8ekykzda9qgrzcubfisv7pi2mdm.pngТам уже предустановлена Java?

ort67csfa4vvd0630ghdxxs4foa.jpegДа. Обычная OpenJDK.


8ekykzda9qgrzcubfisv7pi2mdm.pngА обычная OpenJDK и ваш дистрибутив Liberica — это одно и то же? Я видел, что там есть ваши коммиты — это оно или что-то другое?

ort67csfa4vvd0630ghdxxs4foa.jpegВообще, история Arm-портов и OpenJDK достаточно интересная и витиеватая. Изначально в Oracle развивали Arm-порт и, когда Arm выпустил архитектуру ARMv8, к этому Arm-порту был добавлен дополнительный порт, который позволял запускать Java на ARMv8. Параллельно с этим Red Hat тоже работал в этом направлении и в OpenJDK влил свой порт для этой архитектуры. Так получилось, что коммьюнити сосредоточилось именно на порте Red Hat. Поэтому сейчас тот довесочек, который был в OpenJDK для порта ARM32, который фактически дублировал функциональность порта aarch64 — мы его волевым решением оттуда уберем в JDK 12. Для этого есть JEP 340.

kqqgrdorbzjpqilxnjrrgaygjww.jpegНадо сказать, что Oracle влил в OpenJDK все свои наработки от embedded, все Arm-порты перед тем, как прекратить поддержку. Сейчас влиты все фичи для Arm, которые делались в Oracle.

ort67csfa4vvd0630ghdxxs4foa.jpegЭто логично, потому что именно производители железа и производители спецификации должны быть в первую очередь заинтересованы, чтобы софтовая экосистема работала на их железе и была совместима с их спецификациями. Для этого нужно, чтобы код был открытым.


8ekykzda9qgrzcubfisv7pi2mdm.pngЯ видел инфографику, на которой нарисованы поразительные цифра о том, что некая компания BellSoft, расположенная в Санкт-Петербурге, залила огромное количество коммитов.

kqqgrdorbzjpqilxnjrrgaygjww.jpegДа, мы входим в топ-5 коммитеров OpenJDK. Естественно Oracle вне конкуренции находится, там около 4 тысяч коммитов за год.

ort67csfa4vvd0630ghdxxs4foa.jpegДальше идет Red Hat, SAP, Google и BellSoft. Мы немножко не дотянулись до Google. А сразу за нами — IBM.


8ekykzda9qgrzcubfisv7pi2mdm.pngКакой процент ваших сотрудников раньше работал в Oracle?

kqqgrdorbzjpqilxnjrrgaygjww.jpeg100 процентов. BellSoft состоит из бывших сотрудников Oracle.


8ekykzda9qgrzcubfisv7pi2mdm.pngЭто нечестная конкуренция, потому что Google не состоит из 100 процентов сотрудников Oracle. Что за комммиты, расскажите? Как достичь такого успеха? Как попасть в топ-5 коммитеров?

kqqgrdorbzjpqilxnjrrgaygjww.jpegМы работаем в нескольких направлениях. Сейчас основное направление, куда идут наши коммиты, — это порт ARM64, который тот самый серверный порт. Он интересен производителям железа. Им интересно, чтобы Java быстро работала на их железе, справлялась с нагрузками. Второе, куда коммитим, — это порт ARM32, который нами поддерживается, это embedded-порт. Третье — это коммиты, направленные на поддержку, исправление и улучшение общего функционала Java.


8ekykzda9qgrzcubfisv7pi2mdm.pngМы говорили только что о 64 битах на серверах. Почему 32-битный порт еще живой?

kqqgrdorbzjpqilxnjrrgaygjww.jpegПотому что он используется в embedded.

ort67csfa4vvd0630ghdxxs4foa.jpegПотому что очень много компаний реализовало CPU для архитекутры ARMv7 для встроенных применений. У них на складах лежит большое количество чипов. Если мне не изменяет память, то из всего многообразия этих чипов ARM32, самый популярный — ARMv5. Этой архитектуре уже очень много лет, но тем не менее, CPU достаточно дешевые, и производители до сих пор рассматривают создание новых устройств именно на этой архитектуре


8ekykzda9qgrzcubfisv7pi2mdm.pngО каких суммах мы говорим, когда говорим о встройке? Может обычный человек себе купить что-нибудь и поэкспериментировать?

kqqgrdorbzjpqilxnjrrgaygjww.jpegСамое популярное из платформы ARM32 — это Raspberry Pi, начиная со второй версии — вторая и третья версии, плюс все это поддерживается ARM32-портом. Один из наших дистрибутивов — тот, который для ARM32, тестируется и работает именно на Raspberry Pi. Мы видим, что это самая распространенная платформа для широкой аудитории, и поэтому выпускаем порт именно для Raspberry Pi. У нас есть более специфические порты для узкоспециализированного железа, но это другая история.

ort67csfa4vvd0630ghdxxs4foa.jpegМожет, и покупать не надо. Можно посмотреть, что у вас стоит в домашнем роутере. Очень вероятно, что там что-нибудь такое.


8ekykzda9qgrzcubfisv7pi2mdm.pngНасколько там должны скиллы разработчика соответствовать?

kqqgrdorbzjpqilxnjrrgaygjww.jpegНужно быть Java-разработчиком.


8ekykzda9qgrzcubfisv7pi2mdm.pngНужны ли хитрые способы, закон Кирхгофа знать, чтобы закодить?

ort67csfa4vvd0630ghdxxs4foa.jpegУ вас просто компьютер, к которому вы можете подключиться по SSH. Никакого умения его прошивать не нужно. Вы берете MicroSD-карточку с образом линукса для Raspberry Pi, вставляете ее, и все запускается. В этом основной плюс Raspberry Pi по сравнению со всеми другими single board computers. Простота его настройки, получение работоспособной системы.


8ekykzda9qgrzcubfisv7pi2mdm.pngА как с датчиками работать? Мы же все это ради внешних систем делаем, так?

ort67csfa4vvd0630ghdxxs4foa.jpegУ Raspberry Pi есть система GPIO и пины, к которым вы можете подключать все что угодно. На чем обычно все энтузиасты всякую периферию к Raspberry Pi и подключают.


8ekykzda9qgrzcubfisv7pi2mdm.pngКак API выглядит? Что нужно написать, типа, «получи мне с термостата чиселку»?

ort67csfa4vvd0630ghdxxs4foa.jpegНужно прочесть даташит термостата, и понять, какие есть регистры, как его инициализировать, как его конфигурировать. Если I2C, вызвать метод для конфигурации, туда передать все параметры. Потом сказать ему i2c.open, и работать с ним как с Java-объектом.


8ekykzda9qgrzcubfisv7pi2mdm.pngА можно вокруг термостатов написать красивые объектные оберточки, чтобы потом работать в чисто объектной модели? Можно сделать так, чтобы не читать больше даташит, закрыть его фасадом?

kqqgrdorbzjpqilxnjrrgaygjww.jpegХорошо бы, чтобы производитель этого датчика сделал готовый конфиг, и мы как Java-программисты просто брали его и пользовались. Библиотека работает с одним датчиком, библиотека для работы с другим датчиком. Такая библиотека или что-то близкое к этому есть, называется Pi4J. Она развивается сейчас не так бурно, как во времена, когда Oracle двигал Java embedded, но она все равно не умерла, периодически выходят какие-то обновления. Здесь есть выбор: либо работать с вещью, которая в OpenJDK — GPIO, либо работать с библиотечкой Pi4J.


8ekykzda9qgrzcubfisv7pi2mdm.pngЕсли я производитель железяки, ничего не знаю о Java, но хотел бы, чтобы Java-программисты могли пользоваться ей, к кому обратиться? К вам обратиться? Или есть специалисты, которые этим занимаются?

kqqgrdorbzjpqilxnjrrgaygjww.jpegДа, мы и есть такие специалисты.


8ekykzda9qgrzcubfisv7pi2mdm.pngПока мы далеко не убежали. Помню, что у вас были какие-то свои JEP, да?

kqqgrdorbzjpqilxnjrrgaygjww.jpegВ 11 версию OpenJDK вошло 17 JEP. 14 было сделано Oracle, 1— Google, 1 — Red Hat, 1 — BellSoft совместно с Cavium. Наш JEP — сборная солянка улучшений производительности Java на платформе ARM64 под конкретные ворклоады. JEP, соответственно, называется Improve Aarch64 Intrinsics. Если кратко, то мы улучшили производительность операций со String, с массивами и немного с математикой и тригонометрией.


8ekykzda9qgrzcubfisv7pi2mdm.pngЧто такое интринсики? Не все знают.

ort67csfa4vvd0630ghdxxs4foa.jpegКогда виртуальная машина считает синус, вместо того, чтобы выполнять непосредственный Java-код, может подставить оптимизированную ассемблерную вставку под конкретную архитектуру.


8ekykzda9qgrzcubfisv7pi2mdm.pngКоторая напрямую зовёт процессор, который имеет команду «синус»?

ort67csfa4vvd0630ghdxxs4foa.jpegКоторая вычислит его по сложному алгоритму. Есть интринсики, которые вызывают какую-то команду ассемблера. Например, интринсики, связанные с вычислением чексумм. Такие ассемблерные инструкции есть практически для всех архитектур. Есть более сложные интринсики, когда для получения хорошего прироста производительности писать много страниц ассемблера.


8ekykzda9qgrzcubfisv7pi2mdm.pngА шифрование, оно есть в железе?

ort67csfa4vvd0630ghdxxs4foa.jpegДа, обычно это вызов существующих инструкций конкретного процессора. Иногда — работа с расширениями на тех чипах, где они есть.


8ekykzda9qgrzcubfisv7pi2mdm.pngВозвращаясь к вашему JEP: как определить, какой код является настолько горячим, что его стоит так хардкодить?

ort67csfa4vvd0630ghdxxs4foa.jpegОтличный вопрос. Когда мы начали оптимизировать что-то под платформы ARM64, большого количества тулов у нас не было, помимо perf. Да и тот работал не везде. Реализация JFR для ARM64-порта отсутствовала, Oracle к тому моменту еще не выложила в Open Source. Различные тулы для измерения перформанса, которыми мы привыкли пользоваться, например, async-profiler, honest-profiler — они для платформ ARM64 тоже не работали. Первое, что мы сделали — завели все эти тулы на этой архитектуре.


8ekykzda9qgrzcubfisv7pi2mdm.pngПочему не работают из коробки?

ort67csfa4vvd0630ghdxxs4foa.jpegПотому что там есть какая-то CPU-специфичная часть.

Дальше запускаешь эти тулы на том ворклоаде, который ты пытаешься оптимизировать, долго смотришь в экран, пытаешься понять, какие методы там горячие, какие места в них горячие. Есть простые случаи, когда какие-то ассемблерные вставки под конкретную архитектуру не реализованы. В этом случае происходит fallback в Java код. Просто реализовав эти ассемблерные вставки можно получить увеличение производительности. Есть более сложные места, когда нужно понять какую новую ассемблерную вставку нужно в Java создать для всех архитектур. Такая работа.


8ekykzda9qgrzcubfisv7pi2mdm.pngСам датасет откуда взять? Выкачать весь гитхаб и запустить под JIT?

ort67csfa4vvd0630ghdxxs4foa.jpegПонятно, что происходит оптимизация каких-то бенчмарков или ворклоадов. Бенчмарки известные — SpecJBB, SpecJVM. Есть конкретные ворклоады, которые интересуют конкретных заказчиков. Просто запускаете эти ворклоады и смотрите на узкие места.


8ekykzda9qgrzcubfisv7pi2mdm.pngВсе эти SpecJVM — очень старые тесты, да? Что насчет новых лямбд, стримов, биг даты?

ort67csfa4vvd0630ghdxxs4foa.jpegНичего. Там этого нет.


8ekykzda9qgrzcubfisv7pi2mdm.pngИ где это достать?

ort67csfa4vvd0630ghdxxs4foa.jpegНовые ворклоады.


8ekykzda9qgrzcubfisv7pi2mdm.pngНапример, апачевский стек?

ort67csfa4vvd0630ghdxxs4foa.jpegДа. У Hadoop есть стандартный бенчмарк TeraSort, которым производители железок любят мериться. Тоже одна из интересных задач для оптимизации.


8ekykzda9qgrzcubfisv7pi2mdm.pngКакой сейчас топ функций, которые стоит оптимизировать? Например, топ из того самого JEP.

ort67csfa4vvd0630ghdxxs4foa.jpegОсновные проблемные места для этой архитектуры, которые там были, мы закрыли. Там, разумеется, есть еще непаханое поле того, что мы не сделали и что будем продолжать делать. Будем продолжать работать с тригонометрией, будем смотреть на новые интринсики, которые будут появляться. Их еще нет, но мы понимаем, что они в скором времени появятся. Придется смотреть в проект Panama, в который сейчас очень активно контрибьюит Intel.


8ekykzda9qgrzcubfisv7pi2mdm.pngКак компилятор увидит, что ты делаешь? Условно, магическим образом поймет, что ты считаешь какую-то известную формулу и заоптимизирует?

ort67csfa4vvd0630ghdxxs4foa.jpegЕсли вы вызываете Math.sin, то вместо Java-реализации этого sin вполне возможно подставить ассемблерную вставку.


8ekykzda9qgrzcubfisv7pi2mdm.pngТам где-то стоит регулярка, которая ищет все sin и заменяет на это?

ort67csfa4vvd0630ghdxxs4foa.jpegДа. Это обычно делается даже не в компиляторе, а начиная с интерпретатора.


8ekykzda9qgrzcubfisv7pi2mdm.pngЧто-то более сложное может ловить, например, операции в счетных циклах?

ort67csfa4vvd0630ghdxxs4foa.jpegОбычно такие задачи решаются в рамках C2, и писать и поддерживать специализированные интрински не имеет смысла.


8ekykzda9qgrzcubfisv7pi2mdm.pngДля этого нужно иметь какого-то специалиста. Например, Иванова или Чуйко?

ort67csfa4vvd0630ghdxxs4foa.jpegЧуйко работает у нас.

kqqgrdorbzjpqilxnjrrgaygjww.jpegОн сейчас уехал в Канаду, будет рассказывать на конференции Linaro Connect о наших достижениях в улучшении OpenJDK на архитектуре ARM64. Linaro Foundation занимается разработкой экосистемы для Arm-платформ.


8ekykzda9qgrzcubfisv7pi2mdm.pngОткуда у них деньги на это?

kqqgrdorbzjpqilxnjrrgaygjww.jpegОт Arm, в первую очередь. И от производителей железа.


8ekykzda9qgrzcubfisv7pi2mdm.pngКакие самые сложные или интересные челленджи у вас были?

ort67csfa4vvd0630ghdxxs4foa.jpegСложно так сказать. Пришлось прокачать свои познания в математике немножко. Приходите на Joker, расскажем.


8ekykzda9qgrzcubfisv7pi2mdm.pngПрограммистам нужна математика!

ort67csfa4vvd0630ghdxxs4foa.jpegДа, внезапно. Не просто так разобраться с арифметикой floating point. Пришлось прокачать способность понимать, какие тут инструкции, какие у них веса, сколько они времени занимают. Эти ассемблерные вставки — очень сложный и трудоемкий процесс, их потом их сложно поддерживать. Представьт, что у вас меняется спецификация, у вас появляется новые более оптимальные инструкции — вам приходится их переписывать. Но оказывается, что с точки зрения получения мгновенной выгоды это достаточно выгодно.


8ekykzda9qgrzcubfisv7pi2mdm.pngТы про веса сказал. Правильно понимаю, что есть набор оптимизаций, которые запускаются в порядке увеличения веса?

ort67csfa4vvd0630ghdxxs4foa.jpegДа. Поскольку Arm предоставляет спецификацию… Они делают свои Кортексы, но основной бизнес — это предоставление лицензий на спецификацию. Дальше различные производители делаю, кто во что горазд. У кого-то инструкция будет сколько-то времени занимать, а другого производителя — другое время. Вся эта сложность, с который приходится сталкиваться, когда ты пишешь этот ассемблерный код. Вам нужно очень аккуратно понимать, что для одного типа процессоров будет оптимальна одна последовательность, для другого типа будет оптимальна другая. Разумеется, обычному Java-программисту беспокоиться нечего, за него уже про это побеспокоились.


8ekykzda9qgrzcubfisv7pi2mdm.pngДопустим, у какого-то корпоративного инженера оптимизации работают немного не так, как хочется. Что ему нужно сделать?

ort67csfa4vvd0630ghdxxs4foa.jpegКонтрибьютить в OpenJDK или идти в компанию BellSoft.


8ekykzda9qgrzcubfisv7pi2mdm.pngРасскажите, что нужно сделать, чтобы попасть в вашу компанию в качестве разработчика? Что нужно знать? Если ты не работник Oracle, тут все понятно. Какой набор знаний нужен JVM-инженеру?

kqqgrdorbzjpqilxnjrrgaygjww.jpegНаверное, нужно быть контрибьютором в OpenJDK. (смеется)


8ekykzda9qgrzcubfisv7pi2mdm.pngХорошо, я изменил 250 комментариев и стал контрибьютором. Подойдет?

kqqgrdorbzjpqilxnjrrgaygjww.jpegТы не станешь значимым контрибьютором, изменив 250 комментариев. Так не выйдет.


8ekykzda9qgrzcubfisv7pi2mdm.pngА если человек часто меняет библиотеки — это тоже не сильно про то? Это же сама виртуальная машина.

ort67csfa4vvd0630ghdxxs4foa.jpegГлавное, чтобы человек был хороший. Чтобы хорошо разбирался в алгоритмах. Понимал, как работает процессор — поскольку мы в основном работаем с достаточно низкоуровневыми вещами. Даже необязательно знать какие-то недра.


8ekykzda9qgrzcubfisv7pi2mdm.pngСколько времени проходит до того, как человек в первый раз может сделать осмысленный комит?

ort67csfa4vvd0630ghdxxs4foa.jpegОбычно это несколько месяцев.


8ekykzda9qgrzcubfisv7pi2mdm.pngИ что он делает эти месяцы?

ort67csfa4vvd0630ghdxxs4foa.jpegСначала учится собирать проект. Потом учится понимать. Допустим, ему дали какую-то простую багу, и он учится понимать, в какой области всего этого многообразия ему нужно делать изменения. Потом он пытается сделать это изменение, и у него все валится, он бежит к своему соседу, тормошит его. Потом у него что-то начинает работать и он учится запускать тесты. Затем учится понимать, какие именно тесты нужно запускать. Затем учится понимать, на скольких архитектурах нужно запускать тесты, чтобы этот патч нормально протестировать. Потом учится общаться, потому что в рамках OpenJDK общение является достаточно важной составляющей.


8ekykzda9qgrzcubfisv7pi2mdm.pngА как вы общаетесь?

ort67csfa4vvd0630ghdxxs4foa.jpegMailing list. Если чего-то нет в mailing list, то его нет.


8ekykzda9qgrzcubfisv7pi2mdm.pngА баг-трекер?

ort67csfa4vvd0630ghdxxs4foa.jpegJira. В OpenJDK открытая Jira, в которую все люди, которые стали авторами, получают доступ.


8ekykzda9qgrzcubfisv7pi2mdm.pngУ вас нет своей Jira для Jira, которая будет джирить, пока джиришь?

kqqgrdorbzjpqilxnjrrgaygjww.jpegДля OpenJDK такого нет. Естественно есть другие проекты, в которых у нас есть своя Jira.


8ekykzda9qgrzcubfisv7pi2mdm.pngСколько у вас архитектур? Я иду по списку, который ты назвал, и все понятно насчет общения, но непонятно, зачем запускать на нескольких архитектурах, если у вас только Arm?

ort67csfa4vvd0630ghdxxs4foa.jpegЕсли только Arm, то, может, и не надо запускать на других архитектурах. Но если вы делаете изменение в shared-части, которое даже выглядит абсолютно безобидно, это может аукнуться много где. Вначале нужно понять, где оно может аукнуться. А потом нужно тестировать.


8ekykzda9qgrzcubfisv7pi2mdm.pngКак выглядит матрица тестов, совместимости. Потому что у меня есть подозрение, что она очень большая.

ort67csfa4vvd0630ghdxxs4foa.jpegЕсть тесты, а есть конфигурации. Мы считали количество комбинаций флажков HotSpot, архитектур, тестов, и получили число десять в пятидесятой. Понять, где

© Habrahabr.ru