2017-10-17 115 views
1

我正在运行一个容器,它在AWS(t2中)的CoreOS服务器实例上包含一个带有tomcat docker基本映像的J2EE webapp。最近我遇到了在内部使用Java的Docker容器中如何超过内存限制会导致容器失败(Resource)。阅读完上面的文章后,我有点担心我的CoreOS实例上运行的任何容器是否将在未来面临这个问题。CoreOS如何将内存分配给Docker容器?

所以我想找出什么将是当搬运工运行命令,这是我跑我的搬运工集装箱的方式指定内存限制泊坞窗容器的默认内存限制。正如在forum中所讨论的那样,答案表明它的无限制,并且基于操作系统给出的任何内容。

我想知道CoreOS如何决定的内存限制在细节给定的容器中,我应该如何设置这是运行在Tomcat的基础图像的Web应用程序容器的内存限制和CPU利用率担心(由于CoreOS中的内存过载问题,是否有机会退出容器?)。

的文献中没有我遇到在互联网上提供有关CoreOS或Tomcat泊坞窗图像一个明确的答案,这个问题。

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

回答

1

在泊坞,默认情况下,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环境变量中指定这些参数。如果您未指定基于JVM版本和可用内存的内存限制Java will use a default one。有关于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' 
    

    在你提到的网页,他们用CMD在dockerfile:

    CMD java -XX:+PrintFlagsFinal -XX:+PrintGCDetails $JAVA_OPTIONS -jar java-container.jar 
    
  • 使用的script你提到使用Fabric8 dockerfile页面计算容器限制并使用可用内存的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

+0

感谢您的回答。正是我在找的东西。感谢所有的资源。 –