通过共享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
相关产品推荐
相关产品推荐

