bsf*_*ira 3 java memory jvm docker
我有一个运行带有以下jvm参数的java应用程序的容器:
-XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m
Run Code Online (Sandbox Code Playgroud)
我正在使用docker内存限制选项:
docker run -it -m 2304m foo bash
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但几个小时后我得到以下统计数据:
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
Run Code Online (Sandbox Code Playgroud)
虽然,如果我查看容器内正在运行的应用程序的进程执行细节,我有一个用法,~735MBmyApp继续计算请求没有任何问题:
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
Run Code Online (Sandbox Code Playgroud)
值得一提的是,我已经使用jconsole监控进程6,一切看起来都不错.
为什么docker容器在其内容不需要的情况下使用所有可用内存?我预计docker会比myApp使用更多的内存...而不是100%的可用内存.
让我们从这开始:
-XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m
Run Code Online (Sandbox Code Playgroud)
也就是说,使用一个从0.5Gb开始并可以增长到2GB的堆,以及一个0.25GB的permgen堆.这不包括JVM的其他非堆使用情况; 例如,内存映射文件,线程堆栈,缓存的JAR文件等.
然后你说docker报告容器使用的是2.416 GB.这并不奇怪.2.42 - 2.25是0.17GB,对于非堆内存使用而言并不过量.
最后,735736 RSS值告诉你驻留的设置大小; 即该进程正在使用的当前物理RAM量.JVM参数和docker stats命令是虚拟内存大小的度量.
为什么docker容器在其内容不需要的情况下使用所有可用内存?我预计docker会比myApp使用更多的内存...而不是100%的可用内存.
我认为你误读了ps aux输出.RSS只是所使用的物理内存.事实上,您的进程的总内存使用量由VSZ给出...即5GB.现在> <看起来很大,并且不明显为什么它那么大.但是从表面上看,这意味着Docker正在低估容器真正的内存/虚拟内存使用情况.
另一件事是Docker容器不会将容器中的应用程序与容器外部的其他内容隔离.JVM将与容器内外的其他应用程序竞争物理RAM.
欲获得更多信息:
https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/解释了Docker资源管理的工作原理,以及它能做什么和不能做什么.
| 归档时间: |
|
| 查看次数: |
1945 次 |
| 最近记录: |