我们有一个集群用于为客户运行 MPI 作业。以前,这个集群使用 Torque 作为调度程序,但我们正在过渡到 Grid Engine 6.2u5(以获得其他一些功能)。不幸的是,我们在 Grid Engine 环境中复制一些维护脚本时遇到了麻烦。
在 Torque 中,我们有一个 prologue.parallel 脚本,用于对节点执行自动健康检查。如果此脚本返回失败条件,Torque 将帮助离线节点并重新排队作业以使用不同的节点组。
然而,在 Grid Engine 中,队列“prolog”仅在作业的头节点上运行。对于 mpi 并行环境,我们可以从 startmpi.sh 初始化脚本中手动运行我们的 prologue 脚本;但我不知道如何检测失败情况并执行相同的“标记为离线并重新排队”过程。
有什么建议么?
答案1
我不能说我试过,但至少如果 prolog 脚本返回 0、99 或 100 以外的值,队列就会处于错误状态。您可能可以在脚本中使用类似的策略start_proc_args
。
如果这不起作用,我不确定您是否可以通过 prolog 脚本实现您的要求。也许您可以使用健康检查 cron 作业(或使用您选择的监控系统)来执行检查,并在主机队列失败时禁用它们?
答案2
为了帮助其他人,以下是我们最终做的事情:
长期的健康检查不会干扰潜在的重叠作业(例如检查存储系统中的硬件问题),这些检查被转移到定期的 cron 作业上。(频率取决于。)
长期健康检查可能会干扰作业(内存性能检查),这些检查被转移到以“独占”模式提交给每个节点的 SGE 作业,该作业由 cron 每晚提交。如果失败,则该节点会在任何其他作业到达之前下线。
在运行作业之前对环境条件的检查(查找杂散进程、内存已满等)被放入从 pe 启动脚本 startmpi.sh 运行的脚本中。使用 pdsh 将命令提交给节点,并通过 STDOUT 返回输出代码。(不理想,但……)如果一个或多个节点发生故障,脚本会将它们脱机并运行
qmod -r $JOB_ID
以重新运行作业。(请注意,必须在其脚本中或默认情况下将作业指定为“可重新运行”。)这会强制在实际运行作业脚本之前重建节点列表。
我们目前正在努力在其中构建容错功能,但基本功能已确认可以正常工作。感谢@kamil-kisiel 和 synirc.net 上的 #gridengine 频道提供的建议。
答案3
为什么不创建一个在每个节点上运行的负载传感器,并根据测试内容设置一个复杂的负载传感器?
通过这种方法,您可以运行不依赖于例如互连的作业(如果您的互连网络发生故障)。