通过WSL在多节点运行mpirun遇阻塞问题求助
这是我在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

