首页 > 其他分享 >JDK对容器的支持和限制

JDK对容器的支持和限制

时间:2023-05-05 11:55:23浏览次数:43  
标签:容器 限制 JDK 虚拟机 内核 邻居 CPU

容器毕竟是一种轻量级的实现方式,所以其封闭性不如虚拟机技术。

1、容器环境的资源隔离性

举个例子:

物理机/宿主机有 96 个 CPU 内核、256GB 物理内存,容器限制的资源是 4 核 8G,那么容器内部的 JVM 进程看到的内核数和内存数是多少呢?
目前来说,JVM 看到的内核数是 96,内存值是 256G。

这会造成一些问题,基于 CPU 内核数 availableProcessors 的各种算法都会受到影响,比如默认 GC 线程数:假如啥都不配置,JVM 看见 96 个内核,设置 GC 并行线程数为 96*5/8~=60,但容器限制了只能使用 4 个内核资源,于是 60 个并行 GC 线程来争抢 4 个机器内核,造成严重的 GC 性能问题。

同样的道理,很多线程池的实现,根据内核数量来设置并发线程数,也会造成剧烈的资源争抢。如果容器不限制资源的使用也会造成一些困扰,比如下面介绍的坏邻居效应。基于物理内存 totalPhysicalMemorySize 和空闲内存 freePhysicalMemorySize 等配置信息的算法也会产生一些奇怪的 Bug。

  

2、JDK 对容器的支持和限制

最新版的 JDK 加入了一些修正手段。

新版 JDK 支持 Docker 容器的 CPU 和内存限制:

https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits

可以增加 JVM 启动参数来读取 Cgroups 对 CPU 的限制:

https://www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Hotspot 是一个规范的开源项目,关于 JDK 的新特性,可以阅读官方的邮件订阅,例如:

https://mail.openjdk.java.net/pipermail/jdk8u-dev/

其他版本的 JDK 特性,也可以按照类似的命名规范,从官网的 Mailing Lists 中找到:

https://mail.openjdk.java.net/mailman/listinfo

关于这个问题的排查和分析,请参考前面的章节[《JVM 问题排查分析调优经验》]。

 

3、坏邻居效应

有共享资源的地方,就会有资源争用。在计算机领域,共享的资源主要包括:

  • 网络
  • 磁盘
  • CPU
  • 内存

在多租户的公有云环境中,会存在一种严重的问题,称为“坏邻居效应”(noisy neighbor phenomenon)。当一个或多个客户过度使用了某种公共资源时,就会明显损害到其他客户的系统性能。(就像是小区宽带一样)

 

吵闹的坏邻居(noisy neighbor),用于描述云计算领域中,用来描述抢占共有带宽,磁盘 I/O、CPU 以及其他资源的行为。

 

坏邻居效应,对同一环境下的其他虚拟机/应用的性能会造成影响或抖动。一般来说,会对其他用户的性能和体验造成恶劣的影响。

 

云,是一种多租户环境,同一台物理机,会共享给多个客户来运行程序/存储数据。

坏邻居效应产生的原因,是某个虚拟机/应用霸占了大部分资源,进而影响到其他客户的性能。

带宽不足是造成网络性能问题的主要原因。在网络中传输数据严重依赖带宽的大小,如果某个应用或实例占用太多的网络资源,很可能对其他用户造成延迟/缓慢。坏邻居会影响虚拟机、数据库、网络、存储以及其他云服务。

 

有一种避免坏邻居效应的方法,是使用裸机云(bare-metal cloud)。裸机云在硬件上直接运行一个应用,相当于创建了一个单租户环境,所以能消除坏邻居。虽然单租户环境避免了坏邻居效应,但并没有解决根本问题。超卖(over-commitment)或者共享给太多的租户,都会限制整个云环境的性能。

 

另一种避免坏邻居效应的方法,是通过在物理机之间进行动态迁移,以保障每个客户获得必要的资源。此外,还可以通过 存储服务质量保障(QoS,quality of service)控制每个虚拟机的 IOPS,来限制坏邻居效应。通过 IOPS 来限制每个虚拟机使用的资源量,就不会造成某个客户的虚机/应用/实例去挤占其他客户的资源/性能。

 

有兴趣的同学可以查看:

[谈谈公有云的坏邻居效应](https://github.com/cncounter/translation/blob/master/tiemao_2016/45_noisy_neighbors/noisy_neighbor_cloud _performance.md)

标签:容器,限制,JDK,虚拟机,内核,邻居,CPU
From: https://www.cnblogs.com/binyue/p/17373725.html

相关文章

  • JDK导致ActiveMQ、Kafka连接zookeeper失败:Session 0x0 for server 10.1.21.244/<unres
      最近在部署一套ActiveMQ集群时,使用zookeeper来实现,zookeeper启动了,在启动ActiveMQ时,抛出异常:    WARN|Session0x0forserver10.1.21.244/<unresolved>:2181,unexpectederror,closingsocketconnectionandattemptingreconnectjava.lang.IllegalArgu......
  • Docker - 容器虚拟化
    目录Docker0虚拟化0.1什么是虚拟化0.2虚拟化技术中常见名词1docker简介1.1什么是docker1.2docker的优势1.3容器与虚拟机比较2Docker镜像、容器、仓库Docker中有三个核心概念:镜像、容器和仓库因此,准确把握这三大概念对于掌握Docker技术尤为重要①镜像(Image)②容器(Conta......
  • CentOS 下修改 WordPress 文件上传大小限制
    CentOS下可以通过修改php.ini来设置WordPress 文件上传大小限制。默认的php.ini文件是在/etc下。(对应的包:php-common)修改下面的几个参数:upload_max_filesize=64Mpost_max_size=64Mmax_execution_time=300修改后重启httpd。$servicehttpdrestart这样上传文......
  • docker mysql 容器自动停止 -- docker update
    原因:mysql容器占用资源过高被系统杀死解决方法dockerupdate-m500M--memory-reservation500M--memory-swap1000M容器id/容器名说明-m限制内存最大值--memory-reservation是弹性控制内存大小,防止损失性能,建议要开。当宿主机资源充足时,允许容器尽量多地使......
  • Linux搭建JDK环境
    一、上传linux版本的JDK包至服务器本次实验上传的linux目录为/usr/local/develop/JDK。二、解压JDK压缩包tar-zvxfjdk-8u351-linux-x64.tar.gz解压后详情如下三、配置JDK环境变量3.1、打开profile文件,配置jdk的环境变量sudovi/etc/profile3.2、在文件尾......
  • k8s 编写pod yaml 文件 启动pod 查看pod详细信息 查看pod日志 连接pod容器 删除po
    #1创建podyaml文件#使用帮助命令 [root@master01pod]#kubectlexplainpod.spec[root@master01pod]#catpod-self.yamlapiVersion:v1kind:Podmetadata:name:pod-selfnamespace:defaultlabels:app:my-selfdev:prospec:restartPolic......
  • JDK1.8新特性(七):默认方法,真香,开动!接口?我要升级!!
    前期回顾:JDK1.8新特性(一):JDK1.8究竟有哪些新特性呢JDK1.8新特性(二):为什么要关注JDK1.8JDK1.8新特性(三):Lambda表达式,让你爱不释手JDK1.8新特性(四):函数式接口JDK1.8新特性(五):Stream,集合操作利器,让你好用到飞起来JDK1.8新特性(六):Stream的终极操作,轻松解决集合分组、汇总等复杂......
  • element ui selectableRange 不生效,另一种方式实现时间选择范围限制
    selectableRange不生效可能是以为element版本问题,有条件的可以先升级elementui版本试试。使用picker-options实现时间选择范围限制直接上代码:<el-date-pickerv-if="viewer===''||viewer==='creator'||subTaskInfo.status!==2"v-model=......
  • 查看Nginx容器中的配置文件
    要查看Nginx容器中的配置文件,可以按照以下步骤进行:进入正在运行的Nginx容器:dockerexec-it<nginx-container-name>bash其中,<nginx-container-name>是Nginx容器的名称。在容器内部,浏览到/etc/nginx/目录,这是Nginx配置文件所在的目录。使用以下命令可以查看该目录中的所......
  • Tomcat7安装基于jdk 1.7环境
    这篇文章着重讲解tomcat7的安装,首先需要下载tomcat包和相应的jdk,如果你的系统是32位,那么下载x86的jdk,如果是64位的系统,那么下载X64的JDK。tomcat7安装1、查看系统版本 #uname–a//是64位系统,那么我们选择64位的JDKLinux2.6.32-71.el6.x86_64#1SMPFriMay2003......