MPI选择错误的网卡/网段的解决方案
2017-02-16 13:52
1031 查看
问题及原因
在多网卡的情况下,有时候使用多个服务器作为MPI节点时会出现:1. MPI_Recv之类的读函数读不到任何数据,
2. 或 MPI崩溃并提示无法connect to XXXX,这个XXXX多半是某个配属在其他网段的IP地址。
这是因为:
MPI默认选择了一个错误的网段尝试进行多机通讯,导致程序交互的失败。
例如:
某台机器的网络配置如下:
lo 127.0.0.1 eth0 192.168.0.2/24 eth1 10.11.13.14/24
其中eth0为内网IP地址,也是各个服务器间通讯时希望使用的网卡。eth1为一个公网IP地址,用于远程登录之类任务。假设内网中有两台这样的服务器a和b,内网IP分别为:192.168.0.11和192.168.0.22,并且都已经写入了各自的host文件。
当使用:
mpirun -n 2 --host a,b program.exe在机器a和机器b上同时启动MPI程序program.exe时,MPI系统可能会默认选择eth1网络,试图在10.11.13.14/24网络上寻找另一方,结果自然运行失败。
解决方法
在启动MPI时明确指明要使用的网卡或网段。OpenMPI
详细说明请参见 https://www.open-mpi.org/faq/?category=tcp#tcp-selection 。默认网卡选择方式
默认情况下,OpenMPI会尝试选择使用所有启动的网络设备(自环虚拟设备lo/loopback除外),但是能不能选对就不能保证了。显式指定方法
使用btl_tcp_if_include或
btl_tcp_if_exclude选项启动MPI,来制定使用的或排除的网络设备。
例如
# This says to not use the eth0 and lo interfaces. # (and implicitly use all the rest) Per the description # above, IP loopback and all local-only devices *must* # be included if the exclude list is specified. shell$ mpirun --mca btl_tcp_if_exclude lo,eth0 ... # This says to only use the eth1 and eth2 interfaces # (and implicitly ignore the rest) shell$ mpirun --mca btl_tcp_if_include eth1,eth2 ...
OpenMPI 1.5 开始,上述选项支持使用IP地址而不是设备名称来作为参数,例如:
# Only use the 192.168.1.0/24 and 10.10.0.0/16 subnets for MPI # communications: shell$ mpirun --mca btl_tcp_if_include 192.168.1.0/24,10.10.0.0/16 ...
MPICH/MPICH2
有很多基于MPICH开发的其他MPI实现,例如:的MSMPI,他们的基本特点都是一致的。详细说明请参见: https://www.mpich.org/static/downloads/1.2.1p1/mpich2-1.2.1p1-README.txt 的IX. Environment Variables 部分。
默认网卡选择方式
MPICH默认会选择本机hostname所在的网段对应的网卡(由gethostbyname函数获取)。
显式指定方法
使用环境变量MPICH_INTERFACE_HOSTNAME,将之设置为所需要的网段的一个IP地址,通常是自己的IP地址。
通常也可以使用-env选项,直接在mpirun命令中设置它,例如:
mpiexec -np 1 -env MPICH_INTERFACE_HOSTNAME 192.168.0.11 program.exe
另外,也可以只用诸如
MPICH_INTERFACE_HOSTNAME_R0、
MPICH_INTERFACE_HOSTNAME_R1、
MPICH_INTERFACE_HOSTNAME_R2的方式为每一个rank制定一个网卡。
相关文章推荐
- 安装ESXI 5.5卡在LSI_MR3.V00解决方案以及 选择合适网卡驱动方案
- vs2010打不开vs2017的.sln文件,出现错误提示 “选择的文件是解决方案文件 但是用此应用程序的较新版本创建的,无法打开”
- [必需更多语法分析时,到达内容结束:标记嵌套错误?]:org.apache.jasper.compiler.ParseException: 异常解决方案
- DataGrid常见解决方案(三)--在DataGrid中选择,确认,删除多行复选框列表
- SQLServer2000发生错误1069(由于登陆失败而无法启动服务)的解决方案
- asp.net应用程序错误解决方案
- IIS常见问题和错误及其解决方案
- Oracle新手最常碰到的6个错误及解决方案
- 莫名其妙的PostBack错误和一个似是而非的解决方案
- 完成端口中WSAENOBUFS错误的解决方案
- 莫名其妙的配置错误之解决方案!!!(终于解决了)
- 调用命令行生成Visuial Studio.NET项目、解决方案(选择自 tonybaobao 的 Blog)
- 运行petshop时,点击某一项时出现一堆“?”的错误页面及提示“计算机名/ASPNET没有权限”的解决方案
- IIS常见问题和错误及其解决方案
- SQL Server2000安装提示数据源配置错误解决方案
- 水晶报表在导出的时候常见的错误及解决方案汇总(从CO的KB里收集的)
- SQLServer2000发生错误1069(由于登陆失败而无法启动服务)的解决方案
- Oracle新手最常碰到的6个错误及解决方案--转载--数据库开发学习
- 最近使用asp.net时遇到 "运行时错误" 解决方案