Как стать автором
Обновить

Комментарии 21

Есть вопросы с обоснованием зачем это все нужно.

Времена меняются, и теперь у нас повсеместно облака и Kubernetes.

И микросервисы. Основная идея которых, быть небольшими и довольно легкими. Да, стартуют они не моментально, но гораздо шустрее монолита. И эта скорость вполне может устраивать. Грубо говоря, пустое приложение на Spring Boot стартует за пару секунд. Потом на него навешают всякие валидации схем БД, накатывание миграций и прочее и стартовать он станет минуту (тут, кстати, вопрос что делать со всем этим в нативном приложении). Но все равно, даже такая цифра для многих сценариев энтерпрайза вполне себе норм.

Кубер перезапускает приложения

Да, но если он это делает часто, то зачастую это сигнал о том, что с приложением что-то не то.

Поэтому нам важна скорость перезапуска и количество используемой оперативной памяти.

У вас есть информация по использованию памяти? Интересно насколько эффективно это получается у нативного приложения? По идее, размер heap же никак не уменьшается.

Частично согласен, частично нет. Попробую развернуть

Если говорить об энтерпрайзах, вопрос не в том, что "достаточно-недостаточно", а что можно сэкономить ещё. Если компания в месяц тратит на облако десять миллионов рублей, то 10% это уже приличная сумма, на которую можно купить нескольких синьоров. В реальности, большие компании тратят сильно больше.

Представь, вот у тебя какая-то система, состоящая из нескольких сотен микросервисов. (Насколько помню, в Альфе кор занимает что-то в районе трех сотен, слышал на каком-то митапе. А у Нетфликса там под тысячу). И каждый из них обернут в условный Spring Boot, который отжирает память у каждого из микросервисов снова и снова, на одно и то же. Это очень много бесцельно потраченных ресурсов!

Наверное, можно представить менеджера энтерпрайза, которого не волнуют деньги, в том числе что на его личную премию капнет 10% от сэкономленных 10% (лишняя сотня тысяч в примере выше), но это точно массовый чел?)

Да, но если он это делает часто, то зачастую это сигнал о том, что с приложением что-то не то.

А в большой системе у тебя всегда есть что-то, что не работает, и это тратит деньги :)

А еще у тебя может постоянно меняться скейлинг в зависимости от того, сколько людей набежало (условный Нетфликс, в котором утром нет никого, а под вечер есть кто-то), или когда загрузка меняется между регионами (когда Восток спит, Запад еще смотрит), или еще что-то.

А еще у тебя аджайл, и разработчики каждые 10 минут выкатывают новую версию какого-нибудь микросервиса, одного из сотен, и их нужо там двигать, иногда каскадно перезапускать...

По идее, размер heap же никак не уменьшается.

Рабочие данные магически, конечно, никуда не ужмутся. Да и производительность сборщика мусора на достаточно больших данных (сотни гигабайт) заставит заплакать. А вот размер приложения может сократиться очень сильно.

Там в статье очень непросто есть этот раздел про JIT vs AOT.

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

Если тебе не подходит такая сделка, и тебе нужна монолитная пиковая производительность в произвольном месте приложения, работа с терабайтами данных - эта технология не для тебя.

Точно так же тебе тогда не нужен Go и Python на продакшене, у них со всем этим тоже так себе дела обстоят.

И каждый из них обернут в условный Spring Boot, который отжирает память у каждого из микросервисов снова и снова, на одно и то же. Это очень много бесцельно потраченных ресурсов!

Поэтому и хотелось узнать информацию, сколько именно выиграем по памяти от использования native. Т.е. какие-то цифры (проценты или мб). Почему условный Spring Boot вдруг перестанет жрать память? Короче, есть подозрение, что это экономия на спичках.

Рабочие данные магически, конечно, никуда не ужмутся. А вот размер приложения может сократиться очень сильно

Сильно это насколько?

Там в статье очень непросто есть этот раздел про JIT vs AOT.

В статье нашел только околомаркетинговую картинку.

Наверное, можно представить менеджера энтерпрайза, которого не волнуют деньги, в том числе его личная премия, но это точно массовый чел?)

Наверное, можно представить менеджера энтерпрайза, которого не волнует, что фичи не вывели вовремя в прод потому, что разрабы пытаются отладить и собрать нативное чудо, но это точно массовый чел? )

Если тебе не подходит такая сделка, и тебе нужна монолитная пиковая производительность в произвольном месте приложения, работа с терабайтами данных - эта технология не для тебя.

Вот и хочется понять, кому может подойти такая сделка. Пока получается, что пригодится тем, кому постоянно требуется перезапускать приложение.

Как доеду до какого-нибудь места, где есть компьютер - соберу что-нибудь и скажу точные цифры. Сейчас в руках только телефон, под него GraalVM пока, вроде бы, не делают :)

Вообще, ты можешь пойти и сам попробовать, и поделиться с нами результатми.

Вообще, ты можешь пойти и сам попробовать, и поделиться с нами результатми

Конечно могу. Если бы писал статью, в которой делал акцент на экономии ресурсов, то так бы и сделал.

Точно так же тебе тогда не нужен Go и Python на продакшене, у них со всем этим тоже так себе дела обстоят.

вот мне тоже показалось что AOT режим метит в нишу Go - быстро стартует, нативный, относительно мало весит, меньше футпринт. но читая текущие недостатки кажется проще взять уж тогда го, чем сношаться с джавой. мб в будущем при адопшене, развитии и полировке AOT решения будет меньше цена использования и ряд ниш в рамках джава-команд это займет. пока выглядит что "экономически оправданная" применимость подхода покрывает весьма узкий спектр кейсов

Удачи :) Расскажите, если чего получится!

У вас картинка не полная
image

Ну если хотите повышенное использование памяти и увеличенное время старта, то upx самое то

Есть какие-то исследования по этому?

сценарий похож на fat jar: необходима предварительная распаковка

То есть, некоторая дополнительная нагрузка при старте приложения? На дальнейшую работу upx как-то влияет?

только на старте. есть более действенные способы уменьшать размер образа - не в ущерб скорости запуска приложения

Ну вот паковал я gitea для интереса, RSS сразу после старта (это еще не установленная версия)
grep gitea | xargs ps -o pid,rss,command -p | awk '{$2=int($2/1024)"M";}{ print;}'
806 196M ./gitea-with-upx

835 167M ./gitea-1.18.-rc1-linux-amd64

Время запуска под WSL2
time ./gitea-with-upx --help
real 0m1.998s
user 0m1.992s
sys 0m0.041s

time ./gitea-1.18.-rc1-linux-amd64 --help
real 0m0.074s
user 0m0.060s
sys 0m0.045s

Axiom Runtme Container платный, но сильно меньше (около 50-100 мегабайт), и подходит серьезным энтерпрайзам (сейчас на нем работает весь российский банкинг).

Если честно, вообще упустил момент, когда и как этот Axiom появился. Вроде бы был Беллсофт, который делал понятное: коммитил в OpenJDK, собирал свои JDK и docker-образы, двигал Alpine и проник по умолчанию в билдпаки paketo. Что произошло потом? Это какое-то разделение на с этой/с той стороны? С этой стало "только платно"? Если я по собственной невнимательности упустил какие-то статьи / новости, прошу бросить в меня ссылками :)

Как оно может уже быть во всём российском банкинге, когда банкинг это крайне медленная инерциальная штука? Вот я смотрю на CI раннерах в одном из доступных мне банков, там россыпь образов разного, от maven:3 и openjdk:11, до той же либерики, которую затащил я, но Axiom-а нету. Слишком громогласное заявление, и оттого отталкивающее. Извините :)

Вранье это маркетинговое. В Тинькофф точно нет этого axiom.

Кубернейтис и экономия времени старта. На секундочку - пока твой приклад не начнет отдавать хелсчеки - куб в него не будет роутить трафик. То есть выкатываем новую версию, а она (обоже, если там какой-нибудь томкат) стартует целых 80-90 секунд, и, обоже, эти 90 секунд у нас продолжает работать старая версия. Странная метрик, если честно, время старта приложения, наверно для локальной отладки - ок, но в проде, где у тебя почти всё эвенчуально, странная.

Зато если вдруг под трафиком новая версия начала погибать, то очень бы хотелось чтоб выкатка предыдущей, уже потушеной, произошла как можно скорее)

Конечно такое может решаться канарейкой с постепенным переключением трафика, но дерьмо таки случается)

платный, но сильно меньше (около 50-100 мегабайт)

бесплатный образ eclipse-temurin:11.0.17_8-jre-alpine по подсчётам докерхаба 55.76 MB

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

Пишите на Elixir и не будете мучиться в отладке и настройке, как с Java)
Тут можно почитать как в Spotify задолбались отлаживать JVM и сняли все свои проблемы переходом на Elixir

Зарегистрируйтесь на Хабре, чтобы оставить комментарий