Ray驱动进程异常死亡时如何停止集群内运行中的任务
Ray 计算任务停止方案说明
一、主动停止运行中任务的通用方法
你提交任务后可以通过两种方式主动终止任务:
- 单任务/批量任务取消:调用Ray内置的
ray.cancel()接口即可终止指定任务,若需要强制终止已经在worker节点上运行的任务,需要额外添加force=True参数。参考适配你的代码的示例如下:# 取消所有已提交的compute任务 for ref in ray_res: ray.cancel(ref, force=True) - 全量任务终止:如果是通过 Ray Job API 提交的整套计算任务(Ray 2.0+ 推荐使用该方式提交生产任务),直接执行命令
ray job stop <你的job_id>即可一键终止该Job关联的所有任务、Actor资源,无需逐个取消。
二、驱动崩溃后自动终止worker节点任务的机制
这个能力Ray本身已经原生支持,无需额外开发复杂的worker节点规则:
- 默认行为:你提交的普通任务(没有在
@ray.remote装饰器中指定lifetime="detached"参数)默认和提交任务的驱动生命周期绑定,GCS(Ray的全局控制服务)会持续跟踪驱动的心跳状态。当驱动进程崩溃、终止导致心跳中断超过阈值后,GCS会自动向所有worker节点下发指令,杀掉该驱动提交的所有未标记为detached的运行中任务。 - 可配置参数:你可以在启动Ray head节点时调整心跳超时阈值,示例启动命令参数如下:
上述配置将驱动心跳超时时间设置为30秒,可根据自身业务需求调整参数值(单位为毫秒)。ray start --head --driver-keep-alive-timeout-ms=30000
注意事项
如果你的compute任务内部会启动不受Ray管理的子进程、或者调用第三方外部命令,默认的任务终止机制可能无法彻底清理这些孤儿进程。你可以在compute逻辑中添加SIGTERM信号监听,收到终止信号时先主动清理自己创建的子进程再退出。
内容的提问来源于stack exchange,提问作者Julias
相关产品推荐
相关产品推荐

