Spark垃圾回收调优:为何调低spark.memory.fraction可减少缓存内存
Spark GC调优参数选择逻辑说明
首先明确Spark 1.6+统一内存模型下两个参数的核心定义:
spark.memory.fraction:Executor堆内存扣除预留系统内存后,分配给「存储+执行」共享内存区域的占比,该值决定了存储内存可占用的最大总上限spark.memory.storageFraction:上述共享内存区域中,存储内存不可被执行内存抢占的下限占比,仅控制共享内存内部的资源调度边界,不改变共享内存的总大小
你提到的疑问核心是场景匹配问题,两个参数的适用场景完全不同:
若任务完成前触发多次Full GC、OldGen接近占满,本质原因是缓存的长期存活对象占用了过多老年代内存,仅调整共享内存内部的划分比例无法解决总内存占用过高的问题
举个实际例子:假设Executor堆内存为10G,预留系统内存1G,
spark.memory.fraction默认0.6,此时共享内存总大小为5.4G,若缓存实际占用5G且全部进入OldGen,会直接把老年代水位拉到接近满的状态。
此时如果仅调低spark.memory.storageFraction,只是降低了存储内存不可被抢占的下限,只要执行内存没有占用需求,存储内存依然可以用到最多5.4G,老年代的内存压力完全没有缓解。
只有调低spark.memory.fraction,比如降到0.4,共享内存总大小直接压缩到3.6G,哪怕全部给存储用,缓存最多也只能占3.6G,直接从根上降低了老年代的内存占用,自然就能减少Full GC的触发频率。
spark.memory.storageFraction的适用场景是:你不想缩小共享内存的总盘子,只是希望执行内存可以抢占更多存储内存,避免执行阶段因为内存不足触发频繁spill或者新生代GC,这种场景下调低该参数才会生效。
内容的提问来源于stack exchange,提问作者Thomson Dcruz
相关产品推荐
相关产品推荐

