Intel MPI运行时错误信息诊断
笔者开发模式主要使用“Intel Fortran Compiler + Intel MPI”组合,在开发过程中经常遇到程序运行出错情况,如果了解Intel MPI输出的运行时错误信息,这对快速定位出错原因很有帮助。下面总结几种主要遇到的错误信息,内容主要来自于Intel官网Intel MPI Troubleshooting。
Bad File Descriptor
错误信息
运行报错信息类似于(关键词Bad file descriptor)
[mpiexec@node00] HYD_sock_write (../../../../../src/pm/i_hydra/libhydra/sock/hydra_sock_intel.c:353): write error (Bad file descriptor)
[mpiexec@node00] cmd_bcast_root (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:147): error sending cwd cmd to proxy
[mpiexec@node00] stdin_cb (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:324): unable to send response downstream
[mpiexec@node00] HYDI_dmx_poll_wait_for_event (../../../../../src/pm/i_hydra/libhydra/demux/hydra_demux_poll.c:79): callback returned error status
[mpiexec@node00] main (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:2064): error waiting for event
或者(关键词downstream from)
[mpiexec@host1] wait_proxies_to_terminate (../../../../../src/pm/i_hydra/mpiexec/intel/i_mpiexec.c:389): downstream from host host2 exited with status 255
可能原因
远程hydra_pmi_proxy
进程不可用,由于:
- 主机重启
- 收到异常信号
- 内存不够(out-of-memory, OOM)错误
- 作业调度器因资源限制(比如墙钟时间限制)终止了任务
解决思路
- 确定错误是否可重复
重新提交作业,确定错误是否可重复,如果是节点硬件问题,作业系统分配计算资源可能会分配到其它节点上,导致错误不可重现
怀疑内存不够原因导致的,可通过以下方法排查
- 可以请管理员查看系统日志确定作业报错原因、监控作业内存使用情况
- 节点核数设置不用满提交作业
- 提交到大内存作业节点
笔者使用的超算系统升级,新机器计算节点内存量配置降低了,导致模式在之前系统运行正常的移植到新机器报以上错误信息。
Bad Termination
错误信息1
=========================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= RANK 1 PID 27494 RUNNING AT node1
= KILLED BY SIGNAL: 11 (Segmentation fault)
=========================================================================
或者
=========================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= RANK 1 PID 27494 RUNNING AT node1
= KILLED BY SIGNAL: 8 (Floating point exception)
=========================================================================
可能原因
其中一个MPI进程被异常信号终止(比如上面的Segmentation fault或者Floating point exception)。
解决思路
这种错误不是MPI本身通信引起的,而是程序计算导致的,比如数组越界、除0等,需要排查这些错误。
错误信息2
=========================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= RANK 1 PID 20066 RUNNING AT node01
= KILLED BY SIGNAL: 9 (Killed)
=========================================================================
可能原因
其中一个MPI进程被异常信号(比如SIGTERM或者SIGKILL)终止,原因包括:
- 主机重启
- 收到异常信号
- 内存不够(out-of-memory, OOM)错误
- 作业调度器因资源限制(比如墙钟时间限制)终止了任务
被进程管理器杀掉(如果其它进程在当前进程之前终止了)
MPI应用挂起
MPI 应用程序挂起,没有任何输出。
可能原因1
应用没有正确使用MPI。
解决方法:增加-check-mpi
选项运行MPI程序执行正确性检查。
可能原因2
远程服务(比如SSH)没有在所有节点运行或者没配置正确。
解决方法:检查节点远程服务,尝试连接到所有节点。
可能原因3
Intel MPI库运行时脚本不可用
解决方法:检查共享路径是否在所有节点可用。
可能原因4
MPI应用跑在不同的CPU架构上。
解决方法:设置export I_MPI_PLATFORM=<arch>
,其中<arch>
指定为最旧的平台。混用多个CPU架构会影响应用性能,不建议这样使用。
一般定位方法
检查节点状态
$ mpiexec -ppn 1 -n 2 -hosts node01,node02 hostname
node01
node02
不过使用作业调度器不允许指定节点。
打开Intel MPI调试选项
设置环境变量,输出更多的Intel MPI运行诊断信息。
export I_MPI_DEBUG=6
export I_MPI_HYDRA_DEBUG=on
参考资料

