2017-10-17 119 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

感謝您的回答。正是我在找的東西。感謝所有的資源。 –