MailRuChamps / raic-2020

GNU General Public License v3.0
26 stars 27 forks source link

Add Java/Kotlin-GraalVM-native client (to solve performance problems with standard Java/Kotlin) #107

Closed Karloid closed 3 years ago

Karloid commented 3 years ago

Как выяснилось, многие стратегии на Java/Kotlin имеют серьезные проблемы с низкой и непредсказуемой производительностью из-за JIT и, как следствие, TIME LIMITами Потребляемое время для jvm-стратегий #106

Одно из решений - это использовать GraalVM Ahead of Time компиляцию native-image

кажется, что такой вариант билда здорово поможет java\kotlin стратегиям


работоспособность контейнера проверял следующей командой:

% docker run -v /Users/fox/projects/raic-2020/clients/Kotlin-GraalVM-native/output:/output/ -ti kotlin-graalvm-aot:1.8  /bin/bash -c "sh ./compile.sh base && sh ./run.sh"

в результате стратегия запускалась, и собранный бинарник оказывался у меня в

/Users/fox/projects/raic-2020/clients/Kotlin-GraalVM-native/output

links: https://www.graalvm.org/reference-manual/native-image/ https://www.graalvm.org/reference-manual/native-image/NativeImageMavenPlugin/

PS: докерфайл мб можно как-то улучшить, я совсем не эксперт в докере PPS: с базовым образом oracle/graalvm-ce:20.3.0-java11 у меня зависал yum PPPS: преобразование jar в натив на моей стратегии с 2мб jar занимает примерно 30сек реального времени, проц 9700k. Выходной бинарь имеет размер ~11мб

Karloid commented 3 years ago

Добавил поддержку для Java-GraalVM-native там все аналогично, единственный момент - это снижение таргета джавы с 15 на 11 т.к. грааль вм не поддерживает 15

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

Karloid commented 3 years ago

Общая инструкция как без докера\мавена собрать свою стратегию в натив:

1)качаем\ставим GraalVM https://www.graalvm.org/docs/getting-started/#install-graalvm

он ставится как “обычный” jdk, но не обязательно его делать дефолтным, или именно им собирать джарник можно в PATH Только прописать

export PATH=${PATH}:/Library/Java/JavaVirtualMachines/graalvm-ce-java11-20.3.0//Contents/Home/bin

2) доустанавливаем native-image https://www.graalvm.org/reference-manual/native-image/#install-native-image gu install native-image (gu - это утилита из GraalVM)

3) Конвертим jar в native -

native-image -jar ./strategy.jar ./strategy_native
13human commented 3 years ago

@Karloid для scala клиента подобное сложно реализовать?

Karloid commented 3 years ago

@Karloid для scala клиента подобное сложно реализовать?

по идее нет, аналогично должно быть