共计 4293 个字符,预计需要花费 11 分钟才能阅读完成。
前言
将 Java 利用容器化尽管更好地解决了可移植性问题,但也存在着一些不敌对的状况,比方低版本的 JDK(低于 Java 8u131)并不能辨认 CGroup 资源限度。这将导致 JVM 读取的是宿主机的全副 CPU 和内存,一但容器应用资源超过限度则会被 docker 杀死。
在 kubernetes 中,咱们会显示在 yaml 文件中配置 CPU、内存申请和限度,咱们心愿容器中的 JVM 过程可能自动识别到 CGroup 资源限度,获取到正确的内存和 CPU 信息从而自行动静调整。
JVM 参数配置
以下操作皆在一台 4C 16G 服务器上进行。
版本低于 8u131
JDK 版本低于 8u131 版本的 JVM 不会自动识别到 CGroup 资源限度,须要手动设置初始堆大小以及最大堆大小,否则会依照宿主机的全副内存设置默认值:
- 配置最大堆大小
-Xmx
,默认值:内存的 1 /4 - 配置初始堆大小
-Xms
,默认值:内存的 1 /64
未配置 JVM 参数
能够看到 Max. Heap Size (Estimated): 3.48G
,未能正确辨认 CGroup 资源限度
$ docker run --rm -m 2GB openjdk:8u121-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 3.48G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (IcedTea 3.3.0) (Alpine 8.121.13-r0)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
配置 JVM 参数
配置 -Xmx
和 -Xms
后即可达到咱们想要的后果
$ docker run --rm -m 2GB openjdk:8u121-alpine java -XshowSettings:vm -Xmx2000m -Xms2000m -version
VM settings:
Min. Heap Size: 1.95G
Max. Heap Size: 1.95G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (IcedTea 3.3.0) (Alpine 8.121.13-r0)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
8u131 及以上版本
从 8u131 版本开始反对 UseCGroupMemoryLimitForHeap
和 MaxRAMFraction
这两个选项,用 CGroupMemory
的大小作为 JVM heap size,MAXRAMFraction
是用来管制理论可用的内存数量的,比方设置为 1 的话就是 CGroupMemoryLimit
的全副,设置为 2 的话一半,3 的话就是 1/3,以此类推
|MaxRAMFraction 取值 | 堆占比 | 容器内存 =1G|容器内存 =2G|容器内存 =4G|容器内存 =8G|容器内存 =16G| |:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-|:—-:|:—-| |1|≈90%|910.50M|1.78G|3.56G|7.11G|14.22G| |2|≈50%|455.50M|910.50M|1.78G|3.56G|7.11G| |3|≈33%|304.00M|608.00M|1.19G|2.37G|4.74G| |4|≈25%|228.00M|455.50M|910.50M|1.78G|3.56G|
未配置 JVM 参数
能够看到 Max. Heap Size (Estimated): 3.48G
,未能正确辨认 CGroup 资源限度
$ docker run --rm -m 2GB openjdk:8u131-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 3.48G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (IcedTea 3.4.0) (Alpine 8.131.11-r2)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
配置 JVM 参数
配置 -XX:+UnlockExperimentalVMOptions
、-XX:+UseCGroupMemoryLimitForHeap
和 -XX:MaxRAMFraction=1
后即可达到咱们想要的后果
$ docker run --rm -m 2GB openjdk:8u131-alpine java -XshowSettings:vm -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -version
VM settings:
Max. Heap Size (Estimated): 1.78G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (IcedTea 3.4.0) (Alpine 8.131.11-r2)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
8u191 及以上版本
从 8u191 开始引入了 java10+ 上的 UseContainerSupport
选项,而且是默认启用的,不必设置。同时 UseCGroupMemoryLimitForHeap
这个就弃用了,不倡议持续应用,同时还能够通过 -XX:InitialRAMPercentage
、-XX:MaxRAMPercentage
、-XX:MinRAMPercentage
这些参数更加细腻的管制 JVM 应用的内存比率。比方一些 Java 程序在运行时会调用内部过程、申请 Native Memory 等,所以即便是在容器中运行 Java 程序,也得预留一些内存给零碎的。所以 -XX:MaxRAMPercentage
不能配置得太大。
未配置 JVM 参数
能够看到未增加任何 JVM 参数即可正确辨认到 CGroup 资源限度
$ docker run --rm -m 2GB openjdk:8u191-alpine java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 455.50M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
配置 JVM 参数
- 应用
-XX:MaxRAMFraction
参数调整Max. Heap Size
大小`
console $ docker run –rm -m 2GB openjdk:8u191-alpine java -XX:MaxRAMFraction=1 -XshowSettings:vm -version
VM settings: Max. Heap Size (Estimated): 1.78G Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM
openjdk version“1.8.0_191”OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
* 应用 `-XX:InitialRAMPercentage`、`-XX:MaxRAMPercentage`、`-XX:MinRAMPercentage` 参数更加细腻的管制 JVM 应用的内存比率
```console
$ docker run --rm -m 2GB openjdk:8u191-alpine java -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=90.0 -XX:MinRAMPercentage=50.0 -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 1.60G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
参考资料
- http://www.51gjie.com/java/55…
- https://zhuanlan.zhihu.com/p/…
- https://my.oschina.net/neverf…
- https://sevenyu.top/2019/04/0…
- https://qingmu.io/2018/12/17/…
本文由猪齿鱼技术团队原创,转载请注明出处:猪齿鱼官网
对于猪齿鱼
猪齿鱼 Choerodon 全场景效力平台,提供体系化方法论和合作、测试、DevOps 及容器工具,帮忙企业拉通需要、设计、开发、部署、测试和经营流程,一站式进步管理效率和品质。从团队协同到 DevOps 工具链、从平台工具到体系化方法论,猪齿鱼全面满足协同治理与工程效率需要,贯通端到端全流程,助力团队效力更快更强更稳固。戳此处试用猪齿鱼