首页 > 解决方案 > 如何发现 linux HPC 集群上的高性能网络接口?

问题描述

我有一个分布式程序,它与在 HPC 集群上运行的 ZeroMQ 进行通信。

ZeroMQ 使用 TCP 套接字,因此默认情况下,在 HPC 集群上,通信将使用管理网络,因此我引入了一个由我的代码读取的环境变量,以强制在特定网络接口上进行通信。对于 Infiniband (IB),通常是 ib0。但是在某些情况下,并行文件系统使用另一个 IB 接口,或者在 Cray 系统上,该接口是 ipogif,在某些非 HPC 系统上,它可以是 eth1、eno1、p4p2、em2、enp96s0f0 或其他任何...

问题是我需要向集群管理员询问要使用的网络接口的名称,而使用 MPI 的代码不需要,因为 MPI“知道”要使用哪个网络。

在 linux HPC 集群上发现高性能网络接口名称的最便携方法是什么?(如果没有简单的方法,我不介意为此编写一个小型 MPI 程序)

标签: network-programmingmpizeromqhpc

解决方案


没有简单的方法,我怀疑是否存在完整的解决方案。例如,Open MPI 带有一组广泛的排名网络通信模块,并尝试实例化所有这些模块,最终选择排名最高的一个。这个想法是排名以某种方式反映了底层网络的速度,如果给定的网络类型不存在,其模块将无法实例化,因此面对同时具有以太网和 InfiniBand 的系统,它将选择 InfiniBand 作为其模块具有更高的优先级。这就是为什么较大的 Open MPI 作业启动相对较慢并且绝对不是万无一失的原因——在某些情况下,必须进行干预并手动选择正确的模块,特别是如果节点具有 InfiniBand HCA 的多个网络接口并且并非所有这些网络接口都提供节点——到节点的连接。

您可以复制 Open MPI 采用的方法,并为您的程序开发一组检测模块。对于 TCP,在不同节点上生成两个或多个副本,列出它们的活动网络接口和相应的 IP 地址,匹配网络地址并绑定一个节点上的所有接口,然后尝试从其他节点连接到它。成功连接后,运行类似 TCP 版本的NetPIPE来测量网络速度和延迟并选择最快的网络。一旦您从最初的一小组节点中获得了这些信息,很可能所有其他节点也使用相同的接口,因为大多数 HPC 系统在其节点的网络配置方面都尽可能同质化。

如果安装了有效的 MPI 实现,您可以使用它来启动测试程序。您还可以在 MPI 库中启用调试日志记录并解析输出,但这需要目标系统具有日志解析器支持的 MPI 实现。此外,大多数 MPI 库使用本机 InfiniBand 或任何高速网络 API,并且不会告诉您哪个是 IP-over-whatever 接口,因为它们根本不会使用它(除非系统管理员另有配置) .


推荐阅读