如何配置GCE允许MPI通信?实例组mpirun执行挂起问题排查
嗨,看起来你在GCE上跑MPI集群的时候遇到了挂起的问题——我之前也碰到过类似的情况,大概率是网络防火墙没放行MPI所需的通信端口,或者实例间的SSH无密码登录配置不到位(毕竟MPI依赖SSH在节点间建立连接)。咱们一步步来排查和解决:
解决GCE MPI通信挂起的配置步骤
1. 先搞定实例间的无密码SSH登录
MPI在启动时会通过SSH连接各个节点,如果没有配置免密登录,mpirun会悄悄卡在等待密码输入的步骤(看起来就是挂起)。
- 在主节点生成SSH密钥对(一路回车就行,不要设置密码):
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" - 把公钥复制到所有实例的授权列表里:
# 循环读取host_file里的所有内部IP,批量复制公钥 for ip in $(cat host_file); do ssh-copy-id -i ~/.ssh/id_rsa.pub $ip done - 测试下免密登录是否生效:随便挑一个实例IP,执行
ssh <实例内部IP> hostname,如果直接返回主机名不用输密码,这一步就没问题了。
2. 配置GCE防火墙规则放行MPI通信
你勾选的「允许HTTP/HTTPS流量」只开放了80和443端口,但MPI需要用到SSH端口(22),还有动态的TCP/UDP端口(不同MPI实现略有差异,比如OpenMPI默认会用1024-65535范围内的端口)。
用控制台创建防火墙规则
- 登录GCE控制台,进入「VPC网络 > 防火墙」页面,点击「创建防火墙规则」。
- 填写规则信息:
- 名称:比如
allow-mpi-cluster-traffic - 网络:选择你的实例所在的VPC网络
- 方向:入站(ingress)
- 目标:选择「实例组」,然后选中你的8实例组
- 源IP范围:填写实例组所在子网的CIDR(比如
10.0.0.0/24,可以在「VPC网络 > 子网」页面查看) - 协议和端口:
- 勾选TCP,填写
22, 1024-65535 - 勾选UDP,填写
1024-65535 - 可选:勾选ICMP,方便节点间连通性测试
- 勾选TCP,填写
- 名称:比如
- 点击「创建」完成配置。
用CLI快速创建(如果习惯命令行)
gcloud compute firewall-rules create allow-mpi-cluster-traffic \ --network=your-vpc-name \ # 替换成你的VPC名称 --direction=INGRESS \ --target-tags=your-instance-group-tag \ # 如果实例组有标签的话,没有就删掉这行,用下面的source-ranges --source-ranges=10.0.0.0/24 \ # 替换成你的子网CIDR --allow=tcp:22,tcp:1024-65535,udp:1024-65535,icmp
3. 验证配置是否生效
先测试节点间的连通性:
# 在主节点ping所有实例的内部IP,确保都能通 for ip in $(cat host_file); do ping -c 3 $ip done
如果ping都正常,再重新执行你的MPI命令:
mpirun -n 8 --hostfile host_file hostname
这时候应该能正常返回所有实例的主机名了。
4. 可选:缩小防火墙端口范围(更安全)
如果你用的是OpenMPI,可以通过环境变量指定固定的端口范围,避免开放整个1024-65535段:
# 在主节点设置环境变量,也可以写到~/.bashrc里永久生效 export OMPI_MCA_btl_tcp_port_min=10000 export OMPI_MCA_btl_tcp_port_max=11000
然后把防火墙规则里的端口范围改成10000-11000即可,这样更安全。
内容的提问来源于stack exchange,提问作者Shibli
相关产品推荐
相关产品推荐

