You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过共享NFS存储在SLURM集群运行MPI任务的问题排查

问题描述

我已经在管理节点node0搭建了NFS共享存储,并将其挂载至计算节点node1至node3,该存储用作SLURM作业的临时存储区,同时用于安装共享程序(如在node0编译安装的MPICH 3.2)。发现当MPI作业以node0为主节点时可正常执行,但以其他节点(如node2)为主节点时无法运行,如何解决该问题以释放管理节点?

错误输出

srun: error: timeout waiting for task launch, started 1 of 2 tasks
srun: Job step 4118.0 aborted before step completely launched.
srun: Job step aborted: Waiting up to 32 seconds for job step to finish.
slurmstepd: *** STEP 4118.0 ON node2 CANCELLED AT 2018-05-21T20:24:29 ***
srun: error: node2: task 0: Killed
[mpiexec@node2] control_cb (pm/pmiserv/pmiserv_cb.c:208): assert (!closed) failed
[mpiexec@node2] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[mpiexec@node2] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:198): error waiting for event
[mpiexec@node2] main (ui/mpich/mpiexec.c:340): process manager
解决方案

结合你的集群架构(NFS共享MPICH+SLURM)和错误日志,这个问题大概率是权限、环境变量或节点间通信配置不一致导致的,下面是一步步的排查和解决方法:

1. 修复NFS挂载的权限配置

这是最常见的触发原因:NFS默认的root_squash会把远程节点的root用户映射成nobody,导致计算节点作为MPI主节点时,无法访问共享存储上的MPICH程序或临时作业文件。

  • 登录到任意计算节点(比如node2),查看当前NFS挂载选项:
    mount | grep node0:/path/to/your/nfs
    
  • 如果输出里没有no_root_squash,修改计算节点的/etc/fstab,更新NFS挂载行:
    node0:/path/to/your/nfs /local/mount/point nfs defaults,no_root_squash 0 0
    
  • 重新挂载NFS生效:
    sudo mount -a
    

2. 确保所有节点的MPI环境变量完全一致

MPICH的运行依赖正确的环境变量,必须在所有节点(包括node0和node1-node3)上同步配置:

  • 在NFS共享目录下创建一个环境变量配置文件,比如/path/to/nfs/mpich_env.sh,内容如下:
    export PATH="/path/to/nfs/mpich/bin:$PATH"
    export LD_LIBRARY_PATH="/path/to/nfs/mpich/lib:$LD_LIBRARY_PATH"
    export MPI_HOME="/path/to/nfs/mpich"
    
  • 在所有节点的/etc/profile.d/目录下创建软链接,确保每个节点登录时都会加载这个配置:
    sudo ln -s /path/to/nfs/mpich_env.sh /etc/profile.d/mpich_env.sh
    
  • 登录到node2,验证环境变量是否生效:
    which mpirun  # 应该输出NFS共享路径下的mpirun
    ldd $(which mpirun)  # 确保所有依赖库都能正常找到
    

3. 检查SLURM的MPI支持配置

SLURM需要正确配置才能让MPI作业在计算节点上顺利启动:

  • 编辑管理节点的/etc/slurm/slurm.conf,确保以下配置项正确:
    ProctrackType=proctrack/cgroup  # 推荐的进程追踪方式,避免进程丢失
    TaskPlugin=task/affinity        # 支持CPU亲和性,优化进程调度
    MpiDefault=pmix                 # 启用PMIX作为MPI通信中间件,完美兼容MPICH
    
  • 重启SLURM服务使配置生效:
    # 管理节点重启控制服务
    sudo systemctl restart slurmctld
    # 所有计算节点重启节点服务
    sudo systemctl restart slurmd
    

4. 验证节点间的SSH信任关系

MPICH的进程间通信可能依赖节点间的无密码SSH,即使SLURM已经配置了内部通信机制:

  • 切换到SLURM作业运行的用户(比如你的个人用户或slurm系统用户),在node2上生成SSH密钥:
    ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
    
  • 把公钥复制到所有其他节点(node0、node1、node3):
    ssh-copy-id node0
    ssh-copy-id node1
    ssh-copy-id node3
    
  • 测试SSH连接:在node2上执行ssh node1,确认不需要输入密码就能直接登录。

5. 用最简MPI程序验证修复效果

最后,用一个简单的Hello World程序测试,排除作业本身的问题:

  • 在NFS共享目录下创建hello.c:
    #include <mpi.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main(int argc, char** argv) {
        MPI_Init(&argc, &argv);
        int rank, size;
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        char hostname[256];
        gethostname(hostname, sizeof(hostname));
        printf("Hello from rank %d/%d on %s\n", rank, size, hostname);
        MPI_Finalize();
        return 0;
    }
    
  • 编译程序:
    mpicc hello.c -o hello
    
  • 指定node2为主节点提交SLURM作业:
    srun --nodes=2 --nodelist=node2,node1 ./hello
    

如果能正常输出两个节点的Hello信息,说明问题已经解决。

内容的提问来源于stack exchange,提问作者ajthealchemist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:29:28