Собственная исполняемая сборка Quarkus: высокое потребление памяти

Я создаю собственный исполняемый файл Quarkus с многоэтапной сборкой Docker, как описано в Quarkus - Building родной исполняемый файл

Мой проект просто включает Hello World-Example с некоторыми добавленными ORM-функциями (так что на самом деле не так много зависимостей). Сборка работает нормально, но моя проблема в том, что она потребляет много памяти во время сборки. Это означает до 6 GiB. На мой взгляд, время сборки тоже очень велико (всего ~ 4-6 минут).

Проблема начинается, когда я строю нашу CI / CD-инфраструктуру. У нас там не так много памяти, поэтому сборка завершается с ошибкой Error: Image build request failed with exit status 137.

Я что-то делаю не так или это нормальное поведение? Есть ли возможность хотя бы уменьшить потребление памяти?


person Ben    schedule 23.07.2019    source источник
comment
Потребление памяти является результатом генерации собственного образа GraalVM, оно не связано с Quarkus. Нам известно, что для создания собственного образа обычно требуется около 4 Гб ОЗУ, и обычно это занимает 2-3 минуты, в зависимости от процессора.   -  person Ken    schedule 23.07.2019
comment
То есть нет возможности ограничить ресурсы, используемые GraalVM? Время в данном случае не имеет значения, важна память.   -  person Ben    schedule 24.07.2019
comment
Вы можете использовать -J ‹flag›, чтобы передать флаг jvm, на котором запущен генератор изображений, чтобы вы могли ограничить память чем-то вроде -Xmx5G (имейте в виду, что это может значительно замедлить процесс генерации изображения) . В quarkus вы можете установить его с помощью параметра конфигурации additionalBuildArgs в плагине maven.   -  person Luca Burgazzoli    schedule 24.07.2019
comment
Это работает, но, как вы сказали, время сборки увеличено. Сейчас у меня 10 минут с -Xmx2G.   -  person Ben    schedule 24.07.2019


Ответы (5)


Спасибо Кену и Луке Бургаццоли! Таким образом, GraalVM использует> 4 ГБ ОЗУ и это занимает более 3 минут.

Можно ограничить потребление памяти, указав -J-Xmx2G как additionalBuildArgs-параметр для quarkus-maven-plugin. Но это может увеличить время сборки.

person Ben    schedule 24.07.2019

@ben ответ правильный, но, возможно, будет полезно быть более точным. Вы должны отредактировать pom.xml в каталоге getting-started и отредактировать native profile и добавить <additionalBuildArgs>-J-Xmx2G</additionalBuildArgs> следующим образом:

  <profile>
        <id>native</id>
        <activation>
            <property>
                <name>native</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>io.quarkus</groupId>
                    <artifactId>quarkus-maven-plugin</artifactId>
                    <version>${quarkus.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>native-image</goal>
                            </goals>
                            <configuration>
                                <enableHttpUrlHandler>true</enableHttpUrlHandler>
                <additionalBuildArgs>-J-Xmx2G</additionalBuildArgs>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-failsafe-plugin</artifactId>
                     ...
                </plugin>
            </plugins>
        </build>
    </profile>
person Panciz    schedule 28.09.2019

Если вы используете gradle, отредактируйте build.gradle следующим образом:

.
.
.

compileJava {
    options.compilerArgs << '-parameters'
}

buildNative {
   additionalBuildArgs = [
           '-J-Xmx2G'
   ]
}

Таким образом, вы можете ограничить использование памяти при сборке с помощью gradle.

person Ibrahim    schedule 24.02.2020

В примере с верблюжьим кваркусом с использованием maven я настроил следующее, чтобы заставить его работать:

<profiles>
    <profile>
        <id>native</id>
        <activation>
            <property>
                <name>native</name>
            </property>
        </activation>
        <properties>
            <quarkus.package.type>native</quarkus.package.type>
            <quarkus.native.additional-build-args>-J-Xmx5G</quarkus.native.additional-build-args>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Используя опцию <quarkus.native.additional-build-args>-J-Xmx5G</quarkus.native.additional-build-args>

person George Fisherman    schedule 17.05.2020

Теперь вы можете ограничить использование памяти Quarkus:

В вашем файле src / main / resources / application.properties просто установите:

quarkus.native.native-image-xmx=2G

Или просто передайте эту опцию maven:

mvn package -Dnative -Dquarkus.native.native-image-xmx=2G
person sunix    schedule 05.11.2020