2

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

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

一些统计数据:

MaxGCPauseMillis = 200 - 年轻 GC 数:67;一个executor的GC时间:9.8秒

MaxGCPauseMillis = 200 MaxGCPauseMillis = 1 - 年轻 GC 数:224;一个executor的GC时间:14.7秒

MaxGCPauseMillis = 1 红色区域是年轻一代,黑色是老一代。该应用程序在 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))
4

2 回答 2

3

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

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

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

有关更详细的说明,请参阅此处

于 2016-02-09T08:05:13.103 回答
0

你的直觉是错误的。相反,理论上,选择堆大小后,吞吐量和延迟(在这种情况下由 MaxGCPauseMillis 暗示)会产生反作用。因此,当您降低 MaxGCPauseMillis 并因此降低延迟时,您的吞吐量也会下降。

于 2016-02-12T01:31:51.383 回答