Performance 为什么Spark应用程序使用较低的MaxgClis运行速度慢得多?

Performance 为什么Spark应用程序使用较低的MaxgClis运行速度慢得多?,performance,apache-spark,garbage-collection,g1gc,Performance,Apache Spark,Garbage Collection,G1gc,我正在使用不同的G1配置测试Spark-1.5.1,并观察到我的应用程序需要2分钟才能完成,MaxGCPauseMillis=200(默认值),MaxGCPauseMillis=1需要4分钟。下面描述了堆的使用情况。从下面的统计数据可以看出,两种配置的GC时间相差仅5秒 我想知道为什么执行时间会增加这么多 一些统计数字: maxgcs=200-年轻GCs数量:67;执行者的GC时间:9.8秒 maxgcs=1-年轻GCs数量:224;执行者的GC时间:14.7秒 红色区域是年轻一代区域,黑色

我正在使用不同的G1配置测试Spark-1.5.1,并观察到我的应用程序需要2分钟才能完成,MaxGCPauseMillis=200(默认值),MaxGCPauseMillis=1需要4分钟。下面描述了堆的使用情况。从下面的统计数据可以看出,两种配置的GC时间相差仅5秒

我想知道为什么执行时间会增加这么多

一些统计数字:

maxgcs=200-年轻GCs数量:67;执行者的GC时间:9.8秒

maxgcs=1-年轻GCs数量:224;执行者的GC时间:14.7秒

红色区域是年轻一代区域,黑色区域是老一代区域。应用程序在10个节点上运行,每个节点有1个执行器和6 GB堆

该应用程序是一个字数计算示例:

val lines = sc.textFile(args(0), 1)

val words = lines.flatMap(l => SPACE.split(l))
val ones = words.map(w => (w,1))
val counts = ones.reduceByKey(_ + _)

//val output = counts.collect()
//output.foreach(t => println(t._1 + ": " + t._2))
counts.saveAsTextFile(args(1))

MaxGCPauseMillis
是对JVM的一个提示,由GC引起的总暂停时间不应超过指定的值(以毫秒为单位)。对于大多数生产级系统,建议值为
200
毫秒

任何较低的值都可能迫使GC运行的次数超过所需的次数,并会影响应用程序的总体吞吐量,这正是您的情况

当我们配置
maxgcpausemilis=200时,年轻GC的数量是
67
,当我们配置
maxgcpausemilis=1
时,年轻GC的数量几乎是4倍(
224


请参阅更详细的解释。

你的直觉是错误的。相反,理论上,在选择堆大小的情况下,吞吐量和延迟(在本例中由MaxGCPauseMillis暗示)具有相反的效果。因此,当您降低MAXGCLIS和延迟时,吞吐量也会下降。

您使用了哪种工具来显示它?