Build Native работает слишком медленно для AWS Lambda

Я начинаю с quarkus, и моя нативная сборка работает слишком медленно (больше часа и есть OutOfMemoryError). Я удалил зависимость quarkus <artifactId>quarkus-amazon-lambda</artifactId> из pom.xml, и собственная сборка заняла около 13 минут, но не создал файл function.zip.

Кто-нибудь знает, почему эта зависимость вызывает медленное построение?

Учебное пособие по Quarkus Lambda: https://quarkus.io/guides/amazon-lambda

Моя конфигурация:

  • iMac 2011 - i5 2,4 ГГц - ОЗУ 16 Гб - без SSD
  • GraalVM CE 19.3.1
  • Java 8
  • Maven 3.6.3
  • Набор памяти движка Docker 10 ГБ

Команда сборки

mvn clean install -Pnative -Dnative-image.docker-build=true -Dquarkus.native.enable-jni=true
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.fwborges.alexa</groupId>
    <artifactId>skill-bus-locator</artifactId>
    <version>1.0</version>
    <properties>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <surefire-plugin.version>2.22.0</surefire-plugin.version>
        <maven.compiler.parameters>true</maven.compiler.parameters>
        <quarkus.version>1.5.1.Final</quarkus.version>
        <compiler-plugin.version>3.8.1</compiler-plugin.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-bom</artifactId>
                <version>${quarkus.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>

        <!-- AWS Lambda -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-amazon-lambda</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-test-amazon-lambda</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Database -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-validator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-jdbc-mysql</artifactId>
        </dependency>

        <!-- Log -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.1</version>
        </dependency>

        <!-- Http Clients -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-undertow</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest-client</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy-jsonb</artifactId>
        </dependency>

        <!-- Utils -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

        <!-- AWS Alexa SDK -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-amazon-alexa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.amazon.alexa</groupId>
            <artifactId>ask-sdk</artifactId>
            <version>2.29.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <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>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Журналы сборки:

[skill-bus-locator-lambda-1.0-runner:25]    classlist:  44,330.01 ms
[skill-bus-locator-lambda-1.0-runner:25]        (cap):   3,911.88 ms
[skill-bus-locator-lambda-1.0-runner:25]        setup:   9,214.88 ms
18:30:44,765 INFO  [org.hib.val.int.uti.Version] HV000001: Hibernate Validator 6.1.5.Final
18:30:45,188 INFO  [org.hib.Version] HHH000412: Hibernate ORM core version 5.4.16.Final
18:30:45,215 INFO  [org.hib.ann.com.Version] HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
18:30:45,322 INFO  [org.hib.dia.Dialect] HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
18:36:15,233 INFO  [org.jbo.threads] JBoss Threads version 3.1.1.Final
Exception in thread "native-image pid watcher" java.lang.OutOfMemoryError: Java heap space
[skill-bus-locator-lambda-1.0-runner:25]     analysis: 4,862,370.37 ms

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "mysql-cj-abandoned-connection-cleanup"

Спасибо!!


person Felipe Borges    schedule 22.06.2020    source источник
comment
Привет! Эта зависимость нужна вам, чтобы получить функциональную лямбду с Quarkus. Я не уверен, что вы можете создать собственный образ с помощью Alexa, пока у него нет расширения. Так что, возможно, вы столкнулись с некоторыми проблемами. Сейчас я использую quarkus с лямбда-выражениями AWS в основном ежедневно, и создание образа в машинном коде заняло некоторое время; но не так много времени (возможно, от 5 до 8 минут в Mac Book Pro середины 2015 года). Возможно, «бутылочным горлышком» является процессор.   -  person Gerardo Arroyo    schedule 23.06.2020
comment
Привет, Герардо! Прошу прощения за опоздание. Quarkus уже доступен для нативных образов с использованием alexa, если вы увидите мой pom.xml, вы заметите зависимость quarkus-amazon-alexa. И вы были правы насчет производительности процессора, я увеличил свой движок докеров до 4 ядер процессора, удалил некоторые зависимости, установил 12 ГБ памяти и получил 1 час сборки. Да, это все равно многовато. Но пока это работает, я буду искать решение получше.   -  person Felipe Borges    schedule 15.07.2020
comment
Привет, Фелипе! Ух ты, но 1 час на сборку - много времени. Возможно, вы сможете открыть билет с кваркусом и получить подсказки.   -  person Gerardo Arroyo    schedule 16.07.2020


Ответы (1)


Я не эксперт по AWS Lambdas и Quarkus. Однако я много лет работал над настройкой серверов приложений на базе Java и видел это в вашем файле журнала.

18:36:15,233 INFO  [org.jbo.threads] JBoss Threads version 3.1.1.Final
Exception in thread "native-image pid watcher" java.lang.OutOfMemoryError: Java heap 
space

Таким образом, похоже, что процесс развертывания вызывает проблему нехватки памяти (OOM), что имеет смысл из-за медлительности, потому что перед получением ошибки OOM сборщик мусора потратил несколько циклов процессора на то, чтобы сделать все возможное, чтобы очистить кучу.

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

person rcastellcastell    schedule 28.07.2020