如何在 linux HPC 集群上发现高性能网络接口?

How to discover the high-performance network interface on a linux HPC cluster?

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

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

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

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

Q : What is the most portable way to discover the name of the high-performance network interface on a linux HPC cluster?

这似乎处于灰色地带 - 试图解决站点特定硬件之间的多方面问题 (技术) 接口命名及其 -技术,管理维护薄弱,首选使用方式。


现状:

ZeroMQ 可以(根据 RFC 37/ZMTP v3.0+)指定 <hardware(interface)>:<port>/<service> 详细信息:

zmq_bind (server_socket, "tcp://eth0:6000/system/name-service/test");

And:

zmq_connect (client_socket, "tcp://192.168.55.212:6000/system/name-service/test");

据我所知,在 HPC 站点及其硬件配置的整体上下文中,还没有办法对这种接口的主要用途进行逆向工程。


在我看来,您的想法是先通过 MPI 工具预先测试管理映射,然后让 ZeroMQ 部署使用这些外部检测到的(如果确实是自动检测到的,正如您上面假设的那样)配置详细信息以获得适当的(首选) ) 接口使用。

安全的方法:

询问 HPC 基础设施支持团队(他们负责了解上述所有内容并受过培训以帮助科学团队以最高效的方式使用 HPC)将是我的首选方式。


免责声明:

抱歉,如果这不能帮助您阅读和自动检测所有需要的配置详细信息(我想,通用的 BlackBox-HPC-生态系统检测和自动配置策略几乎不是一个简单的单行程序, 不是吗?)

没有简单的方法,我怀疑是否存在完整的解决方案。例如,Open MPI 附带了一组广泛的排名网络通信模块,并尝试实例化所有这些模块,select 最后选择排名最高的模块。这个想法是等级以某种方式反映了底层网络的速度,如果给定的网络类型不存在,其模块将无法实例化,因此面对同时具有以太网和 InfiniBand 的系统,它将选择 InfiniBand 作为其模块具有更高的优先级。这就是为什么较大的 Open MPI 作业启动相对较慢并且绝对不是万无一失的原因 - 在某些情况下必须进行干预并手动 select 正确的模块,特别是如果节点具有多个 InfiniBand HCA 网络接口而不是所有它们提供节点到节点的连接。这通常由系统管理员或供应商在系统范围内配置,这就是 MPI "just works" 的原因(专业提示:在极少数情况下它实际上没有)。

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

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