Как решить проблемы с памятью с помощью пакета сборки Paketo, используемого для создания приложения с весенней загрузкой?

Я создаю образ Docker с помощью плагина spring-boot-maven-plugin, развернутого в AWS BeanStalk. Я использую плагин через зависимость от Spring Boot Starter 2.4.3) Однако, когда контейнер запускается, я получаю сообщение об ошибке ниже. Я немного новичок в материалах buildpack, но попытался решить эту проблему, играя с переменными Buildpack env, как описано на веб-сайте. Но это никак не повлияло на значения, показанные в журнале ошибок ниже. Я обнаружил эту проблему с github, но не уверен, актуален ли она и как ее использовать.

Если я создам образ докера с помощью следующей команды, он отлично работает в AWS Beanstalk:

сборка докеров. --build-arg JAR_FILE=. / target / app.jar -t$ ИМЯ ПРИЛОЖЕНИЯ

Но я бы хотел использовать сборку образа через плагин spring-boot-maven. Пожалуйста, посоветуйте, как это решить?

              <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <name>${image.name}</name>
                    <env>
                        <tag>${project.version}</tag>
                        <!--BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=1M</BPE_APPEND_JAVA_TOOL_OPTIONS-->
                        <BPE_JAVA_TOOL_OPTIONS>-Xms1024m -Xmx3048m</BPE_JAVA_TOOL_OPTIONS>
                    </env>
                </image>
            </configuration>
        </plugin>

Ошибка AWS Beanstalk во время развертывания:

      Tue May 18 2021 18:07:14 GMT+0000 (UTC)   INFO   Successfully built aws_beanstalk/staging-app
Tue May 18 2021 18:07:22 GMT+0000 (UTC)   ERROR   Docker container quit unexpectedly after launch: 0M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1. Check snapshot logs for details.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   [Instance: i-0dc33dcb517e89ef9] Command failed on instance. Return code: 1 Output: (TRUNCATED)...pectedly after launch: 0M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1. Check snapshot logs for details. 
Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   INFO   Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   Unsuccessful command execution on instance id(s) 'i-0dc33dcb517e89ef9'. Aborting the operation.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   Failed to deploy application.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   During an aborted deployment, some instances may have deployed the new application version. To ensure all instances are running the same version, re-deploy the appropriate application version.
##[error]Error: Error deploy application version to Elastic Beanstalk

Журнал ошибок Docker, загруженный в AWS Beanstalk:

      Docker container quit unexpectedly on Tue May 18 18:07:21 UTC 2021:
Setting Active Processor Count to 1
Calculating JVM memory based on 274300K available memory
unable to calculate memory configuration
fixed memory regions require 662096K which is greater than 274300K available for allocation: -XX:MaxDirectMemorySize=10M, -XX:MaxMetaspaceSize=150096K, -XX:ReservedCodeCacheSize=240M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1

1 ответ

Хорошо, вот что это нам говорит:

Расчет памяти JVM на основе 274300 КБ доступной памяти

Калькулятор памяти определяет максимальный объем памяти, доступный в контейнере, как 274300 КБ, или около 274 МБ.

Для фиксированных областей памяти требуется 662096 КБ, что больше 274300 КБ, доступных для распределения: -XX:MaxDirectMemorySize=10M, -XX:MaxMetaspaceSize=150096K, -XX:ReservedCodeCacheSize=240M, -Xss1M * 250 потоков

Это сообщение говорит о том, что калькулятору памяти требуется не менее 662096 КБ или 662 МБ в его текущей конфигурации.

Также выясняется, почему ему нужно / нужно так много:

  • 10 МБ для прямой памяти
  • 150096K для метапространства
  • 240 МБ для зарезервированного кеша кода
  • 250 МБ для потоков (в частности, стек потоков)

Это не считая кучи, которая потребует больше (похоже, вам нужен как минимум 1 ГБ для кучи).

Это оставляет две возможности:

  1. Контейнер недостаточно велик. Вам нужно дать ему больше памяти.
  2. Калькулятор памяти неправильно определяет предел памяти.

Если вы подозреваете №2, обратите внимание на следующее. Калькулятор памяти выбирает максимальный предел памяти (то есть 274M в приведенном выше примере), просматривая эти места в указанном порядке.

  1. Проверьте настроенный предел памяти контейнера, посмотрев на /sys/fs/cgroup/memory/memory.limit_in_bytes внутри контейнера.
  2. Проверьте максимальную доступную память системы, посмотрев на /proc/meminfo и MemAvailable метрическая, опять же, изнутри контейнера.
  3. Если все остальное не сработает, в конечном итоге будет запасной вариант 1G.

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


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

Вы можете сделать это, установив флаги памяти JVM в переменной env (у вас есть BPE_JAVA_TOOL_OPTIONSчто не так). См. Https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#runtime-jvm-configuration .

Например, если вы хотите переопределить размер кучи, установите -Xmx в JAVA_TOOL_OPTIONSк чему-то нестандартному. Калькулятор памяти увидит, что вы установили, и соответствующим образом отрегулирует оставшиеся параметры памяти. Отмените столько, сколько необходимо.

Чтобы все уместилось в 274 МБ ОЗУ, вам нужно сделать очень маленький. Что-то вроде -Xss256K -XX:ReservedCodeCacheSize=64M -XX:MaxMetaspaceSize=64 -Xmx64M. Я не тестировал, чтобы подтвердить, но это показывает представление о том, что вам нужно делать. Уменьшите настройки памяти так, чтобы общая сумма соответствовала максимальному пределу памяти для контейнера.

Это также не принимает во внимание, сможет ли ваше приложение действительно работать в таких небольших пределах. Если вы сделаете слишком маленький размер, вы можете в какой-то момент увидеть OutOfMemoryErrors или StackOverflowErrors, и ваше приложение выйдет из строя. Вы также можете отрицательно повлиять на производительность, слишком сильно уменьшив размер кэша кода, поскольку именно здесь JIT хранит байтовый код, оптимизированный для нативного кода. Вы даже можете вызвать проблемы с сборщиком мусора или снижение производительности из-за слишком большого объема сборщика мусора, если размер кучи неправильный. Короче говоря, будьте очень осторожны, если собираетесь это делать.

Другие вопросы по тегам