Mpi SLURM:如何在一个PE崩溃时禁用自动作业清理

Mpi SLURM:如何在一个PE崩溃时禁用自动作业清理,mpi,openmpi,slurm,Mpi,Openmpi,Slurm,我使用SLURM启动器srun分发基于OpenMPI的应用程序。当一个进程崩溃时,我想在另一个PEs中检测到这一点并执行一些操作。我知道OpenMPI没有容错能力,但我仍然需要在其他PE中执行优雅的退出 为此,每位PE必须能够: 在另一个PE崩溃的情况下继续运行 检测其中一个PEs崩溃 目前我正专注于第一项任务。根据手册。然而,它似乎对我不起作用。我看到以下日志消息: srun: error: node0: task 0: Aborted // this is where I crash

我使用SLURM启动器
srun
分发基于OpenMPI的应用程序。当一个进程崩溃时,我想在另一个PEs中检测到这一点并执行一些操作。我知道OpenMPI没有容错能力,但我仍然需要在其他PE中执行优雅的退出

为此,每位PE必须能够:

  • 在另一个PE崩溃的情况下继续运行
  • 检测其中一个PEs崩溃
  • 目前我正专注于第一项任务。根据手册。然而,它似乎对我不起作用。我看到以下日志消息:

    srun: error: node0: task 0: Aborted    // this is where I crash the PE deliberately
    slurmstepd: error: node0: [0] pmixp_client_v2.c:210 [_errhandler] mpi/pmix: ERROR: Error handler invoked: status = -25: Interrupted system call (4)
    srun: Jb step aborted: Waiting up to 32 seconds for job step to finish.
    slurmstepd: error: ***STEP 12123.0 ON node0 CANCELLED AT 2020-12-02 ***
    srun: error: node0: task 1: Killed    // WHY?!
    
    为什么会这样?是否有任何其他相关标志或环境变量,或任何可能有帮助的配置选项

    要重现问题,可以使用以下程序(为了简洁起见,它使用Boost.MPI,但在没有Boost的情况下也有相同的效果):

    #包括
    int main(){
    使用名称空间boost::mpi;
    环境环境;
    通信器通信;
    通信屏障();
    if(comm.rank()==0){
    掷0;
    }
    while(true){}
    }
    
    根据您链接的文档,
    --no kill
    标志仅影响节点故障时的行为


    在您的情况下,您应该使用
    --kill on bad exit=0
    选项,当其中一个任务以非零退出代码退出时,该选项将阻止其余任务被终止。

    也尝试了此选项-结果相同。顺便说一句,以非零代码退出不会使SLURM kill所有PE。撞车了。我无法重现你的行为。对我来说,slurm不会终止剩余的任务,但是任务在MPI_Finalize期间挂起。您使用的Slurm和OpenMPI版本是什么?
    srun--version
    :19.05.5<代码>mpirun--版本:4.0.2a1。(为了使PE崩溃,我抛出C++异常)。我添加了一个简单的复制器。
    #include <boost/mpi.hpp>
    
    int main() {
      using namespace boost::mpi;
      environment env;
      communicator comm;
      comm.barrier();
      if (comm.rank() == 0) {
        throw 0;
      }
      while (true) {}
    }