我收到警告“未设置容器内存限制。为 1G 容器配置 JVM。”无论 RAM 大小或 docker 配置
Posted
技术标签:
【中文标题】我收到警告“未设置容器内存限制。为 1G 容器配置 JVM。”无论 RAM 大小或 docker 配置【英文标题】:I'm getting warning "Container memory limit unset. Configuring JVM for 1G container." regardless RAM size or docker configuration 【发布时间】:2021-02-03 03:46:18 【问题描述】:我有一个 Spring Boot 应用程序,它是由 mvn spring-boot:build-image
构建到一个 docker 映像上的。当它运行时,它会打印出一个警告:
WARNING: Container memory limit unset. Configuring JVM for 1G container.
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx192915K -XX:MaxMetaspaceSize=343660K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 1G, Thread Count: 250, Loaded Class Count: 58260, Headroom: 0%)
现在,无论在哪台机器上运行,此消息似乎都会出现。无论是在 Windows 上的本地 Docker 桌面上,还是在具有 2 或 4 GB RAM 的 AWS 实例中。我对最大堆大小设置为 200M 不满意...
内存计算是否存在错误,或者我可以以某种方式对其进行调整?
更新: 我正在使用 Dockerrun.aws.json v1 来部署到 Beanstalk。所以我想我无法控制 docker run 参数。
【问题讨论】:
这能回答你的问题吗? How to set Java heap size (Xms/Xmx) inside Docker container? docs.docker.com/engine/reference/run/… 嗯,不,它没有回答我的问题。很抱歉造成混乱。事实上,我在 AWS Elastic Beanstalk 中运行 docker 映像。而且我无法控制将任何参数传递给 docker run。还是我?我正在使用 Dockerrun.aws.json v1 来部署到 Beanstalk。 【参考方案1】:通常,您会使用docker run -m <size>
设置内存限制。 Java buildpack 和内存计算器将从cgroup information 读取此值,然后根据您定义的内存限制调整 JVM。
看起来像 Amazon Elastic Beanstalk,您可以在 Dockerrun.aws.json
中设置内存限制。见他们的container definition format docs。
有两种选择:
记忆
容器实例上为容器保留的内存量。为容器定义中的 memory 或 memoryReservation 参数中的一个或两个指定一个非零整数。
内存预留
为容器保留的内存的软限制(以 MiB 为单位)。为容器定义中的 memory 或 memoryReservation 参数中的一个或两个指定一个非零整数。
我不是 Amazon Elastic Beanstalk 方面的专家,但从他们的文档看来,您想设置 memory
。
如果由于某种原因无法设置内存限制,您在撰写本文时唯一的选择是忽略警告并使用 1G 默认值。
然后您可能希望缩小您的环境,以免浪费资源。就像如果你有一个 4G 的 VM,它只会将 JVM 配置为使用 1G,因此将你的 VM 缩小到 1G(或附近的东西),你最终会更好地使用可用资源。
【讨论】:
memory
参数适用于Dockerrun.aws.json v2
。我正在使用文件的版本 1(因为我有 Amzazon Linux 2 而我没有 docker compose)。见info about v1。版本 1 有一个 command 参数,但我不确定如何使用来解决我的问题。
您可能需要与亚马逊核实,看看是否可行。它似乎不是来自他们的文档。我在文档中可以看到,该文件的 v1 没有公开容器内存设置(如果我在这一点上错了,我相信有人会纠正我,AWS 不是我的专业领域)。如果您无法设置容器内存限制,那么 JBP 的内存计算器将不会准确。您可以忽略警告,只需使用您要使用的值覆盖内存计算器。它会给您带来更多工作量,但您仍然可以使用所有内存。
有关如何覆盖内存计算器的详细信息,请参阅我的更新。
内存计算器足够智能,可以查看您是否指定了其中之一,并且不会尝试覆盖它 - 很好,我不知道.谢谢你。那将解决我的问题。我可以在环境中设置JAVA_TOOL_OPTIONS
。变量。
顺便说一句,最明显的问题 - 我可以设置容器内存限制并避免警告Container memory limit unset.
吗? :-)以上是关于我收到警告“未设置容器内存限制。为 1G 容器配置 JVM。”无论 RAM 大小或 docker 配置的主要内容,如果未能解决你的问题,请参考以下文章