Job结束后,JobMaster没有及时GC掉, 导致JobManager OOM

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Job结束后,JobMaster没有及时GC掉, 导致JobManager OOM

jun su
hi all,
        为了触发该异常, 预设场景:
        1. jobmanager 分配1g内存
        2. 持续跑一个离线查询job, 特点是查询文件数较大(1w个parquet文件), *任务在1s内结束*

        如此跑到30-40次后, jm会oom异常退出, 此时dump出堆栈可以看92%的内存被
akka.actor.LightArrayRevolverScheduler$TaskQueue[512]占用,前30-40个TaskQueue中任然存在JobMaster,
由于文件数有1w个,所以每个JobMaster中的jobGraph和FileSplit对象也会较大,所以导致新的job无法构建导致oom

       而同样的jm内存配置 + 文件数, 如果任务运行的稍慢,比如运行10s才结束,
这时JM虽然也有高堆栈占用导致高GC的问题,但是不会出现OOM , 说明JobMaster在被垃圾回收.

       我的疑问是既然 JobMaster 已经在job执行完后 onStop 掉释放了资源, 为什么没被及时或者无法被回收,
从而导致JM的oom呢? JobMaster在job执行完后, 还会存留一段时间? 有些引用还未释放?
--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Job结束后,JobMaster没有及时GC掉, 导致JobManager OOM

jun su
hi all,

通过看源码发现了问题 :

短时间内提交大量Job后, JobManager进程会OOM的原因是这些Job所属的JobMaster没被及时的GC掉.

原因是JobMaster所属的SlotPoolImpl在启动时后会定期的检查有没有pending slot request, 如果发生了time
out的情况会做相应的cancel操作,
而这个周期任务的延迟是slot.idle.timeout和slot.request.timeout两个参数决定的,
所以在Job执行完毕后, 因为周期检查的线程还有一次在等待周期时间,
这导致SlotPoolImpl和JobMaster都在这个delay时间内GC不掉.

同时job包含大量文件数, 导致JobMaster中包含的ExecutionGraph和FileSplit等信息占用堆栈空间比较大, 最后导致OOM

通过调整slot.idle.timeout和slot.request.timeout两个参数来缩短delay的时间,
保证GC及时回收JobMaster, 就会避免OOM的发生

jun su <[hidden email]> 于2021年4月13日周二 下午3:18写道:

> hi all,
>         为了触发该异常, 预设场景:
>         1. jobmanager 分配1g内存
>         2. 持续跑一个离线查询job, 特点是查询文件数较大(1w个parquet文件), *任务在1s内结束*
>
>         如此跑到30-40次后, jm会oom异常退出, 此时dump出堆栈可以看92%的内存被
> akka.actor.LightArrayRevolverScheduler$TaskQueue[512]占用,前30-40个TaskQueue中任然存在JobMaster,
> 由于文件数有1w个,所以每个JobMaster中的jobGraph和FileSplit对象也会较大,所以导致新的job无法构建导致oom
>
>        而同样的jm内存配置 + 文件数, 如果任务运行的稍慢,比如运行10s才结束,
> 这时JM虽然也有高堆栈占用导致高GC的问题,但是不会出现OOM , 说明JobMaster在被垃圾回收.
>
>        我的疑问是既然 JobMaster 已经在job执行完后 onStop 掉释放了资源, 为什么没被及时或者无法被回收,
> 从而导致JM的oom呢? JobMaster在job执行完后, 还会存留一段时间? 有些引用还未释放?
> --
> Best,
> Jun Su
>


--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Job结束后,JobMaster没有及时GC掉, 导致JobManager OOM

jun su
hi all,

合理的话这里的ScheduledExecutor的delay参数是否可以和slot.request.timeout和idle.timeout两个参数分开配置?

public void start(
   @Nonnull JobMasterId jobMasterId,
   @Nonnull String newJobManagerAddress,
   @Nonnull ComponentMainThreadExecutor componentMainThreadExecutor)
throws Exception {

   this.jobMasterId = jobMasterId;
   this.jobManagerAddress = newJobManagerAddress;
   this.componentMainThreadExecutor = componentMainThreadExecutor;

   // 这里周期检查slot request timeout
   scheduleRunAsync(this::checkIdleSlot, idleSlotTimeout);
   scheduleRunAsync(this::checkBatchSlotTimeout, batchSlotTimeout);

   if (log.isDebugEnabled()) {
      scheduleRunAsync(this::scheduledLogStatus,
STATUS_LOG_INTERVAL_MS, TimeUnit.MILLISECONDS);
   }
}


jun su <[hidden email]> 于2021年4月15日周四 下午4:50写道:

> hi all,
>
> 通过看源码发现了问题 :
>
> 短时间内提交大量Job后, JobManager进程会OOM的原因是这些Job所属的JobMaster没被及时的GC掉.
>
> 原因是JobMaster所属的SlotPoolImpl在启动时后会定期的检查有没有pending slot request, 如果发生了time
> out的情况会做相应的cancel操作,
> 而这个周期任务的延迟是slot.idle.timeout和slot.request.timeout两个参数决定的,
> 所以在Job执行完毕后, 因为周期检查的线程还有一次在等待周期时间,
> 这导致SlotPoolImpl和JobMaster都在这个delay时间内GC不掉.
>
> 同时job包含大量文件数, 导致JobMaster中包含的ExecutionGraph和FileSplit等信息占用堆栈空间比较大, 最后导致OOM
>
> 通过调整slot.idle.timeout和slot.request.timeout两个参数来缩短delay的时间,
> 保证GC及时回收JobMaster, 就会避免OOM的发生
>
> jun su <[hidden email]> 于2021年4月13日周二 下午3:18写道:
>
>> hi all,
>>         为了触发该异常, 预设场景:
>>         1. jobmanager 分配1g内存
>>         2. 持续跑一个离线查询job, 特点是查询文件数较大(1w个parquet文件), *任务在1s内结束*
>>
>>         如此跑到30-40次后, jm会oom异常退出, 此时dump出堆栈可以看92%的内存被
>> akka.actor.LightArrayRevolverScheduler$TaskQueue[512]占用,前30-40个TaskQueue中任然存在JobMaster,
>> 由于文件数有1w个,所以每个JobMaster中的jobGraph和FileSplit对象也会较大,所以导致新的job无法构建导致oom
>>
>>        而同样的jm内存配置 + 文件数, 如果任务运行的稍慢,比如运行10s才结束,
>> 这时JM虽然也有高堆栈占用导致高GC的问题,但是不会出现OOM , 说明JobMaster在被垃圾回收.
>>
>>        我的疑问是既然 JobMaster 已经在job执行完后 onStop 掉释放了资源, 为什么没被及时或者无法被回收,
>> 从而导致JM的oom呢? JobMaster在job执行完后, 还会存留一段时间? 有些引用还未释放?
>> --
>> Best,
>> Jun Su
>>
>
>
> --
> Best,
> Jun Su
>


--
Best,
Jun Su