如何解决如何使用用于构建 spring-boot 应用程序的 Paketo buildpack 解决内存问题?
我正在使用部署到 AWS BeanStalk 的 spring-boot-maven-plugin 构建 Docker 映像。我通过2.4.3 spring boot starter依赖使用插件) 但是,当容器启动时,我收到以下错误。 我对 buildpack 的东西有点陌生,但试图通过使用网站上描述的 Buildpack env 变量来解决它。但它对下面错误日志中显示的值绝对没有影响。 我找到了这个 github issue,但不确定它是否相关以及如何使用它。
我使用的是总内存为 1G 的 AWS Micro 实例,它执行滚动更新,因此在启动新映像时,另一个也在运行,直到新映像启动成功,因此启动容器可以也只有 300MB 可用,但是,在正常运行期间它有更多可用空间。
为什么我需要这个内存计算?我不能只是禁用它吗?当我构建 app.jar 的 Docker 映像并将其部署到 aws beanstalk 时,它在没有任何内存设置的情况下运行良好:
docker 构建。 --build-arg JAR_FILE=./target/app.jar -t $APPLICATION_NAME
但我很想使用通过 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>
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
AWS Beanstalk 中下载的 Docker 错误日志:
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
解决方法
好的,这就是告诉我们的:
基于274300K可用内存计算JVM内存
内存计算器检测到容器中可用的最大内存量为 274300KB,即大约 274M。
固定内存区域需要 662096K,大于 274300K 可供分配:-XX:MaxDirectMemorySize=10M,-XX:MaxMetaspaceSize=150096K,-XX:ReservedCodeCacheSize=240M,-Xss1M * 250 个线程
此消息表示内存计算器在其当前配置中至少需要 662096KB 或 662M。
它也分解了为什么它需要/想要那么多:
- 10M 用于直接内存
- 150096K 用于元空间
- 240M 用于保留代码缓存
- 250M 线程(特别是线程堆栈)
这不包括需要更多的堆(您似乎希望堆至少有 1G)。
这留下了两种可能性:
- 容器的配置不够大。你需要给它更多的内存。
- 内存计算器未正确检测内存限制。
如果您怀疑 #2,请查看以下内容。内存计算器通过按此顺序查看这些位置来选择它的最大内存限制(即上例中的 274M)。
- 通过查看容器内的
/sys/fs/cgroup/memory/memory.limit_in_bytes
来检查配置的容器内存限制。 - 再次从容器内部查看
/proc/meminfo
和MemAvailable
指标,检查系统的最大可用内存。 - 如果所有其他方法都失败了,最终会出现 1G 回退。
如果确实没有按上述方式工作,please open a bug 并提供尽可能多的细节。
或者,您可以调整内存计算器。您可以指示它为特定区域提供更少的内存,从而将所需的总内存减少到小于最大可用内存。
您可以通过在 JAVA_TOOL_OPTIONS
环境变量中设置 JVM 内存标志来做到这一点(您有 BPE_JAVA_TOOL_OPTIONS
不正确)。见https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#runtime-jvm-configuration。
例如,如果您想覆盖堆大小,则将 -Xmx
中的 JAVA_TOOL_OPTIONS
设置为自定义值。内存计算器将查看您的设置并相应地调整剩余内存设置。根据需要覆盖尽可能多的内容。
要将事情缩小到适合 274M 的 RAM,您必须变得非常小。类似 -Xss256K -XX:ReservedCodeCacheSize=64M -XX:MaxMetaspaceSize=64 -Xmx64M
的东西。我没有测试确认,但这显示了您需要做什么的想法。减少内存设置,使总和都适合容器的最大内存限制。
这也没有考虑您的应用程序是否真的能够在如此小的限制内运行。如果您设置的太小,您可能会在某些时候看到 OutOfMemoryErrors 或 StackOverflowErrors,并且您的应用程序将崩溃。您还可以通过减少过多的代码缓存大小对性能产生负面影响,因为这是 JIT 存储针对本机代码优化的字节代码的地方。如果堆大小不合适,您甚至可能会导致 GC 问题,或由于 GC 过多而导致性能下降。简而言之,如果您要这样做,请务必小心。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。