R 并行集群工作进程从不 returns

R parallel cluster worker process never returns

我正在使用 doParallel 包通过以下语法在多台 Linux 机器上并行化作业:

cl <- makePSOCKcluster(machines, outfile = '', master = system('hostname -i', intern = T))

通常,在一台机器上 运行 每个作业只需不到 10 分钟。然而,有时会有一个工作进程 'run away' 并保持 运行ning 数小时并且永远不会返回到主驱动程序进程。我可以使用 top 看到进程 运行ning,但似乎进程以某种方式卡住了,而不是真正的 运行ning。 outfile='' 选项不会产生任何有用的东西,因为工作进程从未真正失败过。

这种情况发生得相当频繁,但非常随机。有时我可以重新开始工作,它们会很好地完成。因此,我无法提供可重现的示例。有人对如何调查此问题有一般性建议吗?或者将来再次发生这种情况时要寻找什么?

编辑:

添加更多详细信息以回应评论。我 运行 在 10 台机器上进行了数千次小型模拟。 IO 和内存使用量都很少。我注意到工作进程 运行 随机地在不同的机器上运行,没有任何模式,不一定是最繁忙的机器。我没有查看系统日志的权限,但根据 CPU/RAM 历史记录,似乎没有任何异常。

它发生的频率足够高,因此很容易捕捉到正在运行的 运行-away 进程。 top 会显示进程 运行 接近 100% CPU,状态为 R,因此肯定是 运行ning 而不是等待。但我也很确定每次模拟只需要几分钟,而且 运行-away worker 不知何故让 运行ning 不停。

到目前为止 doParallel 是我唯一尝试过的软件包。我正在探索其他选择,但在不知道原因的情况下很难做出明智的决定。

这种问题在大型计算集群上并不少见。虽然挂起的工作进程可能不会产生任何错误消息,但您应该检查执行工作进程的节点上的系统日志,看看是否报告了任何系统问题。可能存在磁盘或内存错误,或者系统可能 运行 内存不足。如果某个节点有问题,您的问题可以通过不使用该节点来解决。

这是批量排队系统有用的原因之一。花费太长时间的作业可以被终止并自动重新提交。不幸的是,它们经常在同一个坏节点上重新运行作业,因此检测坏节点并防止调度程序将它们用于后续作业非常重要。

您可能要考虑为您的程序添加检查点功能。不幸的是,这通常很困难,使用 doParallel 后端尤其困难,因为 parallel 包中没有检查点功能。您可能想调查 doRedis 后端,因为我相信作者有兴趣支持某些容错功能。

最后,如果您真的在行动中抓到一个挂起的工人,您应该使用 "ps" 或 "top" 获得尽可能多的相关信息。进程状态很重要,因为它可以帮助您确定进程是否在尝试执行 I/O 时卡住。更好的是,您可以尝试将 gdb 附加到它并获得回溯以确定它实际在做什么。