【问题标题】:How does CoreOS allocates memory to a Docker container?CoreOS 如何为 Docker 容器分配内存?
【发布时间】:2018-03-29 02:12:07
【问题描述】:

我正在运行一个容器,该容器包含一个 J2EE webapp 和 AWS(t2 介质)的 CoreOS 服务器实例上的 tomcat docker 基础映像。最近我发现在使用 Java 的 Docker 容器中超出内存限制会导致容器失败 (Resource)。读完上面的文章后,我有点担心我在我的 CoreOS 实例上运行的任何容器将来是否会遇到这个问题。

所以我想知道当 docker run 命令没有指定内存限制时,Docker 容器的默认内存限制是多少,这就是我运行 docker 容器的方式。正如forum 中所讨论的,答案表明它是无限的,并且它基于操作系统提供的任何内容。

但是 我想知道CoreOS如何详细决定给定容器的内存限制,我是否应该担心设置正在运行的容器的内存限制和CPU利用率带有 tomcat 基础镜像的 webapp(会不会因为 CoreOS 中的内存过载问题而导致容器退出?)。

对于这个问题,我在互联网上看到的所有文档都没有提供与 CoreOS 或 tomcat docker 映像相关的明确答案。

注意 - 我正在通过 systemd 管理我的 Docker 容器。

【问题讨论】:

    标签: java tomcat memory memory-management coreos


    【解决方案1】:

    在 Docker 中,默认情况下,a container has no resource constraints。如果您没有为容器指定内存限制,the limit is unlimited。但是,内存可能受到cgroup 配置的限制。另外,如果你使用的是Kubernetes或者其他管理系统,可以define a default limit for a domain or namespace

    Tomcat 是在虚拟机上运行的 Java 应用服务器。 JVM 尝试根据-Xms and -Xmx arguments 等参数保留一定量的内存。在 TOMCAT 中,这些参数可以在catalina.sh 启动脚本或CATALINA_OPTSJAVA_OPTS 环境变量中指定。如果不指定内存限制,Java will use a default one 基于 JVM 的版本和可用内存。在Java 8 default limits 上有一个讨论。 Java 不会使用比指定更多的内存。如果从 Tomcat 调用其他非 Java 程序,则必须跟踪这些应用程序使用的内存。

    • Tomcat in the Docker repository 没有为 Java 运行时定义内存限制。 default tomcat catalina.sh 也没有定义限制。
    • 如果您使用该模板,Java(和 Tomcat)将使用默认值。您可以使用以下方法检查系统中的值:

      java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
      

      在您提到的页面中,他们在 dockerfile 中使用了 CMD:

      CMD java -XX:+PrintFlagsFinal -XX:+PrintGCDetails $JAVA_OPTIONS -jar java-container.jar
      
    • 您提到的页面使用Fabric8 dockerfile,该页面使用script 来计算容器限制并使用50% 的可用内存作为上限。

    • 确定应用程序所需的内存量是Tomcat tunning 的一部分。您可能会发现许多 pages 讨论这个和其他 Tomcat 参数,例如允许的连接数和连接器中使用的线程数等。
    • 您可以使用-e 开关来设置环境变量来定义内存限制。

      $ docker run -d --name mycontainer -p 8080:8080 -m 800M -e JAVA_OPTIONS='-Xmx300m' ...
      
    • 如果为容器定义内存限制,它必须大于 Java 使用的内存限制。 Github 问题中有一个old discussion,其中包含一些关于要添加多少内存的想法。


    请注意,最近的 Java 版本会考虑可用内存和 CPU according to the docker/cgroup defined limits。 Java 系统(包括 tomcat)may fail at startup 如果您没有足够的内存或内存限制小于运行时所需的内存。 Linux 和 Java 使用乐观的malloc,它们可能会在一段时间后失败。你必须check all of the cgroups, docker and JVM configurations

    【讨论】:

    • 感谢您的回答。正是我想要的。也感谢所有资源。
    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多