使用OpenMPI运行作业时如何分析不同rank进程的内核资源占用情况?
1. 现有工具的统计范围确认
你之前使用的mpiP、Scalasca均基于MPI标准的PMPI插桩接口实现,默认只能采集用户态视角的性能数据:包括MPI函数调用耗时、通信带宽/延迟、进程间通信拓扑、用户态计算耗时占比等,无法直接统计内核态的系统调用耗时、内核内存分配、磁盘I/O、网络栈处理开销这类内核侧活动数据。
2. 内核侧资源占用Profiling实现方案(适配Ubuntu 18.04 + OpenMPI环境)
以下方案均支持按rank维度拆分统计内核活动数据:
方案1:
perf系统工具(无额外依赖,适用大多数场景)
Ubuntu 18.04默认自带perf工具,可结合OpenMPI内置的rank环境变量为每个MPI进程单独绑定采集逻辑,命令模板如下:mpirun -np <进程数> bash -c 'perf record -e cpu-clock:k -e sched:* -e block:* -e vm:* -e net:* -o perf_rank_$OMPI_COMM_WORLD_RANK.data -- your_mpi_application'其中
$OMPI_COMM_WORLD_RANK是OpenMPI内置的环境变量,会自动赋值为当前进程的rank编号,无需额外配置即可生成分rank的采集文件。后续使用perf report -i perf_rank_xxx.data即可查看对应rank的内核态CPU耗时、内存缺页次数、块I/O读写量、网络栈处理开销等数据。方案2:
strace系统调用追踪(适合细粒度排查系统调用开销)
如果需要统计每个系统调用的具体耗时、参数和返回值,可使用strace绑定每个MPI进程采集,命令模板如下:mpirun -np <进程数> strace -T -tt -o strace_rank_$OMPI_COMM_WORLD_RANK.log your_mpi_application输出的日志可直接统计每个rank的read/write、mmap、sendto/recvfrom等内核调用的资源占用,适合定位I/O、内存分配、网络通信的内核侧瓶颈。
方案3:
bpftrace动态追踪(低开销,适合大压力测试场景)
Ubuntu 18.04可通过apt install bpftrace直接安装,基于eBPF实现,性能开销远低于perf和strace,可自定义脚本采集指定MPI进程的内核态资源使用数据,支持直接按rank编号聚合输出统计结果,无需后续手动拆分不同进程的采集数据。
注意事项
- 上述所有方案均支持单节点/跨节点MPI作业,跨节点场景下采集文件会生成在对应rank所在节点的本地目录,采集完成后汇总即可。
- 可根据你的分析需求调整采集的事件类型,不需要全量采集所有内核事件,避免不必要的性能开销。
内容的提问来源于stack exchange,提问作者Elephant88

