docker统计100%的内存

我有一个容器,运行一个Java应用程序与以下jvm参数:

-XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m 

我正在使用docker内存限制选项:

 docker run -it -m 2304m foo bash 

在容器初始化后运行docker stats myApp就会给我:

 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O myApp 0.17% 660.5 MB/2.416 GB 27.34% 240.8 kB/133.4 kB 

但几个小时后,我有以下数据:

 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O myApp 202.18% 2.416 GB/2.416 GB 100.00% 27.67 GB/19.49 GB 

虽然,如果我查看容器内正在运行的应用程序的进程执行细节,我有~735MB的用法,myApp继续计算请求没有任何问题:

 me@docker-container ~]$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND me+ 1 0.0 0.0 11636 1324 ? Ss 13:44 0:00 /bin/bash /home/bar/service/start-myApp.sh me+ 6 113 4.5 5014152 735736 ? Sl 13:44 438:46 java -XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m -jar myApp-service-1.0-final.jar me+ 481 0.0 0.0 11768 1820 ? Ss 20:09 0:00 bash me+ 497 0.0 0.0 35888 1464 ? R+ 20:10 0:00 ps aux 

值得一提的是,我用jconsole来监控进程6 ,一切都很好。

为什么docker容器使用所有可用的内存,如果其内容不需要它? 我预计docker会比myApp使用更多的内存…不是100%的可用内存。

让我们从这开始:

  -XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m 

这就是说,使用一个从0.5Gb开始的堆,可以增长到2GB,也可以是一个0.25GB的permgen堆。 这不包括JVM的其他非堆使用; 如内存映射文件,线程堆栈,caching的JAR文件等

然后你说Docker报告容器正在使用2.416 GB。 这并不奇怪。 2.42 – 2.25是0.17GB,这对于非堆内存使用情况不是过度的。

最后,735736 RSS值告诉你驻留集的大小; 即该进程正在使用的当前物理内存量。 JVM参数和docker stats命令是虚拟内存大小的度量。


为什么docker容器使用所有可用的内存,如果其内容不需要它? 我预计docker会比myApp使用更多的内存…不是100%的可用内存。

我认为你误读ps aux输出。 RSS只是正在使用的物理内存。 实际上,您的进程的总内存使用量是由5GB的VSZ给出的。 现在看起来确实很大,为什么这么大? 但从表面上看,这意味着Docker 低于容器真实内存/虚拟内存使用量。

另一件事就是Docker容器不会将容器中的应用程序与容器外的其他事物的资源需求隔离开来。 JVM将与容器内部和外部的其他应用程序竞争物理RAM。

了解更多信息: