docker 设置 jvm 内存_是否值得付费?Oracle,Open JDK等四大JVM性能全面对比

c09e7ba36454d0f725787985933806c5.png

市面上可供选择的JVM发行版还是有不少的。选择合适的JVM需要考虑不同的因素。性能是其中一个重要的因素。靠谱的性能研究是很困难的。在本文中,我创建了一个测试,在不同的JVM上执行对比测试。测试程序包括Spring Boot REST应用,使用Prometheus监控JVM并使用Grafana可视化。下图是示意图。除了soapui外,所有东西都在docker容器中运行。

0e7ebf18adcda657ee4679707692eb47.png

隔离干扰因素
如何确定没有别的因素干扰你的设施。我们可以通过尝试隔离分配给流程的资源来实现。 例如,分配专用CPU和固定数量的内存。 我还进行了几项测试,这些测试将资源限制放在负载均衡器,监控软件和可视化软件上(为这些资源分配不同的CPU和内存)。 为进程分配特定资源(使用docker-compose v2 cpuset和内存参数)似乎不会对单个进程负载和响应时间的度量产生很大影响。 我还比较了启动,负载和无负载情况。 在这些不同情况下,测试结果没有很大变化。为进程分配特定CPU和内存
使用docker-compose无法为进程配置特定CPU。 docker-compose v3不支持为进程分配特定的CPU,也不支持分配资源约束。 您可以想象在潜在的多主机环境中分配特定CPU并非易事。 因此,我将docker-compose文件迁移回v2,该版本允许分配特定的CPU。 可以用于监控软件,这些CPU和JVM使用的CPU隔离开。 我使用了taskset命令。同环境测试
您如何确保所有测试都在完全相同的情况下进行? 当我针对JVM运行测试而明天再次运行相同的测试场景时,我的结果会有所不同。 这可能有各种原因,例如不同的CPU会占用工作负载,而且这些CPU也忙于处理其他事情,或者我在主机或客户操作系统中运行不同的后台进程。 即使首次测试单个JVM并在测试之后测试另一个JVM,结果也无法比较。 例如,我正在使用Prometheus收集数据。 在第二次运行期间,Prometheus数据库可能会存储更多数据。 这可能会导致添加新数据的速度变慢,这可能会影响第二个JVM性能指标。 这个例子虽然可能相当牵强,但您可以采取措施排除其他因素。 这是我选择同时执行所有测试的原因。setup
我的环境包括一个docker-compose文件,它允许我轻松启动4个在不同JVM上运行Spring Boot应用程序。 在4个JDK的之前,我加了一个haproxy实例来进行负载均衡。 这是为了确保不同的测试之间没有时间相关的差异,保证所有JVM都同时处于相同的负载下。
为了监控结果,我使用了Micrometer保证Prometheus能够读取JVM性能指标。 我使用Grafana对数据可视化:https://grafana.com/dashboards/4701
由于GraalVM目前仅作为JDK 8版本提供,因此其他JVM也使用JDK 8。 当容器运行时,可以通过访问执行器url来检查JVM版本:localhost:8080/actuator/env

fa52e7dd98e100a8a618d1f3d129d84b.png


或者使用如下命令:

docker exec -it store/oracle/serverjre:8 java -version

使用的JVM版本如下:

  • GraalVM CE rc9 (8u192)
  • OpenJDK 8u191
  • Zulu 8u192
  • Oracle JDK 8u181

开始测试
可以在这里下载代码,然后运行命令:

sh ./buildjdkcontainers.sh</pre>
<pre class="graf graf--pre">docker-compose -f docker-compose-jdks.yml up

你可以可以访问:

  • 8080端口的haproxy
  • 9090端口的Prometheus
  • 3000端口的Grafana

需要配置Grafana访问Prometheus的数据

fb69f0cfabb205db446af7911cf02ab5.png

接下来配置Grafana中的dashboard:

4886527ba72ce88dbb16cf4c9e6dcc6d.png

4886527ba72ce88dbb16cf4c9e6dcc6d.png


接下来,您可以对http://localhost:8080/hello(HTTP GET)执行负载测试,并在Grafana仪表板中查看结果。操作系统差异
不同Docker镜像之间使用的OS不同。 操作系统可通过以下方式确定:

docker exec -it store/oracle/serverjre:8 cat /etc/*-release
  • azul/zulu-openjdk:8 used Ubuntu 18.04
  • oracle/graalvm-ce:1.0.0-rc9 used Oracle Linux Server 7.5
  • openjdk:8 used Debian GNU/Linux 9
  • store/oracle/serverjre:8 used Oracle Linux Server 7.5

我认为这不会对JVM运行产生太大的影响。OracleJDK和Graalvm使用相同的操作系统。

测试结果

使用JVM dashboard,可以轻松区分特定的差异区域,以便进一步研究它们。

cpu使用

ebe24bec71a51938ff24654be2308165.png

GraalVM在测试期间总体CPU使用率最高。 Oracle JDK的CPU使用率最低。

响应时间

整体GraalVM的响应时间最短,OpenJDK最好,紧随Oracle JDK和Zulu。 平均而言,OpenJDK与GraalVM之间的差异约为30%。

ebe24bec71a51938ff24654be2308165.png

垃圾回收

GraalVM加载了比其他JDK更多的类。 OpenJDK加载最少的类。 GraalVM和OpenJDK之间的差异大约是25%。 尚未确定这是否是GraalVM的固定开销,或者与所使用的类的数量成比例。

e61f0cd14b0c35525dc15bd28d93725c.png

这些额外的类可能会导致垃圾收集期间的延迟(尽管这种相关性可能不一定是因果关系)。 GraalVM的的GC暂停时间确实最长。
下面是GC暂停时间总和的图表。 由于GraalVM中的分配失败导致了最长的GC暂停时间(顶部的一行)。

56dd96f150201e593ed25ec94b5c728e.png

内存使用

fcca709fd0b78cd9000b9179da7fa4a7.png

JVM内存使用情况很有意思。 如上图所示,OpenJDK JVM使用的内存堆垛。 GraalVM和Zulu的垃圾收集行为似乎相似,但GraalVM具有更高的内存使用率。 Oracle JDK垃圾收集并不频繁。 在查看平均值时,OpenJDK JVM使用最大内存,而Zulu使用最少内存。 在较长时间内衡量时,Oracle JDK和OpenJDK的行为看起来不稳定,而Zulu和GraalVM看起来更稳定。

b0e08c94174fbdd7a74d23e5ba54ee7d.png

总结

在本次测试中,我使用SOAP UI对运行在4个不同JVM上的Spring Boot Rest程序进行了压力测试。我使用Prometheus轮询JVM实例(每5s轮训一次,用Micrometer生成数据),并使用Grafana和Prometheus来显示数据。结果表明GraalVM不适合作为OpenJDK的替代品,因为它的表现更差,使用了更多资源,加载更多类而且垃圾收集时间更长。

  • GraalVM加载的类更多
  • GraalVM 上的应用程序响应时间最慢
  • GraalVM的CPU使用率最高(响应时间最慢)
  • GraalVM的GC时间最长
  • Zulu OpenJDK使用的内存最少。与Oracle JDK和OpenJDK相比,Zulu OpenJDK和GraalVM的内存使用更稳定。

当然,由于GraalVM相对较新,Micrometer提供的指标可能无法正确显示实际吞吐量和资源使用情况。也可能是我的设置导致这种差异。我通过查看不同情况下的结果来排除第二个问题。
如果您想使用GraalVM的多语言功能,那么其他JVM无此功能。GraalVM也提供了本地编译选项(我在同一个JAR上执行了测试)。此功能可能会大大提高性能。
原文地址:https://technology.amis.nl/2018/11/23/comparing-jvm-performance-zulu-openjdk-openjdk-oracle-jdk-graalvm-ce/#prettyPhoto

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机考研初试复试比例,考研初试400多分,16人都被刷,计算机专业报考人太多,报应来了...

在目前大家都一味地挤着报考计算机专业&#xff0c;其他工科专业都被抛弃&#xff0c;以至于很多考研分数400的依然是被刷掉&#xff0c;这就是近期天津大学计算机专业考研复试的情况&#xff0c;在以前&#xff0c;考400以上都被称之为神人&#xff0c;但现在报考计算机专业40…

怎样考计算机教师资格证书,非师专生怎么考取计算机教师资格证书?

满意答案ff8410012013.04.08采纳率&#xff1a;41% 等级&#xff1a;12已帮助&#xff1a;22396人先要到户口所在地的教育局报名&#xff0c;报名的时间各地都不一样的&#xff0c;不统一&#xff0c;可以咨询当地教育局。。。如果你没有考教育学心理学和普通话就会组织你考…

UserWarning: Matplotlib is currently using agg in Object Detection API

【解决办法】在models\research\object_detection\utils\visualization_utils.py 文件中&#xff0c;注释掉&#xff1a;import matplotlib; matplotlib.use(Agg)。如下图所示&#xff1a; 作者&#xff1a;LabVIEW_Python 链接&#xff1a;https://www.jianshu.com/p/5eaa66a5…

c++堆栈溢出怎么解决_栈溢出基础

一. 基础知识什么是缓冲区溢出在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示注意到括号之间的空格是输入用户名的预期空间.那个空间是我们的缓冲.处理用户名后, 返回地…

object detection训练自己数据

1、用labelImg标自己数据集。 并将图片存放在JPEGImages中&#xff0c;xml存放在Annotations中 2、分离训练和测试数据 import os import randomtrainval_percent 0.66 train_percent 0.5 xmlfilepath Annotations txtsavepath ImageSets\Main total_xml os.listdir(xml…

苹果怎样用小米云服务器,苹果换华为/小米,怎么同步数据?教程来了!

原标题&#xff1a;苹果换华为/小米&#xff0c;怎么同步数据&#xff1f;教程来了&#xff01;由于系统不同&#xff0c;iOS和Android之间数据迁移一直都是跨平台换机用户的“绊脚石”。而且iOS是封闭系统&#xff0c;不像Android那么开源。尽管市面上的App基本都支持两大系统…

python中变量和函数的区别_python中带下划线的变量和函数的意义

Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下&#xff0c;不同程序员编写的 Python 代码可以保持最大程度的相似风格。这样就易于阅读&#xff0c;易于在程序员之间交流。 1 变量 常量 : 大写加下划线1 USER_CONSTANT 对…

github搜索技巧_和逛知乎、刷微博一样高效使用 GitHub

自打毕业之后&#xff0c;可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue&#xff0c;然后在Explore 看看社区内项目的走势&#xff0c;紧接着开始写代码搬砖的工作&#xff0c;偶尔也会关注下 Github 的 Blog, 看看有没有大新闻&#xff0c;亦…

方舟服务器维护驯龙,方舟生存进化新手图文攻略 最详细的驯龙教程方法

《方舟&#xff1a;生存进化》很多新手玩家不知道前期如何生存&#xff0c;不知道有什么技巧&#xff0c;下面小编就为大家带来方舟生存进化的图文攻略&#xff0c;也就是新手图文攻略教程&#xff0c;希望对想要接触或这刚刚接触这款游戏的玩家有所帮助。首先&#xff0c;进入…

服务器ios文件,ios 文件到服务器

ios 文件到服务器 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使…

python二维图颜色函数_Python绘图之二维图与三维图详解

各位工程师累了吗? 推荐一篇可以让你技术能力达到出神入化的网站"持久男" 1.二维绘图 a. 一维数据集 用 Numpy ndarray 作为数据传入 ply 1. import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt np.random.seed(1000) y np.random.stan…

Windows10配置CUDA10.0+cudnn7.5.1

1、安装CUDA10.0 &#xff08;1&#xff09;下载&#xff1a;https://developer.nvidia.com/cuda-10.0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexelocal 双击安装包进行安装&#xff0c;路径全部默认不做修改 &#…

金蝶云系统服务器,金蝶系统云服务器已离线

金蝶系统云服务器已离线 内容精选换一换本节操作介绍在Windows和Linux环境中使用SSH密码方式远程登录Linux云耀云服务器的操作步骤。云耀云服务器状态为“运行中”。云耀云服务器已经绑定弹性公网IP。所在安全组入方向已开放22端口&#xff0c;配置方式请参见配置安全组规则。使…

python 并列条形图_python – 来自两个pandas数据框的分组条形图

我有两个包含不同值但结构相同的数据框&#xff1a; df1 0 1 2 3 4 D 0.003073 0.014888 0.155815 0.826224 NaN E 0.000568 0.000435 0.000967 0.002956 0.067249 df2 0 1 2 3 4 D 0.746689 0.185769 0.060107 0.007435 NaN E 0.764552 0.000000 0.070288 0.101148 0.053499…

径向基神经网络_谷歌开源Neural Tangents:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...

鱼羊 假装发自 凹非寺量子位 报道 | 公众号 QbitAI只要网络足够宽&#xff0c;深度学习动态就能大大简化&#xff0c;并且更易于理解。最近的许多研究结果表明&#xff0c;无限宽度的DNN会收敛成一类更为简单的模型&#xff0c;称为高斯过程&#xff08;Gaussian processes&…

佳能g2800清零软件天空_可能是史上最有趣的3D建模软件

今天咱们要讲的不是一款BIM软件&#xff0c;而是一款有趣的3D体素建模软件。体素英文名叫Voxel&#xff0c;是把像素风格中的小方块引申到三维空间里&#xff0c;让图像呈现一小块一小块的鲜明风格。比如《我的世界》和最近非常火的《纪念碑谷2》就是这样的风格。这款软件叫做M…

springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成

上一篇集成了ZuulGateway和Eureka并进行了测试。在实际场景中&#xff0c;我们肯定会有很多的微服务&#xff0c;而他们之间可能会存在相互调用的关系&#xff0c;那么&#xff0c;如何优雅的处理服务之间的调用问题呢&#xff1f;接下来就是我们要解决的。简单的说下FeignFeig…

Python中赋值,深拷贝和浅拷贝

1python变量 变量的存储&#xff0c;采用了引用语义的方式&#xff0c;存储的只是一个变量的值所在的内存地址&#xff0c;而不是这个变量的值本身。 2赋值 python变量赋值实际上是对象的引用。 如&#xff1a; list_a [1,2,3,"hello",["python",&qu…

excel进度条与百分比不符_Excel项目管理模板V2.0

Excel表哥公众号推送的第一篇文章 如何用Excel制作一个高逼格的项目管理模板 累积获得了超多的下载量。下面是和读者朋友的一些交流互动&#xff1a;在使用过程中大家陆续也反馈了一些问题和建议。因此我们推出了项目管理模板V2.0 升级版&#xff01;算作是给读者朋友们的一个答…

python 格式化输出%和format

1 %用法 1.1整数的输出 %o —— oct 八进制 %d —— dec 十进制 %x —— hex 十六进制 print(%o % 20) #24 print(%d % 20) #20 print(%x % 20) #141.2浮点数输出 %f ——默认保留小数点后面六位有效数字   %.3f&#xff0c;保留3位小数位 %e ——默认保留小数点后面六…