SageMaker触发OSError: Cannot allocate memory却未终止主进程的原因?
多进程OOM报错未触发主进程终止的原因分析
多进程模块的默认异常传递逻辑
- Python
multiprocessing模块默认不会自动将子进程的异常抛给主进程。子进程触发的OOM错误默认仅终止触发错误的子进程本身,除非显式通过join()检查进程退出码、调用进程池异步任务的get()方法捕获异常,否则主进程无法感知子进程的崩溃原因,会判定子进程为正常退出。 - 若使用
multiprocessing.Pool的异步提交方法(apply_async、map_async等)且未主动调用返回结果的get()方法,子进程的所有异常都会被静默吞掉,完全不会向上传递。
Docker与SageMaker的OOM管控策略
- Docker默认OOM Killer的优先级策略是优先杀死内存占用最高的进程,而非直接终止整个容器的1号主进程。只要触发OOM的子进程内存占用高于主进程,OOM Killer只会清理该子进程,主进程和容器都会继续运行。
- SageMaker容器默认未开启「单进程OOM即终止整个容器」的配置,只要容器整体内存占用未超过实例分配的配额阈值,容器就不会被SageMaker资源管控组件强制终止,仅会将底层OOM事件记录到容器日志中。
根因定位方法
- 打印所有子进程的
exitcode:如果退出码为-9(SIGKILL),说明子进程是被OOM Killer直接终止,和多进程异常传递逻辑无关;如果退出码对应OSError错误编码,说明是子进程抛出的异常未被主进程捕获。 - 查看SageMaker实例监控指标和容器
dmesg日志:如果存在明确的Out of memory: Kill process记录,且被终止的进程ID为子进程ID,即可确认是OOM Killer的优先级策略导致主进程未被终止。
内容的提问来源于stack exchange,提问作者Roelant
相关产品推荐
相关产品推荐

