加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

容器中的JVM资源该怎样被安详的限定?

发布时间:2019-01-18 05:22:39 所属栏目:站长百科 来源:运维猿
导读:媒介 Java与Docker的团结,固然更好的办理了application的封装题目。但也存在着不兼容,好比Java并不能自动的发明Docker配置的内存限定,CPU限定。 这将导致JVM不能不变处奇迹务!容器会杀死你JVM历程,而康健搜查又将拉起你的JVM历程,进而导致你监控你的po
副问题[/!--empirenews.page--]

 容器中的JVM资源该怎样被安详的限定?

媒介

Java与Docker的团结,固然更好的办理了application的封装题目。但也存在着不兼容,好比Java并不能自动的发明Docker配置的内存限定,CPU限定。

这将导致JVM不能不变处奇迹务!容器会杀死你JVM历程,而康健搜查又将拉起你的JVM历程,进而导致你监控你的pod一天重启次数乃至能到达几百次。

我们但愿当Java历程运行在容器中时,java可以或许自动辨认到容器限定,获取到正确的内存和CPU信息,而不消每次都必要在kubernetes的yaml描写文件中表现的设置完容器,还必要设置JVM参数。

行使JVM MaxRAM参数可能解锁尝试特征的JVM参数,进级JDK到10+,我们可以办理这个题目(大概吧~.~)。

起首Docker容器本质是是宿主机上的一个历程,它与宿主机共享一个/proc目次,也就是说我们在容器内看到的/proc/meminfo,/proc/cpuinfo 与直接在宿主机上看到的同等,如下。

Host

  1. cat /proc/meminfo  
  2. MemTotal: 197869260 kB 
  3. MemFree: 3698100 kB 
  4. MemAvailable: 62230260 kB 

容器

  1. docker run -it --rm alpine cat /proc/meminfo 
  2. MemTotal: 197869260 kB 
  3. MemFree: 3677800 kB 
  4. MemAvailable: 62210088 kB 

那么Java是怎样获取到Host的内存信息的呢?没错就是通过/proc/meminfo来获取到的。

默认环境下,JVM的Max Heap Size是体系内存的1/4,若是我们体系是8G,那么JVM将的默认Heap≈2G。

Docker通过CGroups完成的是对内存的限定,而/proc目次是已只读情势挂载到容器中的,因为默认环境下Java 压根就看不见CGroups的限定的内存巨细,而默认行使/proc/meminfo中的信息作为内存信息举办启动, 这种不兼容环境会导致,假如容器分派的内存小于JVM的内存,JVM历程会被领略杀死。

内存限定不兼容

我们起首来看一组测试,这里我们回收一台内存为188G的物理机。

  1. #free -g total used free shared buff/cache available 
  2. Mem: 188 122 1 0 64 64 

以下的测试中,我们将包括openjdk的hotspot假造机,IBM的openj9假造机。

以下测试中,我们把正确辨认到限定的jdk,称之为安详(即不会超出容器限定不会被kill),反之称之为伤害。

测试用例1(OPENJDK)

这一组测试我们行使最新的openjdk8-12,给容器限定内存为4G,看JDK默认参数下的最大堆为几多?看看我们默认参数下几多版本的JDK是安详的

呼吁如下,假如你也想试试看,可以用一下呼吁。

  1. docker run -m 4GB --rm openjdk:8-jre-slim java -XshowSettings:vm -version 
  2. docker run -m 4GB --rm openjdk:9-jre-slim java -XshowSettings:vm -version 
  3. docker run -m 4GB --rm openjdk:10-jre-slim java -XshowSettings:vm -version 
  4. docker run -m 4GB --rm openjdk:11-jre-slim java -XshowSettings:vm -version 
  5. docker run -m 4GB --rm openjdk:12 java -XshowSettings:vm -version 

OpenJDK8(并没有辨认容器限定,26.67G) 伤害

  1. [root@xiaoke-test ~]# docker run -m 4GB --rm openjdk:8-jre-slim java -XshowSettings:vm -version 
  2. VM settings: 
  3.  Max. Heap Size (Estimated): 26.67G 
  4.  Ergonomics Machine Class: server 
  5.  Using VM: OpenJDK 64-Bit Server VM 
  6. openjdk version "1.8.0_181" 
  7. OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13) 
  8. OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) 

OpenJDK8 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap (正确的辨认容器限定,910.50M)安详

  1. [root@xiaoke-test ~]# docker run -m 4GB --rm openjdk:8-jre-slim java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -version 
  2. VM settings: 
  3.  Max. Heap Size (Estimated): 910.50M 
  4.  Ergonomics Machine Class: server 
  5.  Using VM: OpenJDK 64-Bit Server VM 
  6. openjdk version "1.8.0_181" 
  7. OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13) 
  8. OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读