【发布时间】:2022-11-05 10:05:10
【问题描述】:
我在 stackoverflow 上的第一篇文章,请原谅我面临的问题。
目标:通过局域网连接的两台运行 WSL2 的 windows PC 的计算能力来运行 OpenFOAM 模拟。
限制:日常工作流程依赖于 Windows 生态系统,因此无法切换到 linux。 OpenFOAM 需要Linux 环境。
软件:两台 PC 都运行 Windows 10,上面有 WSL2。两台 PC 之间没有可用的防火墙。
我在两台 PC(在 WSL 内)上都设置了无密码 SSH(自定义端口 2222)并且连接正常。但是为了让它工作,我必须使用下面的命令来使用端口转发,如此处所述WSL Networking。
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=2222 connectaddress=<WSL2 IP address>;
我还设置了 NFS,PC1 作为服务器,PC2 作为客户端。为了让它工作,我必须转发端口 443 和 2049。因此,两台 PC 上总共转发了三个端口 2222、443 和 2049 端口。
我在 /home/user/ 下的 PC1 上创建了一个名为“run”的通用文件夹,nobody:nogroup 和权限设置为 777。我在 PC2 上的同一位置 (/home/user/) 安装了相同的文件夹。一切正常,文件同步。
为了测试 mpirun 是否正常工作,我将 mpi_hello.c 文件复制到 PC1 上的文件夹中,编译并使用以下命令运行它。
mpicc mpi_hello.c -o mpi_hello
mpirun -np 4 ./mpi_hello
输出为
Hello from PC1, rank 0 (of 4).
Hello from PC1, rank 1 (of 4).
Hello from PC1, rank 2 (of 4).
Hello from PC1, rank 3 (of 4).
然后我用以下数据创建了一个 hostfile.txt 文件
PC1 slots=4
PC2 slots=4
然后运行以下命令
mpirun -np 8 --hostfile hostfile.txt ./mpi_hello
这没有给出任何输出或抛出错误。它只是挂起,我需要按 Ctrl+C 退出。当我在 hostfile.txt 中注释掉 PC2 时,一切正常。 我哪里错了?
编辑:
我使用命令sudo netstat -plnt检查了mpirun正在访问哪些端口,发现它使用了一些从15000到65000的随机端口。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:36767 0.0.0.0:* LISTEN 1016/rpc.mountd
tcp 0 0 0.0.0.0:54495 0.0.0.0:* LISTEN 1016/rpc.mountd
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:45607 0.0.0.0:* LISTEN 5085/mpirun
tcp 0 0 0.0.0.0:38761 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:59787 0.0.0.0:* LISTEN 5085/mpirun
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 520/sshd: /usr/sbin
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 965/rpcbind
tcp 0 0 0.0.0.0:48563 0.0.0.0:* LISTEN 1016/rpc.mountd
tcp6 0 0 :::44695 :::* LISTEN 1016/rpc.mountd
tcp6 0 0 :::39231 :::* LISTEN -
tcp6 0 0 :::2049 :::* LISTEN -
tcp6 0 0 :::60333 :::* LISTEN 1016/rpc.mountd
tcp6 0 0 :::2222 :::* LISTEN 520/sshd: /usr/sbin
tcp6 0 0 :::111 :::* LISTEN 965/rpcbind
tcp6 0 0 :::34195 :::* LISTEN 1016/rpc.mountd
因此,我尝试在两台 PC 上将所有端口从 15000 转发到 65000,并检查 mpirun 是否正常工作,但没有成功。
【问题讨论】:
-
尽管(通常)需要 SSH 才能在远程节点上启动 MPI 服务器/帮助程序,但这(通常)不是唯一需要的 TCP/IP 套接字。例如,Open MPI 需要额外的套接字对来进行 OoB 管理(例如
mpirun到orted又名 MPI 服务器),还需要用于btl/tcp(例如进程到进程通信)。我不明白您为什么需要端口转发(IIRC,来自 PC1,ssh -p 2222 localhost最终会出现在 PC2 上)但这表明您的网络连接有问题(防火墙?路由?虚拟机?) -
谢谢@GillesGouaillardet 的回复。我需要启用端口转发,因为 WSL 2 有一个具有自己唯一 IP 地址的虚拟化以太网适配器。我在没有端口转发的情况下尝试过,但是 SSH 和 nfs 都不起作用。然后我参考了微软的文档并进行了端口转发。 link 我还尝试将所有端口从 15000 转发到 65000 并检查 mpirun 是否工作,但它没有工作。
-
我使用命令
sudo netstat -plnt检查了 mpirun 正在访问哪些端口,发现它使用了一些从 15000 到 65000 的随机端口。所以我尝试在两台 PC 上转发从 15000 到 65000 的所有端口,并检查 mpirun 是否正常工作但仍然它没有用。 -
这可能还不够……一种选择是让 WSL 使用桥接网络(甚至不确定这是否可能/受支持)。另一种选择是在您的 WSL 实例之间设置一个 VPN,并让 MPI 使用它。
-
我相信 WSL1 使用桥接网络。但是我无法在 WSL1 上安装 nfs-server,这是确保公共目录在两个 WSL 实例上都可用所必需的。我尝试桥接 WSL2 适配器和本地网络适配器,但我完全失去了网络连接。我想知道如何在 2 个单独的 PC 上运行的 2 个 WSL 实例之间设置 VPN。也想知道问题的根本原因是什么。
标签: mpi windows-subsystem-for-linux openmpi wsl-2