1

我浏览了很多例子,但我仍然感到困惑。我从这里编译了一个简单的延迟检查程序,它可以在一台主机上完美运行,但是当我尝试在两台主机上运行它时它会挂起。但是,运行类似的东西hostname运行良好:

[hamiltont@4 latency]$ mpirun --report-bindings --hostfile hostfile --rankfile rankfile -np 2 hostname
[4:16622] [[5908,0],0] odls:default:fork binding child [[5908,1],0] to slot_list 0
4
[5:12661] [[5908,0],1] odls:default:fork binding child [[5908,1],1] to slot_list 0
5

但这里是编译的延迟程序:

[hamiltont@4 latency]$ mpirun --report-bindings --hostfile hostfile --rankfile rankfile -np 2 latency 
[4:16543] [[5989,0],0] odls:default:fork binding child [[5989,1],0] to slot_list 0
[5:12582] [[5989,0],1] odls:default:fork binding child [[5989,1],1] to slot_list 0
[4][[5989,1],0][btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] connect() to 10.0.2.5 failed: Connection timed out (110)

我目前的猜测是我的防火墙规则有问题(例如主机名不在主机之间通信,但延迟程序可以)。

[hamiltont@4 latency]$ cat rankfile
rank 0=10.0.2.4 slot=0
rank 1=10.0.2.5 slot=0
[hamiltont@4 latency]$ cat hostfile 
10.0.2.4 slots=2
10.0.2.5 slots=2
4

1 回答 1

13

运行 Open MPI 作业涉及两种通信。首先必须启动作业。Open MPI 使用一个特殊的框架来支持多种启动,您可能正在使用rsh通过 SSH 的远程登录启动机制。显然,您的防火墙已正确设置为允许 SSH 连接。

当启动 Open MPI 作业并且进程是真正的 MPI 程序时,它们会连接回mpirun生成作业的进程并了解作业中的所有其他进程,最重要的是每个进程的可用网络端点。这条信息:

[4][[5989,1],0][btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] connect() to 10.0.2.5 failed: Connection timed out (110)

表示在 host 上运行的进程4无法打开与在 host 上运行的进程的 TCP 连接5。最常见的原因是防火墙的存在,它限制了入站连接。所以检查你的防火墙是第一件事。

另一个常见原因是,如果在两个节点上都配置了额外的网络接口,并且具有兼容的网络地址,但无法在它们之间建立连接。这通常发生在较新的 Linux 设置上,默认情况下会启动各种虚拟和/或隧道接口。btl_tcp_if_exclude可以通过在MCA 参数中列出这些接口(作为接口名称或 CIDR 网络地址)来指示 Open MPI 跳过这些接口,例如:

$ mpirun --mca btl_tcp_if_exclude "127.0.0.1/8,tun0" ...

(如果设置总是必须添加环回接口btl_tcp_if_exclude

btl_tcp_if_include或者可以通过在MCA 参数中列出它们来明确指定用于通信的接口:

$ mpirun --mca btl_tcp_if_include eth0 ...

由于错误消息中的 IP 地址与主机文件中的第二个主机的地址匹配,因此问题一定来自活动的防火墙规则。

于 2013-02-25T18:21:54.403 回答