切换菜单
Apache jj游戏官方下载.基准测试:4.0与新的垃圾收集器ZGC和Shenandoah带来热量

Apache jj游戏官方下载. 绩效基准:4.0带有新的垃圾收集器ZGC和雪兰多的热量

Apache jj游戏官方下载. 4.0 Beta是第一个支持JDK 11和向后的版本。延迟是Apache jj游戏官方下载™用户的显而易见的担忧,大希望已经进入ZGC,在JDK 11中引入了新的低延迟垃圾收集器。它在JDK 14中达到了GA,这让我们渴望评估它的契合有多好的良好是Apache jj游戏官方下载集群。我们还想比较Apache jj游戏官方下载 3.11.6对4.0的性能,看看Shenandoah,RedHat的垃圾收集器是否应考虑用于生产使用。

在这篇文章中,我们将看到jj游戏官方下载 4.0自行带来强大的性能改进,通过新的垃圾收集器的可用性大规模放大:ZGC,特别是雪兰岛。

基准方法

使用以下基准进行使用 tlp-cluster. 用于在AWS和使用中配置和配置Apache jj游戏官方下载集群 TLP-RELUGR. 用于负载生成和度量收集。所有使用的工具都可用作开源和基准,对于使用AWS帐户的任何人都很容易再现。

群集由3个节点组成,使用R3.2xlarge实例和使用C3.2xlarge实例的单个应力节点组成。

默认设置用于Apache jj游戏官方下载,但GC和Heap除外。

使用最新版本完成群集配置和配置 tlp-cluster.。我们最近添加了一些帮助程序脚本来自动创建群集创建以及收割机和MEDUSA的安装。

安装和配置TLP群集后 文件,您将能够重新创建我们用于运行基准的集群:

# 3.11.6 CMS JDK8
build_cluster.sh -n CMS_3-11-6_jdk8 -v 3.11.6 --heap=16 --gc=CMS -s 1 -i r3.2xlarge --jdk=8 --cores=8

# 3.11.6 G1 JDK8
build_cluster.sh -n G1_3-11-6_jdk8 -v 3.11.6 --heap=31 --gc=G1 -s 1 -i r3.2xlarge --jdk=8 --cores=8

# 4.0 CMS JDK11
build_cluster.sh -n CMS_4-0_jdk11 -v 4.0~alpha4 --heap=16 --gc=CMS -s 1 -i r3.2xlarge --jdk=11 --cores=8

# 4.0 G1 JDK14
build_cluster.sh -n G1_4-0_jdk14 -v 4.0~alpha4 --heap=31 --gc=G1 -s 1 -i r3.2xlarge --jdk=14 --cores=8

# 4.0 ZGC JDK11
build_cluster.sh -n ZGC_4-0_jdk11 -v 4.0~alpha4 --heap=31 --gc=ZGC -s 1 -i r3.2xlarge --jdk=11 --cores=8

# 4.0 ZGC JDK14
build_cluster.sh -n ZGC_4-0_jdk14 -v 4.0~alpha4 --heap=31 --gc=ZGC -s 1 -i r3.2xlarge --jdk=14 --cores=8

# 4.0 Shenandoah JDK11
build_cluster.sh -n Shenandoah_4-0_jdk11 -v 4.0~alpha4 --heap=31 --gc=Shenandoah -s 1 -i r3.2xlarge --jdk=11

笔记:为了在类似条件下进行所有基准,在整个测试中使用单一的EC2实例。

从jj游戏官方下载 3.11.6到jj游戏官方下载 4.0〜alpha4的升级已执行,并且在适当使用以下脚本时切换jdks:

#!/usr/bin/env bash

OLD=$1
NEW=$2
curl -sL //github.com/shyiko/jabba/raw/master/install.sh | bash
. ~/.jabba/jabba.sh
jabba. uninstall $OLD
jabba. install $NEW
jabba. alias default $NEW
sudo update-alternatives --install /usr/bin/java java ${JAVA_HOME%*/}/bin/java 20000
sudo update-alternatives --install /usr/bin/javac javac ${JAVA_HOME%*/}/bin/javac 20000

调用时使用以下JDK值 jabba.:

  • OpenJDK@1.11.0-2
  • OpenJDK@1.14.0
  • OpenJDK-Shenandoah@1.8.0.
  • OpenJdk-shenandoah@1.11.0

使用Ubuntu安装OpenJDK 8。

Here are the java -version outputs for the different JDKs that were used during the benchmarks:

jdk8
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

JDK8与Shenandoah.
openjdk version "1.8.0-builds.shipilev.net-openjdk-shenandoah-jdk8-b712-20200629"
OpenJDK Runtime Environment (build 1.8.0-builds.shipilev.net-openjdk-shenandoah-jdk8-b712-20200629-b712)
OpenJDK 64-Bit Server VM (build 25.71-b712, mixed mode)

jdk11
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

JDK11与雪兰多
openjdk version "11.0.8-testing" 2020-07-14
OpenJDK Runtime Environment (build 11.0.8-testing+0-builds.shipilev.net-openjdk-shenandoah-jdk11-b277-20200624)
OpenJDK 64-Bit Server VM (build 11.0.8-testing+0-builds.shipilev.net-openjdk-shenandoah-jdk11-b277-20200624, mixed mode)

jdk14
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)

CMS.

CMS. (并发标记扫描)是Apache jj游戏官方下载中当前的默认垃圾收集器。它从JDK 14中删除,因此所有测试都用JDK 8或11进行。

以下设置用于CMS基准:

-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSEdenChunksRecordAlways
-XX:+CMSClassUnloadingEnabled
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=8
-Xms16G
-Xmx16G
-Xmn8G

笔记 that the -XX:+UseParNewGC flag was removed from JDK 11 and is then implicit. Using this flag would prevent the JVM from starting up.

我们将在16GB的最大堆中保留CMS,否则它可能会在主要集合中导致很长的暂停。

G1

G1GC(垃圾 - 首先垃圾收集器)比CMS更容易配置,因为它动态调整了年轻一代的大小,但用大堆来提供更好的(>= 24GB)。这解释了为什么它尚未被推广为默认的垃圾收集器。它还显示出更高的延迟而不是调谐的CMS,但提供更好的吞吐量。

以下设置用于G1基准:

-XX:+UseG1GC
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:MaxGCPauseMillis=300
-XX:InitiatingHeapOccupancyPercent=70
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=8
-Xms31G
-Xmx31G

对于4.0基准测试,在运行G1测试时使用了JDK 14。我们正在使用31GB的堆大小来从压缩普通对象指针(oops)中受益,并且具有最小的堆大小的可寻址对象数。

ZGC.

ZGC.(Z垃圾收集器)是来自JDK的最新GC,其侧重于提供短于10ms的停止 - 世界暂停的低延迟。它也支持保证堆大小对暂停时间没有影响,允许它扩展到16TB的堆。如果满足这些期望,它可以删除使用垃圾存储的需要,并简化一些开发方面Apache jj游戏官方下载。

以下设置用于ZGC基准:

-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC
-XX:ConcGCThreads=8
-XX:ParallelGCThreads=8
-XX:+UseTransparentHugePages
-verbose:gc
-Xms31G
-Xmx31G

We needed to use the -XX:+UseTransparentHugePages as a workaround to avoid enabling large pages on Linux. While the ZGC.官方文档 它可能(可能)生成延迟尖峰,结果似乎没有显示出这样的行为。可以使用大页面运行吞吐量测试,以查看它如何影响结果。

请注意,ZGC不能使用压缩掉压缩零,并且不受“32GB阈值”的影响。我们使用31GB堆使用与G1相同的大小并允许系统具有相同数量的免费RAM。

雪兰多

雪兰多是Redhat开发的低延迟垃圾收集器。它在JDK 8和11中作为Backport可用,是OpenJDK从Java 13开始的主线构建的一部分。如ZGC,Shenandoah是一个主要的并发垃圾收集器,旨在使暂停时间与堆大小成比例。

雪兰多基准的以下设置:

-XX:+UnlockExperimentalVMOptions
-XX:+UseShenandoahGC
-XX:ConcGCThreads=8
-XX:ParallelGCThreads=8
-XX:+UseTransparentHugePages
-Xms31G
-Xmx31G

雪兰多应该能够使用压缩oops,从而有益于32GB的堆。

卡桑德拉 4.0 JVM配置

卡桑德拉 4.0版带有单独的jvm.options文件的船只,用于Java 8和Java 11.这些是文件:

  • conf / jvm-server.options
  • conf / jvm8-server.options
  • conf / jvm11-server.options

Upgrading to version 4.0 will work with an existing jvm.options file from version 3.11, so long as it is renamed to jvm-server.options and the jvm8-server.options and jvm11-server.options files are removed. This is not the recommended approach. The recommended approach is to re-apply the settings found in the previous jvm.options file to the new jvm-server.options and jvm8-server.options files. The Java specific option files are mostly related to the garbage collection flags. Once these two files are updated and in place, it then becomes easier to configure the jvm11-server.options file, and simpler to switch from JDK 8 to JDK 11.

工作量

使用速率限制运行的8个线程完成基准,80%写入/ 20%读取。 TLP-RENGREL广泛使用异步查询,这可以容易地通过有限数量的应力线程来容易地压倒CASSANDRA节点。一次性地进行负载测试,每个线程一次发送50并发查询。 keyspace是用复制因子创建的,并且在一致性级别_one处执行所有查询。

所有垃圾收集器和jj游戏官方下载版本都经过25k,40k,45k和50k操作每秒,以评估它们在不同水平的压力下进行性能。

使用以下TLP-Rentry命令:

TLP-RELUGR. run BasicTimeSeries -d 30m -p 100M -c 50 --pg sequence -t 8 -r 0.2 --rate <desired rate> --populate 200000

所有工作负载运行30分钟,每个节点加载大约5到16 GB的数据,并允许合理的压缩负载。

笔记:此测试的目的不是评估jj游戏官方下载的最大性能,可以以多种方式调整各种工作负载。它也不是要微调垃圾收集器,这些收集器都暴露了许多旋钮来提高他们对特定工作负载的性能。这些基准测试企图在jj游戏官方下载生成相同的负载时,使用大多数默认设置提供各种垃圾收集器的公平比较。

基准结果

读
3.11.6 25K-40K OPS / s

读
4.0 25K-40K OPS / s

读
4.0 45K-50K OPS / s

吞吐量 25k ops / s 40k ops / s 45k ops / s 50k ops / s 55k ops / s
CMS. 3.11.6 JDK8 24,222.80 38,519.94 40,722.02    
G1 C * 3.11.6 JDK8 24,222.61 38,736.61.      
雪兰多 C * 3.11.6 JDK8 24,211.57 35,778.40.      
ZGC. JDK11 24,222.72 38,674.99. 41,557.88.    
ZGC. JDK14 24,222.80 38,519.94 40,722.02    
雪兰多JDK11 24,222.61 38,736.61. 43,649.18 48,438.28. 49,689.06.
CMS. JDK11 24,211.57 35,778.40. 43,385.94 47,901.46. 51,512.48
G1 JDK11 24,220.08 38,730.57 43,603.88. 47,590.90.  
G1 JDK14 24,211.71. 38,721.09. 43,561.66. 48,030.46. 50,833.91.

吞吐量明智,jj游戏官方下载 3.11.6在41k ops / s最大化时,jj游戏官方下载 4.0最多可达51k ops / s,这是一个很好的 25% 由于升级,在两种情况下使用CMS,改善。 4.0中有许多性能改进,解释了这些结果,特别是对压实引起的堆压力(检查 卡桑德拉-14654. for example).

卡桑德拉的JDK8中的Shenandoah 3.11.6在40K OPS / S负载测试中提供最大吞吐量,并开始以此速率显示失败的请求。使用JDK11和jj游戏官方下载 4.0表现得更好。它现在可以与CMS匹配的吞吐量,最大值为49.6K OPS / s。 G1和Shenandoah都是JDK 8的36K OPS / S总共有311.11.6。

G1似乎在JDK14中得到了改善,并击败了JDK11,从47k / s的改善较小至50k / s。

zgc在提供吞吐量符合其竞争对手的吞吐量,最多为41k ops / s。

写平均p99. 25k ops / s 40k ops / s 45k ops / s 50k ops / s
CMS. JDK8 3.11.6. 14.74 25.24    
G1 JDK8 3.11.6 28.84 83.03    
谢南乔·克8.11.6.6 8.65 66.13    
ZGC. JDK11 4.21 35.67    
ZGC. JDK14 2.45 14.87    
雪兰多JDK11 2.72 9.13 18.48 30.60
CMS. JDK11 12.25 22.35 26.64 34.58
G1 JDK11 27.15 29.70 35.34 52.71
G1 JDK14 15.24 23.76 27.16 32.71

写平均p99.

阅读平均p99. 25k ops / s 40k ops / s 45k ops / s 50k ops / s
CMS. JDK8 3.11.6. 17.01 24.18    
G1 JDK8 3.11.6 25.21 66.48    
谢南乔·克8.11.6.6 9.16 49.64    
ZGC. JDK11 4.12 32.70    
ZGC. JDK14 2.81 14.83    
雪兰多JDK11 2.64 9.28 17.37 28.10
CMS. JDK11 11.54 20.15 24.87 31.53
G1 JDK11 19.77 26.35 48.38 42.41
G1 JDK14 12.51 22.36 25.20 39.38

阅读平均p99.

最大p99 25k ops / s 40k ops / s 45k ops / s 50k ops / s
CMS. JDK8 3.11.6. 600.11 47.92    
G1 JDK8 3.11.6 294.05 314.16    
谢南乔·克8.11.6.6 29.88 421.35    
ZGC. JDK11 23.38 65.34    
ZGC. JDK14 16.98 36.78    
雪兰多JDK11 29.10 29.76 45.33 61.46
CMS. JDK11 28.61 41.55 43.67 55.59
G1 JDK11 327.99 315.34 343.19 344.55
G1 JDK14 324.14 302.98 362.74 422.94

最大p99

在jj游戏官方下载 3.11.6的中等负荷下,雪兰多在JDK8下提供了一些非常令人印象深刻的延迟,但在压力下,性能严重降低。使用CMS,jj游戏官方下载 4.0管理,以保持11ms和31毫秒之间的平均P99,最多可容纳50k OPS / s。在jj游戏官方下载 3.11.6至11.5ms的中等负荷下的平均读数P99下降到jj游戏官方下载 4.0中的17毫秒,这给了我们一个 30% improvement.

卡桑德拉 4.0吞吐量和延迟的提高25%至30%,使用相同的垃圾收集器轻松击败jj游戏官方下载 3.11.6。在jj游戏官方下载 3.11.6的中等负荷下,在中等负荷下的低延迟的呼声荣耀,但压力下的行为使我们担心其处理尖峰负荷的能力。

虽然ZGC在适度负载下提供一些令人印象深刻的延迟,但特别是与JDK14相比,它不会以更高的速度保持更高的速度。读取和写入的平均P99延迟是Shenandoah几乎所有负载测试中最低的。这些延迟与其在jj游戏官方下载 4.0中实现的吞吐量相结合,使其成为升级时非常有趣的GC。在适度负荷下平均P99读取延迟为2.64ms,非常令人印象深刻!更加了解这些客户的记录。

G1大多数相匹配其配置的最大暂停时间为300ms,在MAX P99时,但使用较低的目标暂停可能在高负载下具有不良影响,并且触发更长的暂停。

在适度的负荷下,雪兰岛设法降低平均P99延迟 77%,高低2.64毫秒。这将是潜伏敏感用例的重大改进。与jj游戏官方下载 3.11.6中的CMS相比,这是一个渴望 85% P99读取的延迟减少!在JDK14中向ZGC提到ZGC的尊重,在中等负荷下提供了一些很好的表现,但可悲的是无法跟上更高的速率。我们乐观地说,即将在未来几个月内将得到改善,最终可能会与雪兰岛竞争。

最后的想法

G1通过以牺牲某种性能的牺牲牺牲更新的曲调产生大小来提高jj游戏官方下载的可用性。 Apache jj游戏官方下载 4.0的释放,它是令人印象深刻的提升,将允许使用新一代垃圾收集器,如Shenandoah或ZGC,这既简单则用最小的调谐,更高效地实现。

雪兰多难以推荐jj游戏官方下载 3.11.6,因为节点在高负荷开始行为不端,但从JDK11和jj游戏官方下载 4.0开始,这个垃圾收集器在延迟中提供了惊人的改进,而几乎可以从数据库中获得最大吞吐量。

您的里程可能会有所不同,因为这些基准专注于特定工作量,但结果使我们在Apache jj游戏官方下载未来进行了相当乐观的态度,因为延迟敏感用例,因此通过jj游戏官方下载 3.11.6目前提供的强大改进。

下载最新的Apache 4 Build并尝试尝试。如果您有任何反馈,请告诉我们 社区邮件列表或ASF松弛.

标记

Apache jj游戏官方下载.™

开源,缩放,云原生NoSQL数据库

DataStax是在Apache jj游戏官方下载构建的扩展NoSQL。™在全球范围内处理带有零停机和零锁定的任何工作负载。

Get started for free
阿斯塔产品屏幕