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

通过WSL在多节点运行mpirun遇阻塞问题求助

问题:WSL2跨主机运行MPI程序阻塞无输出

这是我在Stack Overflow的第一篇提问,若问题表述有疏漏请见谅。

目标

通过局域网连接的两台运行WSL2的Windows 10主机,联合算力运行OpenFOAM仿真。

约束

日常工作依赖Windows生态,无法切换至Linux;OpenFOAM需Linux环境。

环境

两台主机均为Windows10+WSL2,主机间无防火墙。

已完成配置

  • 在两台主机的WSL内配置了无密码SSH(自定义端口2222),通过端口转发命令实现正常连接:
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=2222 connectaddress=<WSL2 IP address>;
  • 配置了NFS,PC1为服务器,PC2为客户端,已转发443、2049端口,两台主机均完成2222、443、2049端口转发。
  • 在PC1的/home/user/下创建了权限为777、属主为nobody:nogroup的共享文件夹run,PC2已将其挂载至相同路径,文件同步正常。

测试情况

  • 将mpi_hello.c复制到共享文件夹,编译后本地运行mpirun -np 4 ./mpi_hello,输出正常,均为PC1的节点信息。
  • 创建hostfile.txt,内容为:
PC1 slots=4
PC2 slots=4

运行mpirun -np 8 --hostfile hostfile.txt ./mpi_hello时,程序无输出、无报错,仅阻塞,需按Ctrl+C退出;注释PC2后运行正常。

补充信息

通过sudo netstat -plnt发现mpirun使用15000-65000范围内的随机端口,已尝试转发该段所有端口,但问题仍未解决。

请问问题出在哪里?


排查与解决方向

1. 强制MPI绑定Windows局域网IP

WSL2采用NAT网络,MPI进程可能默认使用WSL内部IP通信,而非Windows主机的局域网IP。可以通过参数强制指定通信IP:

  • 运行mpirun时添加:--mca btl_tcp_if_include <Windows主机局域网IP>
  • 或修改MPI配置文件/etc/openmpi-mca-params.conf,添加btl_tcp_if_include = <Windows主机局域网IP>

2. 修正hostfile的主机解析

检查两台WSL内是否能正确解析hostfile里的PC1、PC2到对应Windows主机的局域网IP。如果解析失败,直接在hostfile中写入IP:

192.168.1.10 slots=4
192.168.1.11 slots=4

3. 统一两台WSL的用户UID/GID

虽然NFS路径一致,但用户UID/GID不匹配会导致MPI进程访问共享文件时出现隐性权限问题。用id命令查看两台WSL的用户UID,若不一致,修改/etc/passwd调整为相同值。

4. 确认端口转发规则有效性

运行netsh interface portproxy show all,检查2222、443、2049端口的转发规则是否正确指向对应WSL的内部IP,避免因规则失效导致通信中断。

5. 强制MPI使用TCP通信

OpenMPI默认会尝试多种通信方式(如共享内存),跨主机时需强制走TCP:
运行mpirun时添加参数:--mca btl ^vader,tcp(排除本地通信方式,仅用TCP)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:36:15