远程使用Intel VTune性能分析时,.sh脚本启动成功但目标应用未启动的问题咨询
结合你提供的脚本内容和VTune远程性能分析的常见问题,我整理了几个可能的原因和对应的排查思路:
VTune未追踪到MPI衍生的子进程
当你用VTune启动shell脚本时,它默认只会监控脚本这个父进程,但mpirun会衍生出大量子进程(你的命令是启动108个进程)。如果VTune的配置没有开启追踪所有子进程,它可能无法识别到main程序的启动,导致看起来“目标应用未正常启动”,但实际上进程可能已经在后台运行了。
排查:在VTune的启动配置里,找到“Advanced”选项,勾选“Trace child processes”;或者换用附加模式——先手动在远程节点上执行脚本启动main,再用VTune附加到对应的main进程上。远程环境的路径/环境变量与预期不符
VTune远程执行脚本时,加载的环境变量可能和你手动登录时不一样(比如不会自动加载~/.bashrc或~/.profile)。脚本里的MPIRUN路径、SRC_DIR/ROOT_DIR可能出现错误:- 比如
MPIRUN=/opt/intel/oneapi/mpi/latest/bin/,结尾多了斜杠,执行$MPIRUN/mpirun会变成/opt/intel/oneapi/mpi/latest/bin//mpirun,虽然多数系统能识别,但也可能导致问题; - 另外,VTune启动脚本时的工作目录可能不是你预期的脚本所在目录,导致
SRC_DIR=$(pwd)获取的路径错误,进而$SRC_DIR/main找不到可执行文件。
排查:在脚本开头添加source ~/.bashrc(如果你的MPI环境变量是在bashrc里配置的),或者在脚本里增加路径打印:
查看amplex-python的输出,确认这些路径是否正确。echo "MPIRUN path: $MPIRUN/mpirun" echo "Main path: $SRC_DIR/main" echo "Data path: $ROOT_DIR/data/ipcc_gauge_24_72"
- 比如
MPI启动参数或UCX配置存在问题
你的mpirun命令里指定了-host 1ibHost,3ibHost,需要确认:- 这两个主机名在远程节点上能正确解析(比如
ping 1ibHost是否能通); - VTune使用的远程用户是否有免密SSH登录这两个节点的权限;
UCX_TLS=ud_verbs,ud_mlx5的配置是否适配当前的网络设备——如果节点的MLX5网卡驱动未正确加载,或者UCX库版本不兼容,会导致mpirun无法正常启动main进程,但mpirun本身可能返回0的退出码,让脚本看起来执行成功。
排查:手动在远程节点上执行脚本里的mpirun命令,看是否能正常启动main;如果启动失败,查看MPI的错误日志(可以加--debug参数让mpirun输出更详细的日志)。
- 这两个主机名在远程节点上能正确解析(比如
脚本缺少错误检查,掩盖了启动失败
你的脚本里没有对mpirun的执行结果做校验,哪怕mpirun启动main失败,脚本也会正常退出,amplex-python只会显示“脚本启动成功”,而不会告诉你main没起来。
排查:修改脚本,增加错误检查逻辑:set -e # 让脚本在命令执行失败时立即退出 $MPIRUN/mpirun -n 108 -host 1ibHost,3ibHost -env UCX_TLS=ud_verbs,ud_mlx5 $SRC_DIR/main 0.005 $ROOT_DIR/data/ipcc_gauge_24_72 24 24 24 72 8 8 8 18 # 或者单独检查退出码 if [ $? -ne 0 ]; then echo "mpirun启动main失败,退出码: $?" exit 1 fi这样如果启动失败,amplex-python会看到脚本的错误输出,更容易定位问题。
远程节点的资源或权限限制
启动108个进程需要足够的CPU和内存资源,如果远程节点资源不足,main进程可能被OOM Killer杀掉;另外,VTune的远程用户是否有足够的权限在节点上启动这么多进程,或者是否有防火墙限制跨节点的MPI通信,也可能导致启动失败。
排查:查看远程节点的系统日志(比如/var/log/messages或dmesg),看是否有OOM Killer的记录;检查节点之间的防火墙规则,确保MPI通信的端口(默认是UCX使用的端口)是开放的。
内容的提问来源于stack exchange,提问作者TCJ




