当前位置: 首页 > news >正文

容器中 Java 应用程序的内存和 CPU 如何分配?看这一篇就够了!

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五,与您不见不散!


随着2018年的结束,我们将回顾排名前五的最受读者欢迎的文章。今天分享的第一篇文章,将帮助那些在容器中运行 Java 虚拟机(JVM)时遇到内存和 CPU 大小调整/使用困难的人,本文将解释如何在 Docker Desktop(Mac或Windows)和 Docker Enterprise 环境中改进 Docker 容器与 Java 10的集成。


许多应用程序都以容器的形式运行在 Java 虚拟机(JVM)中,其中包括 Apache Spark 和 Kafka 等数据服务以及旧的企业级应用程序。直到最近,在容器中运行 Java 虚拟机会出现内存和cpu大小以及使用方面的问题,从而导致性能损失。这是因为 Java 没有识别到它是在容器中运行的。随着 Java 10的发布,Java 虚拟机现在可以识别容器控制组(cgroups)设置的约束。内存和 cpu 约束都可以用于直接在容器中管理 Java 应用程序,包括:

  • 遵守容器中设置的内存限制;
  • 在容器中设置可用的 cpu;
  • 在容器中设置 cpu 约束;

Docker Desktop(Mac 或 Windows)和 Docker Enterprise 环境都实现了 Java 10的改进。


容器内存限制

在 Java 9之前,Java 虚拟机无法识别容器使用标记设置的内存或CPU限制。在Java 10中,内存限制将自动进行识别并强制执行。

Java 将服务器类机器定义为具有2个 CPU 和 2GB 内存,默认堆大小为物理内存的1/4。 例如,Docker Enterprise Edition 安装有2GB内存和4个CPU。比较运行 Java 8和 Java 10之间容器的区别。首先,Java 8:

docker container run -it -m512 --entrypoint bash openjdk:latest
$ docker-java-home/bin/java -XX:+PrintFlagsFinal -version | grep MaxHeapSize
   uintx MaxHeapSize := 524288000 {product}
openjdk version "1.8.0_162"

最大堆大小为 512M 或 Docker EE 安装设置的 2GB 的1/4,而不是容器上设置的限制为512M。 相比之下,在 Java 10上运行相同的命令表明容器中设置的内存限制非常接近预期的128M:

docker container run -it -m512M --entrypoint bash openjdk:10-jdk
$ docker-java-home/bin/java -XX:+PrintFlagsFinal -version | grep MaxHeapSize
  size_t MaxHeapSize = 134217728 {product} {ergonomic}
openjdk version "10" 2018-03-20

设置可用的CPU

默认情况下,每个容器对主机 CPU 周期的访问权限是不受限制的。可以设置各种约束来限制给定容器对主机 CPU 周期的访问。Java 10可以识别出这些限制:

docker container run -it --cpus 2 openjdk:10-jdk
jshell> Runtime.getRuntime().availableProcessors()
$1 ==> 2

分配给 Docker EE 的所有 CPU 获得相同比例的 CPU 周期。可以通过相对于所有其他正在运行的容器的权重更改容器的 CPU 份额权重来修改该比例。该比例仅适用于 CPU 密集型进程运行时。当一个容器中的任务空闲时,其他容器可以使用剩余的 CPU 时间。 实际的 CPU 时间量将根据系统上运行的容器数量而有所不同。这些可以在 Java 10中进行设置:

docker container run -it --cpu-shares 2048 openjdk:10-jdk
jshell> Runtime.getRuntime().availableProcessors()
$1 ==> 2

“cpuset” 约束设置了哪些 cpu 允许在 Java 10中执行。

docker run -it --cpuset-cpus="1,2,3" openjdk:10-jdk
jshell> Runtime.getRuntime().availableProcessors()
$1 ==> 3

分配内存和 CPU

使用 Java 10,容器设置可用于估计部署应用程序所需的内存和 CPU 分配。假设已经确定了容器中运行的每个进程的内存堆和 CPU 需求,并设置了 JAVA_OPTS。例如,如果您的应用程序分布在10个节点上,五个节点需要512Mb内存,每个节点占用 1024 CPU,另外五个节点需要256Mb内存,每个节点占用 512 CPU共享。请注意,1个CPU份额比例由 1024 表示。

对于内存,应用程序至少需要分配 5Gb 内存。

  • 512Mb x 5 = 2.56 Gb
  • 256Mb x 5 = 1.28 Gb

对于 CPU,应用程序需要分配8个CPU才能高效运行。

  • 1024 x 5 = 5 CPUs
  • 512 x 5 = 3 CPUs

最佳实践建议:分析应用程序以确定 Java 虚拟机中运行的每个进程的内存和 CPU 分配。无论如何,Java 10在调整容器大小时消除了猜测,预防了 Java 应用程序中的内存不足错误以及保障了分配足够的 CPU 来处理工作负载。

相关文章:

  • 北斗三号系列核心芯片
  • Hive日期函数笔记
  • 21-Python与设计模式--备忘录模式
  • mysql-connector-java 6版本的jdbc连接问题
  • Android FM模块学习之四源码解析(一)
  • 冲刺第四天 1.4 FRI
  • 有关java中static关键的重写问题
  • Tortoise SVN 创建分支与合并
  • Delphi 发送按键
  • Python - 默认参数的一次性求值
  • Internet TV 影音娱乐新生活
  • Linux 引导过程内幕
  • android service 学习(上)
  • Azure Redis Cache (4) 配置和管理Redis Cache
  • WPF VS Apollo
  • 「译」Node.js Streams 基础
  • 3.7、@ResponseBody 和 @RestController
  • AWS实战 - 利用IAM对S3做访问控制
  • axios 和 cookie 的那些事
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • express如何解决request entity too large问题
  • iOS | NSProxy
  • jQuery(一)
  • node学习系列之简单文件上传
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 微服务入门【系列视频课程】
  • 微信小程序填坑清单
  • 一份游戏开发学习路线
  • 一文看透浏览器架构
  • #etcd#安装时出错
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #Ubuntu(修改root信息)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (MATLAB)第五章-矩阵运算
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .a文件和.so文件
  • .gitignore
  • .Net core 6.0 升8.0
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net小白的大学四年,内含面经
  • @angular/cli项目构建--http(2)
  • @Validated和@Valid校验参数区别
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504